2
OAuth認證
我試圖按照this example能夠訪問Twitter流API(userstream),所以我需要做一些修改,這是我最後的代碼:用VB.NET
'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
在這一行: 解析度= DirectCast(req.GetResponse(),HttpWebResponse)我得到一個401 - 未經授權,我想這個問題可能是在我準備的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)
你能幫我拿到VB.NET中的Twitter OAuth嗎?
目前,Twitterizer是不是一種選擇,因爲它僅與Visual Studio 2010的工作原理,並TwitterVB2.dll只與REST API的作品,而不是流式API,我不知道是否有其他 第三方庫,但在這一點上,我寧願用自己的代碼解決問題(太多的未維護和不完整的庫)。
謝謝
如果你看到這個網址第一個評論http://www.thecodeking.co.uk/2011/08/twitter-oaut h-authentication-using-net.html#comment-form .NET在編碼與Twitter不同的字符時遇到了一些問題,在這裏已經提到了堆棧溢出,但到目前爲止還沒有找到解決方案 –