読者です 読者をやめる 読者になる 読者になる

ikarosの作業場

C#でWindows Store Appsやったり、Phunいじったり

Windows Store Apps(C#)でTwitterを使う:第二回(後編)

さて、昨日はsignatureを取得したのでした。それではいよいよリクエストを送信したいと思います

4.リクエストの送信
まずはsignatureをSortedDictionaryのparms(詳細は前回:
Windows Store Apps(C#)でTwitterを使う:第二回(前編) - ikarosの作業場
を参照)に追加してパラメーターを増やしましょう。リクエストパラメーターにはシグネチャも必要ですからね。
ただしシグネチャはURLエンコードされたものでなければなりません

parms.Add("oauth_signature", WebUtility.UrlEncode(signature));

さてそれではURLとヘッダーを揃えてリクエストを送信します。URLは "(APIURL)?(パラメーターの名前)=(パラメーターの値)&(パラメーターの名前)=(パラメーターの値)…"というふうに
ヘッダーはAuthorizationヘッダーに "OAuth (パラメーターの名前)="(パラメーターの値)", (パラメーターの名前)=(パラメーターの値),…という風に記述します

では書いていきましょう

//APIURL
string RequestURL = "https://api.twitter.com/oauth/request_token?";
//変数を初期化(OAuthという文字列は後で関数で勝手に入れてくれるので不要)
string AuthorizationParms = null;

foreach(string name in parms.Keys)
{
     RequestURL += name + "=" + WebUtility.UrlEncode(parms[name]) + "&";
     //"(ダブルクオーテーション)は「\"」と書いて表現
     AuthorizationParms += name + "=\"" + parms[name] + "\", ";
}
//最後に余計な記号(&だの,だの)たちを消去
RequestURL = RequestURL.Remove(RequestURL.Length - 1);
AuthorizationParms = AuthorizationParms.Remove(AuthorizationParms.Length - 2,2);

あらかた準備が整いました!それではHttpClientクラスの機能を用いてTwitterにリクエストを送信します。

var request = new HttpRequestMessage();
var response = new HttpResponseMessage();
var client = new HttpClient();

//POSTリクエストに設定
request.Method = HttpMethod.Post;
//URLを指定
request.RequestUri = new Uri(RequestURL);
//Authorizationヘッダーを設定、ここで"OAuth"という文字列も追加される
request.Headers.Authorization = new AuthenticationHeaderValue("OAuth", AuthorizationParms);
//中身はなんもないよと指定
request.Content = null;

//結果を受け取る変数を初期化
string result = null;

//Twitterにリクエストを送信、結果をresponseに格納する
response = await client.SendAsync(request);
//結果をstring形式で変数resultに保存
result = await response.Content.ReadAsStringAsync();

ここでawaitという前置詞的なもの(名前忘れました)が登場します。このawaitを利用するためにはこれを実行する関数の前にasyncという前置詞をくっつけなければなりません。

example

private string async RequestGET(引数)
{
     (中略)
     string result = await response.Content.ReadAsStringAsync();
     return result;
}

このawait/asyncをつけると何が嬉しいかというと、「非同期通信」が可能になるという点です。プログラムは本来であれば一つの作業しかできないので、どこかと通信と行ってしまうとその通信がいったん終わるまでプログラムは何も操作できない(画面がフリーズしてしまうというとわかりやすいでしょうか)ということになってしまいます。これではGUIベースのプログラムでは不便ですよね?ですがawait/asyncをつけていればどこかと通信を行っていても、ユーザーは何か別の作業とかをすることができるという恩恵を受けることができるのです。

話がそれました。
5.情報の解析
さてここまでうまくいっていればresultには次のような文字列が入っているはずです

oauth_token=(hogehoge)&oauth_token_secret=(hogehoge)&oauth_callback=oob

これのoauth_tokenの部分がリクエストトークン、oauth_token_secretの部分がリクエストシークレットとなります
正規表現などで読み取ってあげましょう

RequestKey = Regex.Match(result, @"oauth_token=(.*?)&oauth_token_secret=.*?&oauth_callback.*").Groups[1].Value;
RequestSecret = Regex.Match(result, @"oauth_token=(.*?)&oauth_token_secret=(.*?)&oauth_callback.*").Groups[2].Value;

これで終了です。おつかれさまでした。

さてリクエストトークンを取得しましたら次に認証ページを表示させましょう
認証ページのURLは下の通りです

string URL="https://api.twitter.com/oauth/authorize?oauth_token=" + RequestKey + "&oauth_token_secret=" + RequestSecret;

これをブラウザーかWebViewなんかでアクセスするとこんな画面が表示されませんか?
f:id:ikarostech:20150402113624p:plain
でログインして提携アプリを許可すると7ケタの数字が表示された画面が表示されるはずです
それを何かしらの方法でstring形式で保存しておきます

そしたら今度はAccessToken/Secretを取得しましょう
おおよそRequestToken/Secret取得時と手順は一緒ですが、パラメーターとURLなどに違いがあります

・パラメーター
RequestToken/Secretの時に必要だったパラメーターに加え
{"oauth_token",RequestToken}
{"oauth_verifier",(7ケタの数字)}
が必要になります

・リクエストURL
APIURLは"https://dev.twitter.com/oauth/reference/post/oauth/access_token"
パラメーターを並べるのは一緒ですが、必ず末尾にoauth_verifierの項を持ってくる必要があります

・認証ヘッダー
不要です

・コンテンツ
こちらはRequestToken/Secretで使いませんでしたがAccessToken/Secretの取得には必要になります
といってもパラメーターの入ったDictionaryをそのまま送るだけです。

//この文をリクエストを送る前に追加するだけ
request.Content = parms;

・返ってくるデータ
返ってくる文字列の初めにRequestToken/Secretと同じように入っています。
また末尾にUser_IdとScreen_Nameに関する情報が入っています

今日はここまで!
質問等ありましたらコメントもしくはTwitterにリプライを送っていただければ応答できると思います。
ノシ

当サイトのソースコード及びその他の情報は個人・商用問わず自由に使っていただいてかかまいませんが、当サイトの情報が元で発生したいかなる結果・不利益については責任を負いかねますのでご了承ください