我正在尝试按照此示例访问 Twitter Stream API (userstream),因此我需要进行一些修改,这是我的最终代码:
'We need to define some details about the request. This includes a unique oauth_nonce parameter which must be generated per request, and a timestamp
Dim oauth_version As String = "1.0"
Dim oauth_signature_method As String = "HMAC-SHA1"
Dim oauth_nonce As String = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
Dim TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
Dim oauth_timestamp As Integer = Convert.ToInt64(TimeSpan.TotalSeconds).ToString()
'The next step is to generate an encrypted oAuth signature which Twitter will use to validate the request.
'To do this, all of the request data is concatenated into a particular format as follows
Dim baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" & _
"&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}"
Dim baseString As String = String.Format(baseFormat, _
oauth_consumer_key, _
oauth_nonce, _
oauth_signature_method, _
oauth_timestamp, _
oauth_token, _
oauth_version)
'baseString = String.Concat("GET&", Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
'baseString = String.Concat(Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
baseString = Uri.EscapeDataString(stream_url)
'Using this base string, we then encrypt the data using a composite of the secret keys and the HMAC-SHA1 algorithm.
Dim compositeKey As String = String.Concat(Uri.EscapeDataString(oauth_consumer_secret), "&", Uri.EscapeDataString(oauth_token_secret))
Dim oauth_signature As String
Dim hasher As HMACSHA1 = New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))
Using hasher
oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)))
End Using
'The oAuth signature is then used to generate the Authentication header.
'This requires concatenating the public keys and the token generated above into the following format
Dim headerFormat As String = "OAuth oauth_nonce=""{0}"", oauth_signature_method=""{1}"", " & _
"oauth_timestamp=""{2}"", oauth_consumer_key=""{3}"", " & _
"oauth_token=""{4}"", oauth_signature=""{5}"", " & _
"oauth_version=""{6}"""
Dim authHeader As String = String.Format(headerFormat, _
Uri.EscapeDataString(oauth_nonce), _
Uri.EscapeDataString(oauth_signature_method), _
Uri.EscapeDataString(oauth_timestamp), _
Uri.EscapeDataString(oauth_consumer_key), _
Uri.EscapeDataString(oauth_token), _
Uri.EscapeDataString(oauth_signature), _
Uri.EscapeDataString(oauth_version))
'We are now ready to send the request, which is the easy part.
'Note, we must also disable the Expect: 100-Continue header using the ServicePointManager.
'Without this code, .NET sends the header by default, which is not supported by Twitter
Dim req As WebRequest
Dim res As HttpWebResponse
Dim streamReader As StreamReader
Dim wait As Integer = 250
Dim jsonRes As String = ""
Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")
ServicePointManager.Expect100Continue = False
req = WebRequest.Create(stream_url)
req.Headers.Add("Authorization", authHeader)
res = DirectCast(req.GetResponse(), HttpWebResponse)
streamReader = New StreamReader(res.GetResponseStream(), encode)
While True
jsonRes = streamReader.ReadLine()
'Success
wait = 250
End While
'Abort is needed or responseStream.Close() will hang
req.Abort()
streamReader.Close()
streamReader = Nothing
res.Close()
res = Nothing
在这一行:res = DirectCast(req.GetResponse(), HttpWebResponse)我得到一个401 - Unauthorized,我想问题可能出在我准备 OAuth 签名的那一行,原来使用的是 POST,我需要 GET,所以我更改了它并尝试了以下 3 种替代方法:
'baseString = String.Concat("GET&", Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
'baseString = String.Concat(Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
baseString = Uri.EscapeDataString(stream_url)
你能帮我让 Twitter OAuth 在 VB.NET 中工作吗?
目前,Twitterizer 不是一个选项,因为它仅适用于 Visual Studio 2010,而 TwitterVB2.dll 仅适用于 REST API,而不适用于流 API,我不知道是否还有其他第三方库,但此时我会更喜欢用我自己的代码来解决(那里有太多未维护和不完整的库)。
谢谢