Imports System.Net Imports System.IO Imports System.Web Imports System.Threading Public Class HttpTwitter Implements ICloneable 'OAuth関連 ''' '''OAuthのコンシューマー鍵 ''' Private Const ConsumerKey As String = "tLbG3uS0BIIE8jm1mKzKOfZ6EgUOmWVM" ''' '''OAuthの署名作成用秘密コンシューマーデータ ''' Private Const ConsumerSecret As String = "M0IMsbl2722iWa+CGPVcNeQmE+TFpJk8B/KW9UUTk3eLOl9Ij005r52JNxVukTzM" ''' '''OAuthのアクセストークン取得先URI ''' Private Const AccessTokenUrlXAuth As String = "https://api.twitter.com/oauth/access_token" Private Shared _protocol As String = "http://" Private Const PostMethod As String = "POST" Private Const GetMethod As String = "GET" Private httpCon As IHttpConnection 'HttpConnectionApi or HttpConnectionOAuth Private httpConVar As New HttpVarious Private Enum AuthMethod OAuth Basic End Enum Private connectionType As AuthMethod = AuthMethod.Basic Public Sub Initialize(ByVal accessToken As String, _ ByVal accessTokenSecret As String, _ ByVal username As String) 'for OAuth Dim con As New HttpOAuthApiProxy Static tk As String = "" Static tks As String = "" Static un As String = "" If tk <> accessToken OrElse tks <> accessTokenSecret OrElse _ un <> username OrElse connectionType <> AuthMethod.OAuth Then ' 以前の認証状態よりひとつでも変化があったらhttpヘッダより読み取ったカウントは初期化 tk = accessToken tks = accessTokenSecret un = username End If con.Initialize(DecryptString(ConsumerKey), DecryptString(ConsumerSecret), accessToken, accessTokenSecret, username, "screen_name") httpCon = con connectionType = AuthMethod.OAuth End Sub Public Sub Initialize(ByVal username As String, _ ByVal password As String) 'for BASIC auth Dim con As New HttpConnectionBasic Static un As String = "" Static pw As String = "" If un <> username OrElse pw <> password OrElse connectionType <> AuthMethod.Basic Then ' 以前の認証状態よりひとつでも変化があったらhttpヘッダより読み取ったカウントは初期化 un = username pw = password End If con.Initialize(username, password) httpCon = con connectionType = AuthMethod.Basic End Sub Public ReadOnly Property AccessToken() As String Get If httpCon IsNot Nothing Then If connectionType = AuthMethod.Basic Then Return "" Return DirectCast(httpCon, HttpConnectionOAuth).AccessToken Else Return "" End If End Get End Property Public ReadOnly Property AccessTokenSecret() As String Get If httpCon IsNot Nothing Then If connectionType = AuthMethod.Basic Then Return "" Return DirectCast(httpCon, HttpConnectionOAuth).AccessTokenSecret Else Return "" End If End Get End Property Public ReadOnly Property AuthenticatedUsername() As String Get If httpCon IsNot Nothing Then Return httpCon.AuthUsername Else Return "" End If End Get End Property Public ReadOnly Property Password() As String Get If httpCon IsNot Nothing Then 'OAuthではパスワード取得させない If connectionType = AuthMethod.Basic Then Return DirectCast(httpCon, HttpConnectionBasic).Password Return "" Else Return "" End If End Get End Property Public Function AuthUserAndPass(ByVal username As String, ByVal password As String) As HttpStatusCode If connectionType = AuthMethod.Basic Then Return httpCon.Authenticate(CreateTwitterUri("/1/account/verify_credentials.xml"), username, password) Else Return httpCon.Authenticate(New Uri(AccessTokenUrlXAuth), username, password) End If End Function Public Sub ClearAuthInfo() If connectionType = AuthMethod.Basic Then Me.Initialize("", "") Else Me.Initialize("", "", "") End If End Sub Public Shared WriteOnly Property UseSsl() As Boolean Set(ByVal value As Boolean) If value Then _protocol = "https://" Else _protocol = "http://" End If End Set End Property Public Function UpdateStatus(ByVal status As String, ByVal replyToId As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("status", status) If connectionType = AuthMethod.Basic Then param.Add("source", "Tween") If replyToId > 0 Then param.Add("in_reply_to_status_id", replyToId.ToString) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/statuses/update.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function DestroyStatus(ByVal id As Long) As HttpStatusCode Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/statuses/destroy/" + id.ToString + ".xml"), _ Nothing, _ Nothing, _ Nothing, _ Nothing) End Function Public Function SendDirectMessage(ByVal status As String, ByVal sendto As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("text", status) param.Add("screen_name", sendto) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/direct_messages/new.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function DestroyDirectMessage(ByVal id As Long) As HttpStatusCode Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/direct_messages/destroy/" + id.ToString + ".xml"), _ Nothing, _ Nothing, _ Nothing, _ Nothing) End Function Public Function RetweetStatus(ByVal id As Long, ByRef content As String) As HttpStatusCode Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/statuses/retweet/" + id.ToString() + ".xml"), _ Nothing, _ content, _ Nothing, _ Nothing) End Function Public Function ShowUserInfo(ByVal screenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("screen_name", screenName) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/users/show.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function CreateFriendships(ByVal screenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("screen_name", screenName) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/friendships/create.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function DestroyFriendships(ByVal screenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("screen_name", screenName) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/friendships/destroy.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function CreateBlock(ByVal screenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("screen_name", screenName) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/blocks/create.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function DestroyBlock(ByVal screenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("screen_name", screenName) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/blocks/destroy.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function ReportSpam(ByVal screenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("screen_name", screenName) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/report_spam.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function ShowFriendships(ByVal souceScreenName As String, ByVal targetScreenName As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("source_screen_name", souceScreenName) param.Add("target_screen_name", targetScreenName) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/friendships/show.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function ShowStatuses(ByVal id As Long, ByRef content As String) As HttpStatusCode Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/statuses/show/" + id.ToString() + ".xml"), _ Nothing, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function CreateFavorites(ByVal id As Long, ByRef content As String) As HttpStatusCode Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/favorites/create/" + id.ToString() + ".xml"), _ Nothing, _ content, _ Nothing, _ Nothing) End Function Public Function DestroyFavorites(ByVal id As Long, ByRef content As String) As HttpStatusCode Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/favorites/destroy/" + id.ToString() + ".xml"), _ Nothing, _ content, _ Nothing, _ Nothing) End Function Public Function HomeTimeline(ByVal count As Integer, ByVal max_id As Long, ByVal since_id As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count > 0 Then param.Add("count", count.ToString()) End If If max_id > 0 Then param.Add("max_id", max_id.ToString()) End If If since_id > 0 Then param.Add("since_id", since_id.ToString()) End If param.Add("include_entities", "true") Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/statuses/home_timeline.json"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function PublicTimeline(ByVal count As Integer, ByVal max_id As Long, ByVal since_id As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count > 0 Then param.Add("count", count.ToString()) End If If max_id > 0 Then param.Add("max_id", max_id.ToString()) End If If since_id > 0 Then param.Add("since_id", since_id.ToString()) End If param.Add("include_entities", "true") Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/statuses/public_timeline.json"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function Mentions(ByVal count As Integer, ByVal max_id As Long, ByVal since_id As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count > 0 Then param.Add("count", count.ToString()) End If If max_id > 0 Then param.Add("max_id", max_id.ToString()) End If If since_id > 0 Then param.Add("since_id", since_id.ToString()) End If param.Add("include_entities", "true") Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/statuses/mentions.json"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function DirectMessages(ByVal count As Integer, ByVal max_id As Long, ByVal since_id As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count > 0 Then param.Add("count", count.ToString()) End If If max_id > 0 Then param.Add("max_id", max_id.ToString()) End If If since_id > 0 Then param.Add("since_id", since_id.ToString()) End If Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/direct_messages.json"), _ Nothing, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function DirectMessagesSent(ByVal count As Integer, ByVal max_id As Long, ByVal since_id As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count > 0 Then param.Add("count", count.ToString()) End If If max_id > 0 Then param.Add("max_id", max_id.ToString()) End If If since_id > 0 Then param.Add("since_id", since_id.ToString()) End If Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/direct_messages/sent.json"), _ Nothing, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function Favorites(ByVal count As Integer, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count <> 20 Then param.Add("count", count.ToString()) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/favorites.json"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function Search(ByVal words As String, ByVal lang As String, ByVal rpp As Integer, ByVal page As Integer, ByVal sinceId As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If Not String.IsNullOrEmpty(words) Then param.Add("q", words) If Not String.IsNullOrEmpty(lang) Then param.Add("lang", lang) If rpp > 0 Then param.Add("rpp", rpp.ToString()) If page > 0 Then param.Add("page", page.ToString()) If sinceId > 0 Then param.Add("since_id", sinceId.ToString) If param.Count = 0 Then Return HttpStatusCode.BadRequest Return httpConVar.GetContent(GetMethod, _ CreateTwitterSearchUri("/search.atom"), _ param, _ content, _ Nothing, _ "Tween") End Function Public Function FollowerIds(ByVal cursor As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("cursor", cursor.ToString()) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/followers/ids.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function RateLimitStatus(ByRef content As String) As HttpStatusCode Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/account/rate_limit_status.xml"), _ Nothing, _ content, _ Nothing, _ Nothing) End Function Public Function GetLists(ByVal user As String, ByVal cursor As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("cursor", cursor.ToString) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/" + user + "/lists.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function PostListID(ByVal user As String, ByVal list_id As String, ByVal name As String, ByVal mode As String, ByVal description As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If name IsNot Nothing Then param.Add("name", name) If mode IsNot Nothing Then param.Add("mode", mode) If description IsNot Nothing Then param.Add("description", description) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/" + user + "/lists/" + list_id + ".xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function DeleteListID(ByVal user As String, ByVal list_id As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("_method", "DELETE") Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/" + user + "/lists/" + list_id + ".xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function GetListsSubscriptions(ByVal user As String, ByVal cursor As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("cursor", cursor.ToString) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/" + user + "/lists/subscriptions.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function GetListsStatuses(ByVal user As String, ByVal list_id As String, ByVal per_page As Integer, ByVal max_id As Long, ByVal since_id As Long, ByRef content As String) As HttpStatusCode '認証なくても取得できるが、protectedユーザー分が抜ける Dim param As New Dictionary(Of String, String) If per_page > 0 Then param.Add("per_page", per_page.ToString()) End If If max_id > 0 Then param.Add("max_id", max_id.ToString()) End If If since_id > 0 Then param.Add("since_id", since_id.ToString()) End If Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/" + user + "/lists/" + list_id + "/statuses.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function PostLists(ByVal user As String, ByVal listname As String, ByVal isPrivate As Boolean, ByVal description As String, ByRef content As String) As HttpStatusCode Dim mode As String = "public" If isPrivate Then mode = "private" End If Dim param As New Dictionary(Of String, String) param.Add("name", listname) param.Add("mode", mode) If Not String.IsNullOrEmpty(description) Then param.Add("description", description) End If Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/" + user + "/lists.xml"), _ param, _ content, _ Nothing, Nothing) End Function Public Function GetListMembers(ByVal user As String, ByVal list_id As String, ByVal cursor As Long, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("cursor", cursor.ToString()) Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/" + user + "/" + list_id + "/members.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function PostListMembers(ByVal user As String, ByVal list_id As String, ByVal id As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("id", id) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/" + user + "/" + list_id + "/members.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function DeleteListMembers(ByVal user As String, ByVal list_id As String, ByVal id As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("id", id) param.Add("_method", "DELETE") Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/" + user + "/" + list_id + "/members.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function GetListMembersID(ByVal user As String, ByVal list_id As String, ByVal id As String, ByRef content As String) As HttpStatusCode Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/" + user + "/" + list_id + "/members/" + id + ".xml"), _ Nothing, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function Statusid_retweeted_by_ids(ByVal statusid As Long, ByVal count As Integer, ByVal page As Integer, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If count > 0 Then param.Add("count", count.ToString()) End If If page > 0 Then param.Add("page", page.ToString()) End If Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/statuses/" + statusid.ToString + "/retweeted_by/ids.xml"), _ param, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function Public Function UpdateProfile(ByVal name As String, ByVal url As String, ByVal location As String, ByVal description As String, ByRef content As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) param.Add("name", name) param.Add("url", url) param.Add("location", location) param.Add("description", description) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/account/update_profile.xml"), _ param, _ content, _ Nothing, _ Nothing) End Function Public Function UpdateProfileImage(ByVal imageFile As FileInfo, ByRef content As String) As HttpStatusCode Dim binary As New List(Of KeyValuePair(Of String, FileInfo)) binary.Add(New KeyValuePair(Of String, FileInfo)("image", imageFile)) Return httpCon.GetContent(PostMethod, _ CreateTwitterUri("/1/account/update_profile_image.xml"), _ Nothing, _ binary, _ content, _ Nothing, _ Nothing) End Function Public Function GetRelatedResults(ByVal id As Long, ByRef content As String) As HttpStatusCode '認証なくても取得できるが、protectedユーザー分が抜ける Return httpCon.GetContent(GetMethod, _ CreateTwitterUri("/1/related_results/show/" + id.ToString + ".json"), _ Nothing, _ content, _ TwitterApiInfo.HttpHeaders, _ AddressOf GetApiCallback) End Function #Region "Proxy API" Private Shared _twitterUrl As String = "api.twitter.com" Private Shared _TwitterSearchUrl As String = "search.twitter.com" Private Shared _twitterStreamUrl As String = "userstream.twitter.com" Private Function CreateTwitterUri(ByVal path As String) As Uri Return New Uri(String.Format("{0}{1}{2}", _protocol, _twitterUrl, path)) End Function Private Function CreateTwitterSearchUri(ByVal path As String) As Uri Return New Uri(String.Format("{0}{1}{2}", _protocol, _TwitterSearchUrl, path)) End Function Private Function CreateTwitterStreamUri(ByVal path As String) As Uri Return New Uri(String.Format("{0}{1}{2}", "https://", _twitterStreamUrl, path)) End Function Public Shared WriteOnly Property TwitterUrl() As String Set(ByVal value As String) _twitterUrl = value HttpOAuthApiProxy.ProxyHost = value End Set End Property Public Shared WriteOnly Property TwitterSearchUrl() As String Set(ByVal value As String) _TwitterSearchUrl = value End Set End Property #End Region Private Sub GetApiCallback(ByVal sender As Object, ByRef code As HttpStatusCode, ByRef content As String) If code < HttpStatusCode.InternalServerError Then TwitterApiInfo.ParseHttpHeaders(TwitterApiInfo.HttpHeaders) End If End Sub Public Function UserStream(ByRef content As Stream, ByVal allAtReplies As Boolean, ByVal trackwords As String) As HttpStatusCode Dim param As New Dictionary(Of String, String) If allAtReplies Then param.Add("replies", "all") End If If Not String.IsNullOrEmpty(trackwords) Then param.Add("track", trackwords) End If Return httpCon.GetContent(GetMethod, _ CreateTwitterStreamUri("/2/user.json"), _ param, _ content) End Function Public Sub RequestAbort() httpCon.RequestAbort() End Sub Public Function Clone() As Object Implements System.ICloneable.Clone Dim myCopy As New HttpTwitter If Me.connectionType = AuthMethod.Basic Then myCopy.Initialize(Me.AuthenticatedUsername, Me.Password) Else myCopy.Initialize(Me.AccessToken, Me.AccessTokenSecret, Me.AuthenticatedUsername) End If Return myCopy End Function End Class