twitter.c ー ①ー4

twitterAPI利用プログラム作成に向けて。

 

① httpメッセージの作成

② tcpでtwitterAPI提供サーバにつなぎ、(https用ポート)sslコネクションも作る

③ リクエストの送信

④ RestAPIではメッセージを全て受信し、解析

  StreamingAPIではメッセージを随時読み込み、解析

 

①ー1 oauth_nonce を作る

①ー2 oauth_timestamp を作る

①ー3 oauth_signature を作る(一番大変)

①ー4 ちょちょいのちょいでできる

 


なお、全て説明したら全体のソースコードも掲載する予定です。

ここまできたらあとは、ちょちょいのちょいです。

httpメッセージの中に、Authorizationフィールドを作ります。
その中身は、「OAuth 」に、今までつくったoauthパラメータを「key="value", 」(カンマスペース)でつなげたもの。

それさえあれば、あとは普通のメッセージと同じように、http.cを用いてメッセージを作成します。
使わなくても:とスペースと改行とかちゃんとつなげればいいだけですけどね。

というわけで、下のようにできました。
格納すべき場所s、GETorPOST、url、POSTの場合にはあるcontent(GETの場合は""を渡す)
を引数として、sにメッセージを格納し、そのメッセージのサイズを返す関数twi_mk_messageです。
// make http message, content must be percent encoded
int twi_mk_message(char *s, int GorP, char *url, char *content){
   int k, ofst;
   char *pn = twi_mk_nonce();
   char *pt = itoa(time(NULL));
   printf("[time]\n%s\n", pt);
   char *oauth_key[7] = {"oauth_consumer_key", "oauth_nonce", "oauth_signature", "oauth_signature_method", "oauth_timestamp", "oauth_token", "oauth_version"};
   char *oauth_val[7] = {CONSUMER_KEY, pn, NULL, "HMAC-SHA1", pt, TOKEN, "1.0"};
   char base[100], host[100], pass[100], param[100];
   url_parse(url, NULL, base, host, pass, param);
   char *key[100], *value[100];
   int pnum = 0;
   url_parse_parameter(param, &pnum, key, value);
   url_parse_parameter(content, &pnum, key, value);
   for(k = 0; k < 7; ++k){
      key[pnum] = oauth_key[k];
      value[pnum] = oauth_val[k];
      pnum++;
   }
   char *ps = twi_mk_signature(GorP, base, pnum, key, value);
   oauth_val[2] = ps;
   char auth[5000];
   ofst = 0;
// make Authorization field body
   ofst += sprintf(auth, "OAuth ");
   for(k = 0; k < 7; ++k) ofst += sprintf(auth + ofst, "%s=\"%s\"%s", oauth_key[k], oauth_val[k], (k < 6) ? ", " : "");
// make header
   ofst = 0;
   ofst += http_mk_reqline(s, GorP, pass);
   ofst += http_mk_field(s + ofst, "Accept", "*/*");
   ofst += http_mk_field(s + ofst, "User-Agent", APPNAME);
   ofst += http_mk_field(s + ofst, "Content-Type", "application/x-www-form-urlencoded");
   ofst += http_mk_field(s + ofst, "Authorization", auth);
   ofst += http_mk_field(s + ofst, "Content-Length", itoa(strlen(content)));
   ofst += http_mk_field(s + ofst, "Host", host);
   ofst += http_mk_content(s + ofst, content);
   free(pn);
   free(pt);
   free(ps);
   return ofst;
}

これを使えば、下のようなメッセージができるはずです。
GET /1.1/user.json?replies=all HTTP/1.1
Accept: */*
User-Agent: torotter
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_consumer_key="2B-----------------mQ", oauth_nonce="ow---------------------------------------------Gg", oauth_signature="cjljTdQu5hwOAeqXmM9AXc2%2Fit4%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1391874316", oauth_token="16------82-RE--------------------------------------------------iY", oauth_version="1.0"
Content-Length: 0
Host: userstream.twitter.com
[改行]