Twitter API 通信部位

自作Twitter クライアントは、「s14twi」と言う名前で作ります。

Twitter ID そのままですが・・・

 

さて、通信部位。

通常のタイムライン読み込みや、ステータスアップデートは、Basic 認証 で可能ですが、

「via s14twi」を出させるには、OAuth プロトコルでステータスアップデートしなければなりません。

そこで、OAuthLib(http://oauthlib.codeplex.com/)を使ってみる事にしました。

このAuth を利用するには、Consumer key とConsumer secret をTwitter から発行して貰わなければなりません。

ココ(http://twitter.com/apps/new)からアプリケーション登録の手続きをするともらえます。

その後、このConsumer key とConsumer secret を実装してAccessToken を取得します。

コレは、OAuthLib でRequestAccessToken を行います。

 

            PostConsumer = New OAuthLib.Consumer(_Setting.ConsumerKey, _Setting.ConsumerSecret)
            ReqToken = PostConsumer.ObtainUnauthorizedRequestToken(__RequestTokenURL, __AuthorizationRealm)
            Process.Start(Consumer.BuildUserAuthorizationURL(__AuthorizeURL, ReqToken))
 

ココの、処理で、ブラウザにKey が表示されるので、

そのKey を(TempStr がソレ)

AccToken = PostConsumer.RequestAccessToken(TempStr, ReqToken, __AccessTokenURL, __AuthorizationRealm)

この様に関数に渡すとAccessToken が取得できます。

 

AccessTokenは、TokenSecret と、TokenValue の二つの値で構成されています。

よって、OAuthLib でTwitter と通信するには、

 

Consumer key

Consumer secret

TokenSecret

TokenValue

 

この四つの値(String 型)を何処かに保存しておかないと不便です。

(AccessToken を毎回取得するのもめんどくさいし・・・)

 

なんか、Blog に上手くソースを表示させる手段は無いのだろうか???

 

とりあえず、AccessToken 取得関数

#Region "アクセストークン取得"
    Public Function SetAccTokenKey() As Boolean
        Dim PostConsumer As OAuthLib.Consumer
        Dim ReqToken As OAuthLib.RequestToken

        'Consumer 系の値が設定されているかチェック
        If _Setting.ConsumerKey = "" Or _Setting.ConsumerSecret = "" Then
            Return False
        End If

        Try
            PostConsumer = New OAuthLib.Consumer(_Setting.ConsumerKey, _Setting.ConsumerSecret)
            ReqToken = PostConsumer.ObtainUnauthorizedRequestToken(__RequestTokenURL, __AuthorizationRealm)
            Process.Start(Consumer.BuildUserAuthorizationURL(__AuthorizeURL, ReqToken))
        Catch ex As Exception
            Return False
        End Try

        'Web ページが開かれて、Access Token Key が表示されているはず。
        'InputBox でそのKey を入れてもらい、Setting に保存する。
        Dim TempStr As String = InputBox("Plese Input Access Token Key", "Input Key")
        If TempStr <> "" Then
            Dim AccToken As OAuthLib.AccessToken
            Try
                AccToken = PostConsumer.RequestAccessToken(TempStr, ReqToken, __AccessTokenURL, __AuthorizationRealm)
            Catch ex As Exception
                Return False
            End Try
            _Setting.AccTokenSecret = AccToken.TokenSecret
            _Setting.AccTokenValue = AccToken.TokenValue
        Else
            Return False
        End If
        Return True
    End Function
#End Region

 

Const 系 とEnum 系

#Region "Const"
    Private Const __Public_Timeline_URL As String = "http://twitter.com/statuses/public_timeline.xml"
    Private Const __Friends_Timeline_URL As String = "http://twitter.com/statuses/friends_timeline.xml"
    Private Const __Replies_URL As String = "http://twitter.com/statuses/replies.xml"
    Private Const __Direct_Messages_URL As String = "http://twitter.com/direct_messages.xml"
    Private Const __Rate_Limit_Status_URL As String = "http://twitter.com/account/rate_limit_status.xml"
    Private Const __Status_Update_URL As String = "http://twitter.com/statuses/update.xml"

    Private Const __RequestTokenURL As String = "http://twitter.com/oauth/request_token"
    Private Const __AccessTokenURL As String = "http://twitter.com/oauth/access_token"
    Private Const __AuthorizeURL As String = "http://twitter.com/oauth/authorize"
    Private Const __AuthorizationRealm As String = "http://twitter.com"

    Private Const __DummyParamName As String = "since_id"
    Private Const __DummyParamValue As String = "your since id"
#End Region

#Region "Enum"
Public Enum enumAuthorizationType As Integer
    AUTH_Unknown = 0
    AUTH_OAuth = 1
    AUTH_Basic = 2
End Enum
Public Enum enumHttpReqMode As Integer
    HTRM_Unknown = 0
    HTRM_GET = 1
    HTRM_POST = 2
End Enum
#End Region

 

そして、通信本体。

 

#Region "通信本体"
    Private Function TwitterComm(ByVal _URLStr As String, ByVal _ReqMode As enumHttpReqMode, ByRef _WebResponse As System.Net.HttpWebResponse) As Boolean
        Dim Params() As OAuthLib.Parameter
        ReDim Params(0)
        Params(0) = New OAuthLib.Parameter(__DummyParamName, __DummyParamValue)
        Return TwitterComm(_URLStr, _ReqMode, _WebResponse, Params)
    End Function
    Private Function TwitterComm(ByVal _URLStr As String, ByVal _ReqMode As enumHttpReqMode, ByRef _WebResponse As System.Net.HttpWebResponse, ByVal _Params() As OAuthLib.Parameter) As Boolean
        Dim ReqStr As String
        Dim ReqMessage As String

        '値のチェックもココで
        ReqStr = ""
        ReqMessage = ""
        Select Case _ReqMode
            Case enumHttpReqMode.HTRM_GET
                ReqStr = "GET"
                'OAuth 認証の場合、ココでメッセージを削除
                If _Setting.AuthorizationType = enumAuthorizationType.AUTH_OAuth Then
                    _Params = Nothing
                End If
            Case enumHttpReqMode.HTRM_POST
                ReqStr = "POST"
                'Params が有るかどうか???
                If _Params Is Nothing Then
                    Return False
                End If
                If _Params(0).Name = "__DummyParamName" Then    '値がDummy だった場合
                    Return False
                End If

                'Basic 認証の場合、ココでメッセージを作成
                If _Setting.AuthorizationType = enumAuthorizationType.AUTH_Basic Then
                    Dim ii As Integer
                    ReqMessage = ""
                    For ii = 0 To _Params.Length - 1
                        ReqMessage = ReqMessage & _Params(ii).Name & "=" & _Params(ii).Value & "&"
                    Next
                    ReqMessage = ReqMessage.Remove(ReqMessage.Length - 1, 1)
                End If
            Case enumHttpReqMode.HTRM_Unknown
                Return False
            Case Else
                Return False
        End Select

        '認証タイプ
        Select Case _Setting.AuthorizationType
            Case enumAuthorizationType.AUTH_OAuth
                Dim PostConsumer As OAuthLib.Consumer
                Dim AccToken As OAuthLib.AccessToken

                'Consumer 系の値が設定されているかチェック
                If _Setting.ConsumerKey = "" Or _Setting.ConsumerSecret = "" Then
                    Return False
                End If
                '取得したAccessToken が有るかどうかチェック
                If _Setting.AccTokenValue = "" Or _Setting.AccTokenSecret = "" Then
                    Return False
                End If
                PostConsumer = New OAuthLib.Consumer(_Setting.ConsumerKey, _Setting.ConsumerSecret)
                AccToken = New OAuthLib.AccessToken(_Setting.AccTokenValue, _Setting.AccTokenSecret)
                Try
                    _WebResponse = PostConsumer.AccessProtectedResource(AccToken, _URLStr, ReqStr, __AuthorizationRealm, _Params)
                Catch ex As System.Net.WebException
                    'Web 系エラー発生
                    Return False
                Catch ex As Exception
                    'エラー発生
                    Return False
                End Try

            Case enumAuthorizationType.AUTH_Basic
                Dim Request As System.Net.WebRequest
                Try
                    Request = System.Net.HttpWebRequest.Create(_URLStr)
                    Request.ContentType = "application/x-www-form-urlencoded"
                    Request.Headers.Add("Authorization: Basic " & Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(_Setting.UserID & ":" & _Setting.Password)))
                    Request.Method = ReqStr

                    'Twitterのサーバーが「100-Continue 」ヘッダをサポートしていないので、これを設定しないと「417」ステータスコードが返ってくるらしい
                    System.Net.ServicePointManager.Expect100Continue = False
                    If _ReqMode = enumHttpReqMode.HTRM_GET Then
                        _WebResponse = Request.GetResponse
                    ElseIf _ReqMode = enumHttpReqMode.HTRM_POST Then
                        Dim PostStream As System.IO.Stream
                        Dim PostBytes() As Byte
                        PostBytes = System.Text.Encoding.ASCII.GetBytes(Uri.EscapeUriString(ReqMessage))
                        Request.ContentLength = PostBytes.Length
                        PostStream = Request.GetRequestStream
                        PostStream.Write(PostBytes, 0, PostBytes.Length)
                        _WebResponse = Request.GetResponse
                    End If
                Catch ex As System.Net.WebException
                    'Web 系エラー発生
                    Return False
                Catch ex As Exception
                    'エラー発生
                    Return False
                End Try
            Case enumAuthorizationType.AUTH_Unknown
                Return False
            Case Else
                Return False
        End Select

        '最後にWebResponse の確認
        If _WebResponse.StatusCode = Net.HttpStatusCode.OK Then
            Return True
        End If
        Return False
    End Function
#End Region

また変更が有ったらUP してみます。

コメント(2)