【问题标题】:Trying to get ResponseText from a GET request in Twitter尝试从 Twitter 中的 GET 请求中获取 ResponseText
【发布时间】:2020-10-09 13:57:30
【问题描述】:

我正在努力提高我的 VBA 知识,学习 GET、POST 和其他东西,因为我看过很多示例,但无法理解我做错了什么。可能是 Oauth 部分。

主要问题是我只是一个 Excel 人。我不是网络开发人员,所以我的知识几乎是零,而且可能我缺少很多基本的东西。

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

背景:我正在尝试从推文中获取 JSON 对象的 ResponseText。 信息是公开的,您无需登录即可查看我想要获取的信息,并且您不需要 Twitter 帐户。

为了测试,我使用这条推文:https://twitter.com/StackOverflow/status/1273391252357201922

我想要什么:使用开发者工具检查代码(我使用的是 Firefox),我看到了这个:

这个 GET 请求返回这个 ResponseText:

所以我想将该 ResponseText 放入 VBA。

我的代码:在这里检查不同的代码,我已经建立了这个:

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."}]}

所以我尝试添加带有授权的 RequestHeaders:

在.Send之前添加这行代码:

.setRequestHeader "authorization", "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"

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

因此查看了 Twitter 库中的开发人员正在寻找关于 Bearer 东西和令牌的信息,我必须承认我不知所措。

About Bearer

About Tokens

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

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

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

其实我对全文都不感兴趣,只对红线包围的部分感兴趣。

寻求帮助、指导、光明。

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

谢谢!

更新:测试了@ChristosLytras 的答案。我收到此错误:

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

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

【问题讨论】:

  • 您调用的端点不是记录和支持的端点。这是一个私有/内部 API。您不应该尝试使用它。如果您想要 Tweet 信息,可以使用 developer.twitter.com 上记录的官方 Twitter API - Twitter Developer Labs Tweets and Users API 中提供了这 4 个指标值。
  • @AndyPiper 感谢您的评论。这里的问题是,开发该 api 的东西可能无法用 VBA 编码,(或者至少我现在不知道如何开始)。
  • 如果你解除它必须是 VBA 的限制,那么我可以帮助你。我可以根据需要编写尽可能少的 Python,以便您可以在 VBA 中编写大部分应用程序。
  • @SMeaden 问题是我不知道如何将 htat 与 VBA 结合使用。我的意思是,如何从你那里执行那部分,然后返回我的代码。
  • 我的博客有很多调用 Python 的例子。我使用 Python 来实现一个 COM 接口。然后使用 VBA,我调用 VBA.CreateObject("Foo.bar"),然后在类中调用一个方法。像任何其他 COM 调用一样返回数据。这是一个 Python COM 网关类的示例,exceldevelopmentplatform.blogspot.com/2019/02/…

标签: excel vba twitter twitter-oauth


【解决方案1】:

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

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

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

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。我没有遇到这样的问题,所以这些错误不是源自端点。

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

【讨论】:

  • 您尝试过自己的解决方案吗?我也这样做了...响应是:{"errors":[{"code":200,"message":"Forbidden."}]} 当我将 url 更改为:https://twitter.com/StackOverflow/status/1273391252357201922 它开始工作;)
  • 感谢您的回答。但我得到了回复{"errors":[{"code":200,"message":"Forbidden."}]}
  • @MaciejLos 当然...在我添加答案之前,我什至使用 Postman 对此进行了测试,它确实有效。
  • @SMeaden 我没有Option Explicit,因为默认情况下它不适用于我在 Excel 中的 VBA 脚本。也许这是一个选择,但无论如何我已将声明添加到我的答案中。
  • @FoxfireAndBurnsAndBurns 我已经更新了答案。我没有 Excel 2019,这是我正在运行代码的带有 VBA 7.1 的 Excel 2013。它可能是一种兼容性问题,但很可能它与网络更相关。要检测令牌是否有效,请在此处查看您的第二条评论;如果令牌过期或无效,您将获得{"errors":[{"code":200,"message":"Forbidden."}]},因此,如果您收到带有errors 的响应JSON 对象并且带有code: 200 的错误,则令牌已过期。您甚至可以像这样离开它,并在每次通话时获得一个新的 Guest Token,这取决于您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2020-08-16
  • 1970-01-01
  • 2022-08-02
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多