使用VB.NET为Twitter API创建webrequest POST

时间:2012-02-20 11:46:44

标签: vb.net twitter twitter-oauth

有很多与Twitter API相关的帖子,但似乎都没有直接回答我的问题。

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

我很确定我需要将webrequest发送到:“https://api.twitter.com/1/statuses/update.json”(不完全清楚)

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

我不需要状态更新或来自Twitter的任何信息。只需发布“Hello World!”首先,我可以从那里开始。

我被迫使用VB.NET。我正在使用Visual Studio Web Developer 2010。

现在,所有人都说,我在这里查看了Nikolas Tarzia的C-Sharp代码的VB.NET端口: http://oauth.googlecode.com/svn/code/vbnet/oAuth.vb

我可以通过查看它们大致看到这些功能的作用,但不知道我需要调用哪些来创建web响应并发送到Twitter!另外我相信这段代码包含的不仅仅是我需要的。如果我只是想创建一个POST,那么我可能只需要哈希函数和nonce函数以及我的令牌和密钥。是对的吗?如果是这样,有人可以帮我缩小范围吗?在这个过程中,帮助我更好地理解正确形成的webrequest需要发送到Twitter以进行快速推文?

谢谢,

威尔

PS - 我最后根据OAuth文档,在VB中使用POST请求的简洁代码示例以及Twitter Developer区域OAuth工具为请求生成一些基本字符串,总结了一些代码。不幸的是,虽然它编译并运行正常,但我没有收到推文。有人可以查看代码,看看他们是否能发现任何明显的问题?显然我用“xxxxx”替换了我的令牌和消费者密钥。我想要的圣诞节就是运行这个代码,并在我的Twitter帐户上快速发推文! ;)

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

1 个答案:

答案 0 :(得分:4)

我已经使用API​​1.1在twitter上发布了这个课程。 它期望构造函数中的oauth令牌,oauth令牌秘密,oauth“consumer”键(这意味着API密钥)和oauth consumer secret(这意味着API秘密)。如果您要在自己的帐户中发布,这四个值将位于https://apps.twitter.com/中应用程序的API密钥标签中。如果您想在访问者帐户上发帖,则必须创建一些额外的代码,将其重定向到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