首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >试图从Twitter中的get请求中获取ResponseText

试图从Twitter中的get请求中获取ResponseText
EN

Stack Overflow用户
提问于 2020-06-19 02:20:24
回答 1查看 1.1K关注 0票数 8

我正在努力提高我对VBA的了解,学习GET、POST等方面的知识,因为我已经看到了许多例子,但无法理解我做错了什么。可能是奥奥斯的那部分。

主要的问题是我只是个优秀的人。我不是web开发人员,所以我的知识几乎是空的,而且可能我错过了很多基本的东西。

我希望这个问题不要太广泛。

背景:--我正在尝试从tweet中获取JSON对象的ResponseText。信息是公开的,您不需要登录查看我想获取的信息,也不需要使用Twitter帐户。

为了进行测试,我使用了以下tweet:https://twitter.com/StackOverflow/status/1273391252357201922

我想要的:用开发工具检查代码(我正在使用火狐),我看到了以下内容:

这个GET请求返回这个ResponseText:

所以我想让ResponseText进入VBA。

MY代码:在这里检查不同的代码--因此,我构建了以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sub test()
    Dim MiHttp As Object
    Dim MiUrl As String
    Set MiHttp = CreateObject("MSXML2.XMLHTTP")
    
    MiUrl = "https://api.twitter.com/2/timeline/conversation/1273391252357201922.json?include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&skip_status=1&cards_platform=Web-12&include_cards=1&include_ext_alt_text=true&include_reply_count=1&tweet_mode=extended&include_entities=true&include_user_entities=true&include_ext_media_color=true&include_ext_media_availability=true&send_error_codes=true&simple_quoted_tweet=true&count=20&ext=mediaStats%2ChighlightedLabel&include_quote_count=true"
    
    With MiHttp
        .Open "GET", MiUrl
        .Send
        DoEvents
     
        Debug.Print .responseText
    End With


    MiHttp.abort
    Set MiHttp = Nothing
End Sub

它运行,没有编码错误,但我知道:

{"errors":[{"code":200,"message":"Forbidden."}]}

因此,我尝试用Authoritation添加RequestHeaders:

.Send之前添加这一行代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.setRequestHeader "authorization", "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"

然后我在调试器中得到了这样的信息:{"errors":[{"message":"Rate limit exceeded","code":88}]}

因此,查看Twitter库的开发人员寻找更多的东西和标记,我必须承认,我被淹没了。

About Bearer

About Tokens

现在我迷路了。我认为这会很容易,因为这是公开信息,每个人都可以从任何推特上手动获取,不用任何应用程序或在Twitter上登录,但看起来我错了,我有点迷路了。

最后一个问题:我想知道我是否可以以任何方式获得令牌,然后将它应用到我的代码中,以获得JSON responseText (处理JSON并了解它们将是一个完全不同的问题,超出了这里的范围)。

我想用VBA实现这一点,没有其他的应用程序或语言,因为我不知道。

事实上,我甚至对全文都不感兴趣,只对被红线包围的部分感兴趣。

寻求帮助,向导,灯光。

谢谢,我希望这个问题不要太宽泛。

谢谢!

更新: Tested @ChristosLytras的答案。我知道这个错误:

2020年7月更新:现在的工作网址是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://api.twitter.com/2/timeline/conversation/1273391252357201922.json?include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&skip_status=1&cards_platform=Web-12&include_cards=1&include_ext_alt_text=true&include_reply_count=1&tweet_mode=extended&include_entities=true&include_user_entities=true&include_ext_media_color=true&include_ext_media_availability=true&send_error_codes=true&simple_quoted_tweet=true&count=20&ext=mediaStats%2ChighlightedLabel&include_quote_count=true
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-23 10:09:16

您必须在请求头中传递一个有效的获取的Guest令牌以及授权Bearer,然后您将得到响应。twitter公共API持有者永远不会改变。

为了为每个请求获得一个新的、有效的来宾令牌,您可以使用WinHttp.WinHttpRequest.5.1而不是MSXML2.XMLHTTP发出一个gt请求,并使用像gt=(\d+);这样的正则表达式读取gt cookie。它将在每次调用cookie头时获取它。您不能使用MSXML2.XMLHTTP,因为它使用缓存,而且每次请求HEAD时都不会获得新的来宾令牌。

使用Excel 2013和VBA 7.1测试工作代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dim MiHttp As Object
Dim GuestTokenRE As Object
Dim MiUrl As String

Set MiHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
Set GuestTokenRE = CreateObject("VBScript.RegExp")

MiUrl = "https://api.twitter.com/2/timeline/conversation/1273391252357201922.json?include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&skip_status=1&cards_platform=Web-12&include_cards=1&include_ext_alt_text=true&include_reply_count=1&tweet_mode=extended&include_entities=true&include_user_entities=true&include_ext_media_color=true&include_ext_media_availability=true&send_error_codes=true&simple_quoted_tweet=true&count=20&ext=mediaStats%2ChighlightedLabel&include_quote_count=true"

With MiHttp
    ' Make a HEAD request with no cache to get the Guest Token cookie
    .Open "HEAD", "https://twitter.com", False
    .setRequestHeader "User-Agent", "Firefox"
    .setRequestHeader "Pragma", "no-cache"
    .setRequestHeader "Cache-Control", "no-cache"
    .Send

    DoEvents
    
    ' Use a regular expression to extract guest token from response headers
    GuestTokenRE.Pattern = "Set-Cookie: gt=(\d+);"
    GuestTokenRE.IgnoreCase = True
    
    Dim matches as Object
    Set matches = GuestTokenRE.Execute(.getAllResponseHeaders())
    
    If matches.Count = 1 Then
        Dim guestToken As String
        guestToken = matches.Item(0).Submatches.Item(0)
        
        ' Print the Guest Token for validation
        Debug.Print "Got Guest Token", guestToken
        
        ' Now we have a valid guest token, make the request
        .Open "GET", MiUrl, False
        ' Authorization Bearer is always the same
        .setRequestHeader "authorization", "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
        .setRequestHeader "x-guest-token", guestToken
        .Send
        DoEvents
    
        Debug.Print "Got response", .responseText
    Else
        Debug.Print "Could not fetch Guest Token"
    End If

End With

MiHttp.abort

Set MiHttp = Nothing
Set GuestTokenRE = Nothing

关于80072efe误差

你得让WinHttp.WinHttpRequest.5.1去工作。80072efe错误指示连接异常终止,您可以阅读更多关于它的here。我没有这样的问题,所以这些错误不是起源于端点。

正在运行的代码的屏幕截图

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62468126

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文