我正在努力提高我对VBA的了解,学习GET、POST等方面的知识,因为我已经看到了许多例子,但无法理解我做错了什么。可能是奥奥斯的那部分。
主要的问题是我只是个优秀的人。我不是web开发人员,所以我的知识几乎是空的,而且可能我错过了很多基本的东西。
我希望这个问题不要太广泛。
背景:--我正在尝试从tweet中获取JSON对象的ResponseText。信息是公开的,您不需要登录查看我想获取的信息,也不需要使用Twitter帐户。
为了进行测试,我使用了以下tweet:https://twitter.com/StackOverflow/status/1273391252357201922
我想要的:用开发工具检查代码(我正在使用火狐),我看到了以下内容:
这个GET请求返回这个ResponseText:
所以我想让ResponseText进入VBA。
MY代码:在这里检查不同的代码--因此,我构建了以下内容:
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
之前添加这一行代码
.setRequestHeader "authorization", "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
然后我在调试器中得到了这样的信息:{"errors":[{"message":"Rate limit exceeded","code":88}]}
因此,查看Twitter库的开发人员寻找更多的东西和标记,我必须承认,我被淹没了。
现在我迷路了。我认为这会很容易,因为这是公开信息,每个人都可以从任何推特上手动获取,不用任何应用程序或在Twitter上登录,但看起来我错了,我有点迷路了。
最后一个问题:我想知道我是否可以以任何方式获得令牌,然后将它应用到我的代码中,以获得JSON responseText (处理JSON并了解它们将是一个完全不同的问题,超出了这里的范围)。
我想用VBA实现这一点,没有其他的应用程序或语言,因为我不知道。
事实上,我甚至对全文都不感兴趣,只对被红线包围的部分感兴趣。
寻求帮助,向导,灯光。
谢谢,我希望这个问题不要太宽泛。
谢谢!
更新: Tested @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
发布于 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测试工作代码
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。我没有这样的问题,所以这些错误不是起源于端点。
正在运行的代码的屏幕截图
https://stackoverflow.com/questions/62468126
复制相似问题