自作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 してみます。