パラメータ
全開ツイートの取得に成功したわけですがそこで使用したメソッドについてパラメータの指定を殆どしてなかったので調べました。
原文はこちら
GET statuses/mentions | Twitter Developers
んでもって訳してるサイト様
Twitter API mentions メンションタイムライン @ユーザー「つぶやき」 一覧 表示 取得 php oauth接続 | TRYPHP!
端的に必要な事を書くと
count 取得するレコード件数を指定。指定できるのは200件まで。指定無しだと800件かな??
since_id 指定されたID(ツイートのユニークID)より新しいものだけ取得
max_id 指定されたID(ツイートのユニークID)より古いものだけ取得
trim_user ユーザー情報をIDだけにして他を省く
contributor_details 貢献者の表示名を取得する。
include_entities ツイッターの情報にエンティティを含める
exclude_replies リプライを含めない
貢献者って何?と思ってたらこういう機能の情報らしい。
Twitterがライター機能を公開、Salesforceが利用開始 - TechCrunch
複数人で一つのIDでツイートできるけど内部的には個人IDも持っていてその個人IDの方を取得するかどうかの模様。
身近にこれやってる人が居ないからテストが難しいし個人用のアプリだから要らないかなー。公式ツイートの情報拾ってくると面白いかも。
ツイート情報
まだ色々問題あるけどとりあえずツイートを取得してみようと思う。
まずはトークンから取得出来るStatusクラス配下のメンバ。
ライブラリはこちら
CoreTweet: CoreTweet.Rest.Statuses Class Reference
以下自分用メモ。
実際に値が取得出来た物。
DateTimeOffset CreatedAt ツイートの作成日時。時分秒。
long id ツイートに振られている通し番号
String Text ツイートの本文
User User ツイートした人に関する概略情報
bool IsFavorited ログインユーザーがお気に入りに入れたかどうか
bool IsRetweeted ログインユーザーがリツイートしたかどうか
bool IsTruncated 本文が省略されているかどうか。
int FavoriteCount お気に入りされた数
int RetweetCount リツイートされた数
だと思う←
とりあえず直近で使いそうな物だけ。お気に入り件数ってintなんだね。
ツイートの取得
ようやくやってきましたTLの取得っ!
長かったー凄く長かったー。
まぁ結局ツイートの取得に半日悩んだわけですが。
最初に使用した処理はお手本にもあるこちら。
var stream = tokens.Streaming.StartStream(CoreTweet.Streaming.StreamingType.User,
new StreamingParameters(replies => "all"));
foreach(var message in stream)
{
if(message is StatusMessage)
{
var status = (message as StatusMessage).Status;
Console.WriteLine(string.Format("{0}:{1}", status.User.ScreenName
,status.Text));
}
else if(message is EventMessage)
{
var ev = message as EventMessage;
Console.WriteLine(string.Format("{0}:{1}->{2}",
ev.Event, ev.Source.ScreenName, ev.Target.ScreenName));
}
}
※参考
C#でTwitterアプリを作る 第3回 Streaming - LINQになりたい
だけど問題はお手本にもあるようにこのままだと同期処理なので延々foreachが回る。一度上限数を決めてbreakする仕様にもしてみたけれど、上限まで満たないとツイートが流れてくるのを待つのでやっぱりレスポンスが遅い。なので調べてみたら非同期処理もちゃんとある。
非同期メソッドを使う · CoreTweet/CoreTweet Wiki · GitHub
拡張無しでも使える処理だからこれで何とかなる!と喜んだのもつかの間、どうにもコンパイルエラーになって処理が通らない。
結論として私がC#よく分かってなかっただけだったわけですが。
悩んだ末の現在のコード
public async void HomeTimelineAsync(){
foreach (var status in await
tokens.Statuses.HomeTimelineAsync(count => 10))
{
String str = null;
str = string.Format("{0}:{1}", status.User.ScreenName, status.Text);
if (str != null)
{
str = str+"\n"+this.textBox1.Text;
this.textBox1.Text = str;
}
}
}
ミソは太字の部分。このasync つけたメソッド内でawait指定したtaskの処理を待つって代物。HomeTimelineAsyncはその時取れるTLから10件取得するようになっている、のかな?多分。
とりあえずテキストボックス置いて中に追記で書かせてますが見づらいのでその辺りも考えてもうちょい試行錯誤します。
というかもうちょっとちゃんと説明書き読めという話。
トークンを取得
前回どうにかこうにかPINが取れたので改めてトークンの取得。
といってもこれだけ。
var session=CoreTweet.OAuth.Authorize(CONSUMER_KEY, CONSUMER_SECRET);
var tkn = CoreTweet.OAuth.GetTokens(session, "取得したpin");
接続エラーになるとExeptionでキャッチできるのでそちらも記述。
まぁ、もっとやっかいな物があったわけですが。
PINを取得する
前回お手本通りの接続が出来なかったわけですがそもそもコンソールアプリで作っててPINを後入れしたらそりゃ繋がらないですよねっていう話。
画面でPINをいれさせるという選択肢もあったけど折角認証画面があるんだからそこから取得しませうって事でトライ。
コンソール上にwebBrowzerを貼り付けてそこに認証画面を展開
this.webBrowser1.Navigate(session.AuthorizeUri.AbsoluteUri);
webBrowzer内に新たにコードを読み込むたびにチェック
HtmlDocument doc = this.webBrowser1.Document;
var v0 = doc.GetElementById("code-desc");
if (v0 != null)
{
string info = v0.InnerText;
if (info != null || info.IndexOf("PIN") > 1)
{
string pin = doc.GetElementById("oauth_pin")
.GetElementsByTagName("code")[0].InnerText;
}
}
code-descっていうのがPINが記載されているブロックのID。
念のためその中にPINって文字列があったら認証が成功していると見なして取得処理を行う。
oauth_pin内のcode要素内はPINしかないのでべた書きで0番目を取ってくる。とりあえずこれでPINは取得できたので次はこれでtokenを取得する。