1番シンプルな例
Wikiの開発者として知られるプログラマー、Ward Cunningham氏は、Wikiのコンセプトについて「これ以上シンプルにしようがない」と述べています。Twitterにアクセスする方法はそれに劣らずシンプルです――もっとも、適切なツールがあればの話ですが。
.NET FrameworkはTwitterにアクセスするのに適したツールを備えており、そのシンプルさは驚くほどです。Twitterにアクセスするには、.NET HttpWebRequestクラスと.NET StreamReaderを組み合わせて使用します。次の関数はTwitterに呼び出しを送信し、返されたデータを文字列に格納します。
Function GetTweet(ByVal URL As String) _
As String
Dim Request As HttpWebRequest = _
HttpWebRequest.Create(URL)
Request.Method = "POST"
Dim Response As WebResponse = Request.GetResponse
Dim Reader As New _
StreamReader(Response.GetResponseStream)
Dim Results As String = Reader.ReadToEnd
Reader.Close()
Response.Close()
Return Results
End Function
これは、URLが指定されると、結果を文字列で返すシンプルな関数です。返された文字列は、XMLパーサまたはJSONパーサを使って解析できます。次のコードは、基本的なXPathを使って、返されたステータスに対してクエリを実行する方法を示しています。
Dim TwitterLib As New TwitterLib
Dim URL As String =_
"http://.../statuses/user_timeline/rodpaddock.xml"
Dim XML As String = TwitterLib.GetTweet(URL)
Dim Doc As New XmlDocument
Doc.LoadXml(XML)
Dim XMLNodes As XmlNodeList = _
Doc.SelectNodes("//statuses/status/text")
For Each Node As XmlNode In XMLNodes
Console.WriteLine(Node.InnerText)
Next
以上でお分かりいただけたように、Twitterにアクセスするのは極めて簡単です。では、もう少し高度な機能に挑戦してみましょう。
JSON形式の指定
本稿の最初に紹介したサンプルではTwitterにXMLデータをリクエストしましたが、筆者の場合、RESTベースのWebサービスを扱うときは、JSON(JavaScript Object Notation)オブジェクトを利用するほうが好きです。XMLよりもJSONの方がオブジェクトらしいからです。
.NET環境でJSONオブジェクトを使用するには、JsonSerializerクラスが含まれるSystem.Web.Extensions名前空間への参照を追加する必要があります。このアセンブリをインポートした後で、Twitter URLの拡張子を.xmlから.jsonに変更します。こうすることで、TwitterはJSON形式で結果を返します。では、コードを次のように変更してシリアライザを実装しましょう。
Dim TwitterLib As New TwitterLib
Dim URL As String = _
"http://../statuses/user_timeline/rodpaddock.json"
Dim Results As String = TwitterLib.GetTweet(URL)
Dim JsonSerializer As New_
System.Web.Script.Serialization.JavaScriptSerializer
Dim ReturnObject As Object = _
JsonSerializer.DeserializeObject(Results)
For Each StatusObject As Object _
In CType(ReturnObject, Array)
Console.WriteLine(StatusObject("text"))
Console.WriteLine(StatusObject("user")("screen_name"))
Next
上記のForループ内のコードは、Twitterから返されたデータに対して、より「オブジェクト的」な方法でアクセスできることを示しています。コードの1行目は、ステータスオブジェクト自身のエレメントを参照しています。2行目は、ステータスのユーザーエレメントのデータにアクセスする方法を示します。なかなかいい感じではないでしょうか?
認証機能への対応
Twitterに対する操作の中には、認証が求められるものもあります。ステータスの更新を投稿するには、Twitter APIに対して認証を行う必要があります。これは難しそうに思えますが、決してそんなことはありません。Twitter APIはシンプルなWeb認証方式を利用しており、これはネイティブの.NET NetworkCredentialクラスで対応できます。リスト1に、ステータスを更新するための認証付きリクエストを送信するのに必要なコードを示します。
Function CallTweetAuthenticated(ByVal URL As String, _
ByVal Credentials As NetworkCredential, _
ByVal Data As String) As String
Dim EncodedText As String = System.Web.HttpUtility.UrlEncode(Data)
'-- create request
Dim Request As HttpWebRequest = _
HttpWebRequest.Create(URL)
Request.Method = "POST"
Request.Credentials = Credentials
Request.ContentType = "application/x-www-form-urlencoded"
Request.ContentLength = EncodedText.Length
Request.UserAgent = "Rod Paddock CoDe Mag"
Request.Timeout = 10000
'-- set this parameter because Twitter will return 417 errors
'-- without it
System.Net.ServicePointManager.Expect100Continue = False
'-- send parameters
Dim ReqStream As Stream = Request.GetRequestStream()
Dim Writer As New StreamWriter(ReqStream)
Writer.Write(EncodedText)
Writer.Close()
'-- call Twitter
Dim Response As WebResponse = Request.GetResponse
Dim Reader As New StreamReader(Response.GetResponseStream)
Dim Results As String = Reader.ReadToEnd
Reader.Close()
Response.Close()
Writer.Close()
ReqStream.Close()
Return Results
End Function
このステータス更新コードは、以下に示すように、やや複雑な処理を行います。
- 渡された
CredentialsオブジェクトをCredentialsプロパティに割り当てる System.Web.HttpUtilityクラスを使用して、Twitterに送信されたデータをURLエンコードする- データの型と長さを正しいエンコーディング形式に設定する
- System.Net.ServicePointManagerの
Expect100Continueプロパティを設定する(これを設定しないと、Twitterから417レスポンスが返され、コードの実行が中断される。これは、.NETではデフォルトですべてのリクエストに対してExpect100Continueヘッダを付加するようになっているため) - StreamWriterを使用して、URLエンコードされたパラメータをWebリクエストに付加する
ステータス更新を呼び出すためのコードを以下に示します。
Dim URL As String = _
"http://../statuses/update.json"
Dim Credentials As New _
NetworkCredential("XXX", "XXX")
Dim DataToSend As String = "status=CoDe Mag Test"
Dim TwitterLib As New TwitterLib
Dim res As String = _
TwitterLib.CallTweetAuthenticated(URL, _
Credentials, DataToSend)
MessageBox.Show(res)
