SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Visual BasicによるTwitterプログラミング
.NETプラットフォームを使ってTwitterにアクセスする

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に、ステータスを更新するための認証付きリクエストを送信するのに必要なコードを示します。

リスト1 Twitterのステータス更新コード
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)

次のページ
シンプルなクライアントの作成

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Rod Paddock(Rod Paddock)

 CoDe Magazine誌編集長。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4054 2009/06/29 18:17

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー