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

AbyssLukeのガイドライン(Maybe archived)

はてダから移転。多分更新しないかもしれない。

自分が使っているアイコン変更プログラム

2010/04/26追記 使っているのがOAuth対応版に変わりました。そしてわざわざpost内容自前で作らなくてもよかった。
d:id:abyssluke:20100426:1272276372

2010/09/04追記 以下のプログラムはもう使えないので↑の日記参照。

    • -

自分がTwitterのアイコンを変更する場合、ムスカの時報プログラムからアイコン変更プログラムをWeb経由で叩き*1自動変更する場合が多い。実際明日0時にアイコンの自動変更を仕掛けてある。
というわけで自分が試行錯誤の上作成、使っているアイコン変更プログラムの中身を公開。
※サーバー上にある実際のプログラムを少し整形して隠すべき所は隠していたり、ゴニョゴニョすべき所はゴニョゴニョしているので実際に動いているものとは若干異なります

<?php
define("UA_PRM","Icon-Changer-Test/0.1");
header("Content-Type: text/plain");
$imagepath = "(画像へのパス)";
$target = "(Twitterに通知するファイル名)";
$mime = "image/png(画像のMIME-Type)";

$twitterapi = "http://twitter.com/account/update_profile_image.json";
$twitterid = "(TwitterのID)";
$twitterpw = "(TwitterのPW)";

$boundary = "-----BuDrSrNs".md5("12345".mt_rand().date("r")."678".mt_rand()."901");

$filedata = file_get_contents($imagepath);

$postdata = "--".$boundary."\r\nContent-Disposition: form-data; name=\"image\"; filename=\"".$target."\"\r\nContent-Type: ".$mime."\r\n\r\n$filedata\r\n--".$boundary."--";

$ctype = array("Content-Type: multipart/form-data; boundary=".$boundary,"Content-Length: ".strlen($postdata),"Expect:");

$curl_twitterx = curl_init();
curl_setopt($curl_twitterx, CURLOPT_URL, $twitterapi);
curl_setopt($curl_twitterx, CURLOPT_POST, true);
curl_setopt($curl_twitterx, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl_twitterx, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl_twitterx, CURLOPT_HEADER, true);
curl_setopt($curl_twitterx, CURLOPT_USERPWD, $twitterid.":".$twitterpw);
curl_setopt($curl_twitterx, CURLOPT_USERAGENT, UA_PRM);
curl_setopt($curl_twitterx, CURLOPT_HTTPHEADER, $ctype);
curl_setopt($curl_twitterx, CURLOPT_VERBOSE, true);
$stdout = fopen( 'php://stdout', 'w' );
curl_setopt($curl_twitterx, CURLOPT_STDERR,$stdout);

curl_setopt($curl_twitterx, CURLOPT_TIMEOUT, 15);
curl_exec($curl_twitterx);
$curl_status = curl_getinfo($curl_twitterx,CURLINFO_HTTP_CODE);
$curl_errcode = curl_errno($curl_twitterx);
$curl_errmsg = curl_error($curl_twitterx);
curl_close($curl_twitterx);
echo "$boundary<br>";
echo "$curl_status<br>";
echo "$curl_result<br>$curl_errcode<br>$curl_errmsg";
exit;
?>

ヘッダーのContent-Typeをtext/plainで送出していたり、php://stdoutをfopenしてるのはデバッグ*2
Boundaryに使われている"BuDrSrNs"は"BoundaryStrings"をBから2文字毎に取り出してゴニョゴニョしたもの。

元々このプログラムは、4/1のエイプリルフール時のみに自動でアイコンを変えようと作成したプログラムである。
作成時はいろいろと試行錯誤の連続。まず最初につまづいた"100-Continue"問題はヘッダー($ctypeがそれ)に"Expect:"をセットすることにより解消。curlのPOSTデータに使える"@(ファイル名)"(ファイルを送出)は実際使えないことがわかったので自前でPOSTデータを生成したり。
作成にあたりPHPマニュアルやGoogleとかにお世話になった。

もしこのプログラムを使ってくれるならありがたい。またプログラムの作成時の参考になればと。
ライセンスは特には宣言しないが自由に使っていただいて結構である。

*1:プログラムのファイル名はある程度特定しづらいファイル名にしてある

*2:実際デバッグ用のechoやcurlのSTDERRをSTDOUTにリダイレクトさせるコードが入っているが気にしない