2012-02-20 32 views
1

有相当多的Twitter API相关帖子,但没有一个可以直接回答我的问题。使用VB.NET为Twitter API创建webrequest POST

我知道如何发送一个HttpWebRequest作为POST。

我相当肯定,我需要的的WebRequest发送到:“https://api.twitter.com/1/statuses/update.json”(不完全清楚)

我知道有许多图书馆在那里,你所要做的就是传递消费者密钥和令牌密钥。但是,我需要在函数中创建一些非常短的代码,这个代码简单地向Twitter发布硬编码字符串。当我得到这个工作时,硬编码字符串将被变量替换。

我不需要状态更新或来自Twitter的任何类型的信息。只需发布“Hello World!”首先,我可以从那里开始。我不得不使用VB.NET。我使用Visual Studio的Web开发2010

现在,所有的说,我已经看过的C-夏普代码在这里尼古拉Tarzia的VB.NET端口: http://oauth.googlecode.com/svn/code/vbnet/oAuth.vb

我可以看到大概什么功能做通过看他们,但不知道哪些我需要调用创建一个webresponse并发送到Twitter!此外,我相信这个代码包含比我需要的更多。如果我只是想创建一个POST,那么可能我只需要散列函数和nonce函数以及我的令牌和密钥。是对的吗?如果是这样,有人可以帮我缩小这个范围吗?在这个过程中,帮助我更好地理解webrequest需要发送到Twitter才能快速发送Tweet?

感谢,

威尔

PS - 我终于凑齐了一些代码的基础上,望着OAuth的文件,在VB中使用POST请求一个整洁的小代码示例,以及Twitter的开发者区域的OAuth工具为请求生成一些基本字符串。不幸的是,虽然它编译和运行没问题,但我没有收到推文。有人可以看看代码,看看他们是否可以发现任何明显的问题?很明显,我用“xxxxx”替换了我的令牌和消费者密钥。我只想在圣诞节期间运行此代码,并在我的Twitter帐户上快速发送Tweet! ;)

Public Shared Function Tweet(strText As String) As Boolean 
     Dim boolResult As Boolean = False 
     Dim urlAddress As Uri = New Uri("https://api.twitter.com/1/statuses/update.json") 
     Dim strData As StringBuilder 
     Dim byteData() As Byte 
     Dim postStream As Stream = Nothing 

     Dim strConsumerKey As String = "xxxxxx" 
     Dim strConsumerSecret As String = "xxxxxx" 
     Dim strAccessToken As String = "xxxxxx" 
     Dim strAccessTokenSecret As String = "xxxxxx" 

     Dim objRequest As HttpWebRequest 
     Dim objResponse As HttpWebResponse = Nothing 
     Dim objReader As StreamReader 
     Dim objHeader As HttpRequestHeader = HttpRequestHeader.Authorization 

     Try 
      objRequest = DirectCast(WebRequest.Create(urlAddress), HttpWebRequest) 

      objRequest.Method = "POST" 
      objRequest.ContentType = "application/x-www-form-urlencoded" 

      strData = New StringBuilder() 
      strData.Append("&Hello_World%2521%3D%26oauth_consumer_key%3D" + strConsumerKey + "%26oauth_nonce%3Dda6bb8ce7e48547692f4854833afa680%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1329746260%26oauth_token%3D" + strAccessToken + "%26oauth_version%3D1.0") 
      objRequest.Headers.Add(objHeader, "Authorization: OAuth oauth_consumer_key=""xxxx"", oauth_nonce=""da6bb8ce7e48547692f4854833afa680"", oauth_signature=""xxxx"", oauth_signature_method=""HMAC-SHA1"", oauth_timestamp=""1329750426"", oauth_token=""xxxx"", oauth_version=""1.0""") 



      ' Create a byte array of the data we want to send 
      byteData = UTF8Encoding.UTF8.GetBytes(strData.ToString()) 

      ' Set the content length in the request headers 
      objRequest.ContentLength = byteData.Length 

      Try 
       postStream = objRequest.GetRequestStream() 
       postStream.Write(byteData, 0, byteData.Length) 
      Finally 
       If Not postStream Is Nothing Then postStream.Close() 
      End Try 

      boolResult = True 
     Catch ex As Exception 
      boolResult = False 
      HttpContext.Current.Session.Add("Error", ex.ToString()) 
     End Try 

     Try 
      ' Get response 
      objResponse = DirectCast(objRequest.GetResponse(), HttpWebResponse) 

      ' Get the response stream into a reader 
      objReader = New StreamReader(objResponse.GetResponseStream()) 

      ' Console application output 
      Console.WriteLine(objReader.ReadToEnd()) 
     Finally 
      If Not objResponse Is Nothing Then objResponse.Close() 
     End Try 

     Return boolResult 
    End Function 
+0

如果使用的是尼古拉斯·Tarzia代码会工作,我会很感激,作为响应/应答。我在dev.twitter.com上使用OAuth构建工具来创建上面的请求字符串,这可能是问题所在。 Tarzia代码确实创建了一个基本字符串。我将在这里尝试用下一个来代替回答。提前致谢。 :) – WillShakes 2012-02-20 15:15:26

+0

好吧 - 我发现了一些C#代码,看起来完全符合我的要求,但是当我使用VB时,必须先进行移植并将其移植。请参阅我的移植代码和评论:[Code Project](http://www.codeproject.com/Articles/247336/Twitter-OAuth-authentication-using-Net?msg = 4162685#xx4162685xx) – WillShakes 2012-02-21 10:02:52

+0

只是为了澄清,我认为我几乎在那里 - 我从远程服务器(twitter)得到401未经授权的响应。所以试图找出问题是否与我的代码移植,或者可能在Twitter上的设置(我已设置为在我的应用程序上读/写)......任何VB大师的外面? ;) – WillShakes 2012-02-21 10:06:03

回答

3

我已经让这个类在twitter中使用API​​1.1发布。 它预计在构造函数中的oauth标记,oauth标记秘密,oauth“consumer”键(这意味着API键)和oauth消费者秘密(这意味着API秘密)。如果您想在自己的帐户中发布,则这四个值将位于您的应用程序的API密钥标签https://apps.twitter.com/中。如果你想发布你的访客帐户,你将不得不创建一些额外的代码,重定向到Twitter的登录和获取访问令牌。

Imports Microsoft.VisualBasic 
Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Web 
Imports System.Web.UI 
Imports System.Web.UI.WebControls 
Imports System.Text 
Imports System.Security.Cryptography 
Imports System.Net 
Imports System.IO 
Public Class SBTwitter 

Private oauth_token As String 
Private oauth_token_secret As String 
Private oauth_consumer_key As String 
Private oauth_consumer_secret As String 

Public Sub New(ByVal APIKey As String, ByVal APISecret As String, ByVal oauthToken As String, ByVal oauthTokenSecret As String) 
    oauth_token = oauthToken 
    oauth_token_secret = oauthTokenSecret 
    oauth_consumer_key = APIKey 
    oauth_consumer_secret = APISecret 
End Sub 

Public Function PostInTwitter(ByVal post As String) As String 
    Try 
     Dim oauth_version = "1.0" 
     Dim oauth_signature_method = "HMAC-SHA1" 
     Dim oauth_nonce = 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 = Convert.ToInt64(timeSpan.TotalSeconds).ToString() 
     Dim resource_url = "https://api.twitter.com/1.1/statuses/update.json" 
     Dim status = post 
     Dim baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" & "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}" 

     Dim baseString = String.Format(baseFormat, oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, _ 
     oauth_version, Uri.EscapeDataString(status)) 

     baseString = String.Concat("POST&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString)) 
     Dim compositeKey = String.Concat(Uri.EscapeDataString(oauth_consumer_secret), "&", Uri.EscapeDataString(oauth_token_secret)) 

     Dim oauth_signature As String 
     Using hasher As New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)) 
      oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString))) 
     End Using 
     Dim headerFormat = "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 = 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)) 
     Dim postBody = "status=" & Uri.EscapeDataString(status) 

     ServicePointManager.Expect100Continue = False 

     Dim request As HttpWebRequest = DirectCast(WebRequest.Create(resource_url), HttpWebRequest) 
     request.Headers.Add("Authorization", authHeader) 
     request.Method = "POST" 
     request.ContentType = "application/x-www-form-urlencoded" 
     Using stream As Stream = request.GetRequestStream() 
      Dim content As Byte() = ASCIIEncoding.ASCII.GetBytes(postBody) 
      stream.Write(content, 0, content.Length) 
     End Using 
     Dim response As WebResponse = request.GetResponse() 
     Return response.ToString 
    Catch ex As Exception 
     Return ex.Message 
    End Try 
End Function 
End Class