Linq to Twitter を試してみた。
Botを開発する際、Twitter API の利用で少々苦労したのですが、その終盤において、Linq to Twitter なるものがあるのを知り、ショックを受けたのですが、便利そうなのでメモ。
まず、Twitter API を利用するためには、認証のためのTokenなどを取得する必要があります。以前はBasic認証が使えたのですが、今はOAuthのみのようですね。
OAuthをC#でやるのはいろいろ大変だったのですが、そのあたりも、全部Linq to Twitter がやってくるので、それだけでも利用価値があります。
が、そもそも、AccessTokenやらを取得するのが大変で、まずは、そのためのクライアント(GetTwitterAuthInfo)を作ってみました。
なお、ツールの実装においては、nojima氏がパブリックドメインとして公開されているコードを利用させていただきました。ありがとうございます。
Twitter での認証(Linq to Twitter利用)のためには制御対象となるTwitterアカウントのID、パスワードの他に、下記の、4つの情報が必要です。
- CONSUMER_KEY
- CONSUMER_SECRET
- ACCESSTOKEN
- ACCESSTOKENSECRET
このうち、1と2については、取得用のWebサイトにて、取得します。
取得方法については、iPentecさんのサイトに詳しい解説があります。
その2つを取得したら、カスタムでコードを書くか、さっき紹介したツールで、残りの2つを取得します。
GetTwitterAuthInfoを利用する方法を簡単に説明しおきます。
1)PINコードを取得するためのURLを取得する。
CONSUMER_KEYとCONSUMER_SECRETを取得し、テキストボックスに入力しします。そして、「1) GET PIN URL」をクリックします。しばらく経つと、PIN URLの欄に、PINコードを取得するためのURLが取得されます。
2)PINコードを取得する。
取得されたURLをブラウザに直接コピーするか、「2) Open URL」をクリックすると、PINコード取得用のURLにアクセスしします。
アクセスするTwitterアカウントを聞かれるので、入力します。
PINが表示されますので、コピーします。
3)ACCESSTOKENおよびACCESSTOKENSECRETを取得しる。
表示されたPINコードを「PIN COE」に入力し、「3) GET TOKEN」をクリックします。しばらく経つと、AccessTokenとAccessTokenSecretが表示されますのでメモするか、「Save as .\authinfo.txt」をクリックしください。Save sa ~をっクリックした場合は、GetTwitterAuthInfo.exeと同じディレクトリにauthinfo.txtとして保存されます(エラーが起きた場合はパーミッションを確認してみてください)。
ここまでの手順で、上記4つの情報が入手できているものとします。
Linq to Twitter を入手し、参照を追加します。
これで準備完了。
なお、最初に書いておきますが、ダウンロードされたDLLは、TargetのFrameworkを3.5にしておかないとエラーがでます(4.0ではダメでした)。
では、コーディング。
まず、タイムラインを取得してみます。こんな感じ。
下記例では、Windows Application にボタンとテキストボックス(マルチTrue)に取得したタイムラインを表示しています。
private void button1_Click(object sender, EventArgs e)
{
OAuthTwitter auth = new OAuthTwitter();
//取得した認証情報を入力します。
auth.OAuthConsumerKey = "your_consumerkey";
auth.OAuthConsumerSecret = "your_consumersecret";
auth.OAuthToken = "your_accesstoken";
auth.OAuthTokenSecret = "your_accesstokensecret";
PinAuthorizer pinauth = new PinAuthorizer();
pinauth.OAuthTwitter = auth;
TwitterContext context = new TwitterContext(pinauth);
var query = from p in context.Status
where p.Type == LinqToTwitter.StatusType.User
select p;
foreach (var q in query)
{
textBox1.Text += q.Text + "\r\n";
}
context.Dispose();
}
次に更新。
var tweet = context.UpdateStatus("投稿:" + DateTime.Now.ToString());
上記ソースの青い部分をこのようにするだけ。APIは同じ内容の投稿をはじくので、時刻を表示させて内容を変化させています。
次に検索。
var query = from p in context.Search
where p.Type == SearchType.Search &&
p.Query == "みかん" &&
p.Page == 1 &&
p.PageSize == 3
select p;
foreach (var q in query)
{
textBox1.Text += "Query:" + q.Query + "\r\n";
foreach (var e in q.Entries)
{
textBox1.Text += "内容:" + e.Content + "\r\n";
}
}
という感じ。
0から実装することを考えれば、えらい楽です。