チラシの裏の電子工作

電子工作、PC関係の備忘録というか、チラシの裏

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ:スポンサー広告

.netFramework2.0でTwitter API1.1クライアントを作るメモ

少し前に、TwitterのAPIが1.1に移行され、1.1以前のAPIが使えなくなってしまいました。
VBやC#から、Twitterに簡単に投稿できる「TwitterVB」というライブラリがあったのですが、1.1には対応せず開発終了となっていました。

代替ライブラリとしてはLinqToTwitterと言う物があるのですが、これは.netFramework3.5用です。
そのほかのライブラリも、API1.1に対応せずに終息しているものが多いようです。
LinqToTwitterを使う限りにおいては、コンパイラをVS2008以降に変更すれば良いだけなのですが、少し思うところがあってFramework2.0でも動作可能なクライアントを作るために色々調べてみたので、その時のメモ。

  • 何故LinqToTwitterはFramework3.5用なのか?
    恐らく内部でFramework3.5の機能を使用しているせいだと思われます。
    ソースを読んだわけではないのですが、具体的にはJSONの処理ではないかと思います。
    以前はtwitterAPIから取得するデータはxmlでしたが、現在はJSON形式なので、Framework2.0系にはデシリアライズできるクラスが有りませんし…
  • では、Framework2.0でJSONをどうやって解釈するか?
    JSON.net
    を使用する事で解決できました。

ひとまず、JSONがどうのこうのは隅っこに置いておいて。
API1.1とそれ以前の情報が混ざっていて、解りやすい情報が掴みにくく、苦労しました。

http://wiki.100poisha.ddls.jp/index.php?OAuth%28Twitter%20API%29
こちらのサンプルは1.1より前の物ですが、URLを1.1用に直せば動きます。
TwitterAPI1.1

サンプルはC#で書かれていますが、私はVB2005に書き直しました。
とりあえず、サンプルが動くところまで行ったら、処理を整理しているときになんとなく流れが理解できるかと思います。
1から10まで全部書いてるときりがないので、自分が躓いた要所だけ書き出しておきます。


関数の用意
  • ParameterEncoding()
    てっとり早くこことかここを参考に作ってしまうと楽。
  • GetUnixTime()
    このあたりを参考に。
  • GetNonce()
    GUIDを返す関数を用意するだけでとりあえずは動きました。


シグネチャ計算時のパラメタは、全て昇順でソートされている必要がある

リクエストトークン取得部分での例を挙げると、

oauth_consumer_key
oauth_nonce
oauth_signature_method
oauth_timestamp
oauth_version

の順番でないと、twitterAPIを投げたときに401エラーが返ります。
また、APIによってこのパラメタは増えたりするので、SortedDictionary等のクラスでパラメタを纏めておいて、シグネチャ作成時に文字列に変換し直すと楽です。

そもそもシグネチャってなんやねん

多分真面目に資料を読めば事細かに書いてあると思うのですが、ざっくりと「twitterAPIで要求した内容が改竄されてないか確認するためにハッシュ作って送ってね!」って事だと解釈しています。
と言う事で、シグネチャに抜けがあったり仕様と違う事を書いてると、軒並み認証エラーで蹴られて何が悪いのかすら教えて貰えません。


TL取得について
サンプルがないのですが、home_timelineはGETなので、殆どそのままアクセストークンを取得するソースが使えます。
異なる点は、
・リクエストトークンを全てアクセストークンに読み替える
・APIのURLを修正する
・pinは送らなくても良いので、シグネチャとクエリから外す


TL取得の時にcountなどのオプションを付ける場合
クエリパラメタに追加する。
例)nvc.add("count","10")
これだけだとエラーが起こるので、シグネチャにも同じもの(count=10)を追加する。
シグネチャに追加するときに、前述のとおりソートに注意。


取得したTLについて
先述した、JSON形式で返って来ます。
JSON.netを使用すると、自力で解析しなくてもよくなるのでかなり楽ちんです。
Newtonsoft.Json.JsonConvert.DeserializeObject()を使って、Newtonsoft.Json.Linq.JArray型の値を取得して解析すると良いでしょう。
.netFramework3.x以上の場合は、Framework自体にデシリアライザがあるようなので、JSON.netを使う必要は無さそうです(詳しく調べてませんが)


サンプルのソース通りだと特定の文字がupdateできない
サンプルのソースのこの部分が問題。

wc.UploadValues(url, nvc);

nvcにクエリ情報が格納されているわけですが、WebClientでそのまま渡して処理をさせると、Framework標準のURLEncodeを使ってしまいます。
即ち、「!()*,」のあたりがtwitterのエンコードと異なる為、401が返る。

nvcからクエリ文字を作成し、その段階で値を最初に用意したUrlEncode関数に突っ込んでやればOK。
具体的には、こんな感じで関数を作っておくと便利かも。(VB)

    Friend Function CreateQueryString(ByVal nvc As System.Collections.Specialized.NameValueCollection) As String
        Dim lst As New List(Of String)
        For Each key As String In nvc.Keys
            lst.Add(key & "=" & UrlEncode(nvc(key)))
        Next
        Return Join(lst.ToArray, "&")
    End Function

上記関数で得たクエリ文字をUTF-8バイト配列に変換し、wc.UploadData()でPOSTする。
POSTする前に、Content-Typeをapplication/x-www-form-urlencodedに変更するのを忘れずに。

よく解らなければ、Proxomitron のようなproxyを立てて、他のtwitterアプリのPOSTデータと比較しながら作業すると問題点が見えやすいです。


ひとまずここまでで、最低限twitterクライアントとして必要な、認証・update・home_timelineが使用可能になります。
user_timelineなんかも、home_timelineと大して変わりません。
シグネチャ周りのエラーは、全て認証エラーが返されてしまうので、何が悪いのか判断するのに結構苦労しました…
スポンサーサイト

カテゴリ:PC - テーマ:プログラミング - ジャンル:コンピュータ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。