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

ikarosの作業場

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

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

さてそれでは実際にコードを書いていきましょう。
今回の目標はアプリ上でTwitterに対する操作を行うのに必要なConsumerToken/Secret,AccessToken/Secretを取得することです。

1.ConsumerToken/Secretを取得する
Twitter Application Managementよりアプリ名を選択。
移動したサイトから「Key and Access Tokens」を選択すると表の上から
Consumer Key,Consumer Key Secretと表示されているので、その右の二つのランダムな文字列をメモ帳かなんかにメモしておきます。

これでConsumerToken/Secretを取得することができました。

2.AccessToken/Secretを取得する
AccessToken/Secretを取得するには以下の二つの方法があります
Twitter Application Managementの「Key and Access Tokens」よりオーナーのAccessToken/Secretを発行してもらう
・RestAPIを用いて取得する

今回は後者の方をとりたいと思います。
RestAPIを用いてAccessToken/Secretを取得する手はずは以下の通りです

1.RestAPIを用いてRequestToken/Secretを取得する
2.RequestToken/Secretを用いて認証ページにアクセス、認証をする
3.認証後ページに表示される7ケタの数字を何らかの方法でプログラムに保存させる
4.7ケタの数字、RequestToken/Secretを用いてRestAPIを呼び出しAccessToken/Secretを取得する

さてでは早速RestAPIを使ってRequestToken/Secretを取得してみましょう
1.RequestToken/Secretの取得
RestAPIはそのAPIによって若干の違いがありますが大体やることは一緒です

1.APIURL(リクエストをTwitterに送信するためのURL)と送信するパラメーターを元にsignatureを生成
2.signatureも含めたパラメーターとAPIURLを元に送信先URLと認証ヘッダーを作る
3.リクエストを送信する
4.返ってきた文字列を解析する

ではやってみましょう
1.signatureの生成
まずsignaturenの生成ですが以下のデータが必要になります
秘密鍵
・元データ
では秘密鍵から作っていきましょう。形式は以下の通りです

//以降「ConsumerToken/Secret」「AccessToken/Secret」「RequestToken/Secret」という変数を用います
string key = WebUtility.UrlEncode(ConsumerToken) + "&" + WebUtility.UrlEncode(AccessSecret);

今回はAccessSecretを取得しておりませんので空文字(null)として扱います

・元データ
パラメーターの羅列です。後々でも使うので使いやすいようにDictionaryで書いていきます
今回パラメーターは以下のものが必要となります
・oauth_timestamp
リクエストを送信する時間を指定します
・oauth_nonce
一定のルールの乗っ取り生成されたランダムな文字列です
・oauth_signature_method
暗号化の方法を指定します。Twitterの場合"HMAC-SHA1"です
・oauth_version
OAuth(認証方法の一つ)のバージョンを指定します。Twitterの場合"1.0"です
・oauth_consumer_key
ConsumerTokenを入れておきます

またtimestampとnonceは以下の関数で簡単に作ることができます。

public static string GenerateTimeStamp()
{
    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return Convert.ToInt64(ts.TotalSeconds).ToString();
}
public static string GenerateNonce()
{
    Random random = new Random();
    string strings = "0123456789abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string res = "";
    for (int i = 0; i < 32; i++)
        res += strings[random.Next(0, strings.Length - 1)];
    return res;
}

じゃあ書いていきましょう

var parms = new Dictionary<string,string>
{
     {"oauth_nonce",GenerateNonce()},
     {"oauth_timestamp",GenerateTimeStamp()},
     {"oauth_signature_method","HMAC-SHA1"},
     {"oauth_version","1.0"},
     {"oauth_consumer_key",ConsumerToken},
};

では暗号化される元データを作りましょう
形式は以下の通りです。パラメーターは (パラメーターの名前)=(パラメーターの値) 間は"&"でつなぎます

string base = (Method) + "&" + WebUtility.UrlEncode(APIURL) + "&" + WebUtility.UrlEncode(パラメーター)

リクエストトークンのメソッドは"POST"
APIURLはhttps://api.twitter.com/oauth/request_tokenです
(詳細はこちらをご確認ください POST oauth/request_token | Twitter Developers
具体的に書くと以下のような感じ

string base = "POST&" + WebUtility.Utility(https://api.twitter.com/oauth/request_token) + "&";
//アルファベット順にする
parms.Sort();
foreach(string key in parms.Keys)
{
     base+=WebUtility.UrlEncode(key+"="+parms.Keys);
}
//最後に余計な"&(UrlEncode語なので3文字になってるけど)"を消去
base = base.Remove(base.Length-3,3);

秘密鍵と元データができたらそしたらあとは関数に任せて暗号化しましょう
ただし関数を使うためにWindows.Security.CryptographyとWindows.Security.Cryptography.Coreを参照に追加してください。

//秘密鍵を登録
var KeyMaterial = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8);
//暗号化アルゴリズムを登録
var Converter = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
//秘密鍵を生成
var MacKey = Converter.CreateKey(KeyMaterial);

//元データを登録
var DataToBeSigned = CryptographicBuffer.ConvertStringToBinary(base, BinaryStringEncoding.Utf8);
//暗号化
var SignBuffer = CryptographicEngine.Sign(MacKey, DataToBeSigned);

//string形式で暗号を読み取る
string signature = CryptographicBuffer.EncodeToBase64String(SignBuffer);
//URLエンコード
signature=WebUtility.UrlEncode(signature);

これでsignatureを取得することができました
次回はRequestToken/Secret,AccessToken/Secretを取得したいと思います

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