Создание веб-запроса POST для Twitter API с использованием VB.NET - PullRequest
1 голос
/ 20 февраля 2012

Существует довольно много сообщений, связанных с API Twitter, но, похоже, никто не отвечает на мои вопросы напрямую.

Я знаю, как отправить запрос HttpWebRequest как POST.

Я вполне уверен, что мне нужно отправить веб-запрос на: "https://api.twitter.com/1/statuses/update.json" (не совсем ясно)

Я знаю, что есть много библиотек, которые все, что вам нужно сделать, это передать свои потребительские ключи и ключи токенов. Однако мне нужно создать очень короткий код в функции, которая просто отправляет жестко закодированную строку в Twitter. Когда я получу эту работу, жестко закодированная строка будет заменена переменной.

Мне не нужно обновлять статус или какую-либо информацию из Twitter. Просто ПОСТ "Hello World!" для начала, и я могу идти оттуда.

Я вынужден использовать VB.NET. Я использую Visual Studio Web Developer 2010.

Теперь, после всего сказанного, я посмотрел на порт C-Sharp Николаса Тарсии с кодом C-Sharp: http://oauth.googlecode.com/svn/code/vbnet/oAuth.vb

Я могу примерно увидеть, что делают функции, посмотрев на них, но понятия не имею, какие из них мне нужно вызвать, чтобы создать веб-ответ и отправить в Twitter! Также я считаю, что этот код содержит больше, чем мне нужно. Если я просто хочу создать POST, то, скорее всего, мне понадобится только хэш-функция и функция nonce, а также мои токены и ключи. Это правильно? Если так, может кто-нибудь помочь мне сузить это? В процессе, помогая мне немного лучше понять, какой правильно сформированный веб-запрос нужно отправить в Twitter, чтобы сделать быстрый твит?

Спасибо

Будет

PS. Наконец-то я собрал некоторый код, основанный на просмотре документации OAuth, небольшом небольшом примере кода по использованию запроса POST в VB и инструменте OAuth в области Twitter для разработчиков, чтобы сгенерировать некоторую базовую строку для запроса. К сожалению, пока он компилируется и работает нормально, я не получаю твит. Может ли кто-нибудь взглянуть на код и увидеть, могут ли они обнаружить какие-либо явные проблемы? Очевидно, я заменил свои токены и потребительские ключи на «ххххх». Все, что я хочу на Рождество, - это запустить этот код и сделать быстрый твит на моем аккаунте в 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 Ответ

4 голосов
/ 22 сентября 2014

Я создал этот класс для публикации в твиттере, используя API1.1.Он ожидает в конструкторе oauth-токен, oauth-токен-секрет, oauth-ключ «потребителя» (это означает ключ API) и oauth-потребительский секрет (это означает API-секрет).Если вы хотите разместить в своей учетной записи, эти четыре значения будут на вкладке API-ключей вашего приложения в https://apps.twitter.com/. Если вы хотите разместить в своей учетной записи посетителей, вам придется создать дополнительный код для перенаправленияих в твиттер для входа и получения токена доступа.

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
...