2012-02-20 2 views
1

많은 Twitter API 관련 게시물이 있지만 아무도 직접 내 질문에 대답하지 않는 것 같습니다.VB.NET을 사용하여 Twitter API에 대한 webrequest POST 만들기

POST로 HttpWebRequest를 보내는 방법을 알고 있습니다. 나는 많은 라이브러리가 알고

"https://api.twitter.com/1/statuses/update.json"(완전히 명확하지) :

난에 WebRequest 클래스를 보낼 필요가 꽤 확신 당신이해야 할 일은 소비자 키와 토큰 키를 전달하는 것뿐입니다. 그러나, 나는 간단한 코드를 하드 코딩 된 문자열로 트위터에 게시하는 기능에서 매우 짧은 코드를 만들어야합니다. 하드 코딩 된 문자열이 변수로 대체됩니다.

트위터에서 상태 업데이트 또는 모든 종류의 정보를 확인할 필요가 없습니다. 그냥 POST "Hello World!" 시작하고 거기에서 갈 수 있습니다.

저는 VB.NET을 사용해야합니다. http://oauth.googlecode.com/svn/code/vbnet/oAuth.vb

내가 기능을 수행 대략 무엇을 볼 수 있습니다 나는 모두가 내가 여기에 C-샤프 코드의 니콜라스 Tarzia의 VB.NET 포트에서 보았다, 말했다, 이제 비주얼 스튜디오 웹 개발자 2010

을 사용하고 있습니다 그 (것)들을 보아서, 그러나 나가 webresponse를 창조하고 Twitter에 보내기 위하여 부를 필요가있는 무슨 아이디어가! 또한이 코드에는 필요한 것 이상이 포함되어 있다고 생각합니다. POST를 만들고 싶다면 함수와 넌 스 함수, 토큰 및 키만 해시 할 필요가 있습니다. 그게 맞습니까? 만약 그렇다면 누군가 제가 이것을 좁히도록 도와 주실 수 있습니까? 이 과정에서 좀 더 잘 이해할 수 있도록 웹 퀘스트가 제대로 작성되면 트위터로 보내야합니다.

감사합니다,

PS - 나는 마침내 함께 OAuth를 문서, VB에서 POST 요청을 사용하여에 깔끔한 작은 코드 예제를 찾고에 따라 몇 가지 코드를 넣어 트위터 개발자 지역의 OAuth 도구 요청에 대한 기본 문자열을 생성합니다. 불행히도 컴파일되고 실행되는 동안 나는 트윗을 얻지 못하고 있습니다. 누군가 코드를보고 눈부신 문제가 있는지 확인할 수 있습니까? 분명히 내 토큰과 소비자 키를 "xxxxx"로 바꿨습니다. 내가 크리스마스에 원하는 것은이 코드를 실행하고 내 트위터 계정에서 빠른 트윗을 만드는 것입니다! ;)

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

Nikolas Tarzia 코드를 사용하면 작동/응답으로 이해할 수 있습니다. 위의 요청 문자열을 작성하기 위해 dev.twitter.com에서 OAuth 빌드 도구를 사용하고 있는데 문제가 될 수 있습니다. Tarzia 코드는 기본 문자열을 만듭니다. 여기에 대한 응답 대신에 다음으로 실험 해 보겠습니다. 미리 감사드립니다. :) – WillShakes

+0

알았어 - 내가 원하는 것을 정확하게하는 것으로 보이는 C# 코드를 찾았지만 VB를 사용할 때 이동하고 포트해야했습니다. 내 포팅 된 코드와 의견은 여기를 참고하십시오 : [Code Project] (http://www.codeproject.com/Articles/247336/Twitter-OAuth-authentication-using-Net?msg = 4162685 # xx4162685xx) – WillShakes

+0

명확히하기 위해 나는 거의 내가 거기 있다고 생각한다. 나는 원격 서버 (트위터)로부터 401 Unauthorized 응답을 받는다. 그래서 문제가 내 포팅 코드인지 아니면 Twitter에서 설정했는지 (내 앱에서 읽기/쓰기로 설정했는지 여부)를 파악하려고 시도 중입니다. VB 전문가가 있습니까? ;) – WillShakes

답변

3

저는이 클래스를 API1.1을 사용하여 트위터에 게시했습니다. 생성자에서 oauth 토큰, oauth 토큰 비밀, oauth "소비자"키 (이것은 API 키를 의미) 및 oauth 소비자 비밀 (이것은 API 암호를 의미 함)을 예상합니다. 자신의 계정에 게시하려면 애플리케이션의 API 키 탭에있는 4 개의 값이 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 
관련 문제