PHP + Twitpic API v2 で、ファイルをアップロード


  API v1 との違い




2010/05/29

1) JSON の結果を見やすくしました
2) HTTP のやりとりが解るように、debug.txt と ret_header.txt を出力するようにしました


API v1では、全ての認証情報を暗号化も無く引き渡してしまっていましたが、API v2 では、verify_credentials を行う為のシグネチャを引き渡す事になります。これによって、Twitpic
側で資格情報の確認だけ行って、ファイルのアップロードが許可されます

※ 仮に Twitpic が 暗号化に対応しても、Twitpic に対してはシークレット部分が渡ってしまうので、
※ v1 はあまり良い仕様とは言えません。

関連する記事

PHP + Twitter API : 資格情報の確認と アプリケーションに割り当てられた My Access Token




  localhost ( Windows ) によるテストコード




※ api.twitter.com/1 以外のパスでは動作しませんでした。

ここでテストしたのは自分のアクセストークンですが、通常の認証プロセスを使うと、任意のユーザが任意のサービスで得た画像をそのまま Twitpic にアップロードする事が可能になります。

( v1 でも可能でしたが、v2 で、認証情報のシークレット部分が他人に渡る事はありません )

<?
// **********************************************************
// 資格情報の確認 ( verify_credentials )
// **********************************************************
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **********************************************************
// AOuth 用の urlencode 関数
// **********************************************************
function url_rfc3986( $str ) {
	// php 5.3.x 〜 ではこの変換は必要無い
	return str_replace('%7E', '~', rawurlencode($str));
}

// **********************************************************
// twitpic への投稿データ
// **********************************************************
$postfields = array();
$postfields['key'] = 'twitpicのAPIキー';
$postfields['media'] = '@C:\\Documents and Settings\\lightbox\\My Documents\\My Pictures\\1262357623201606.png';
$postfields['message'] = '画像用のコメント投稿';

$twit_url = 'http://api.twitpic.com/2/upload.json';
$twitter_url = 'https://api.twitter.com/1/account/verify_credentials.json';

// **********************************************************
// 認証データ
// **********************************************************
$oauth_consumer_key = "Consumer key";
$oauth_consumer_secret = "Consumer secret";
$oauth_token = "Access Token";
$oauth_secret = "Access Token Secret";

// 毎回変化するランダムな文字列
$mt = microtime();
$rand = mt_rand();
$oauth_nonce = md5($mt . $rand);

$oauth_signature_method = "HMAC-SHA1";
$oauth_timestamp = mktime();
$oauth_version = "1.0";

// *********************************************************
// シグネチャ用ベース文字列作成
/*
  httpMethod + "&" +
  url_encode(  base_uri ) + "&" +
  sorted_query_params.each  { | k, v |
      url_encode ( k ) + "%3D" +
      url_encode ( v )
  }.join("%26")
*/
// *********************************************************
$base_string = "GET";
$base_string .= "&" . url_rfc3986($twitter_url);
$base_string .= "&";

$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
$base_string .= url_rfc3986("oauth_token")."%3D".url_rfc3986($oauth_token)."%26";
$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);

// *********************************************************
// シグネチャ作成
/*
url_encode( consumer_secret ) + "&" +
url_encode( oauth_token_secret || nil )
*/
// *********************************************************
$oauth_signature = 
base64_encode( hash_hmac(
	"sha1",
	$base_string,
	url_rfc3986($oauth_consumer_secret) . "&" . url_rfc3986($oauth_secret),
	true
));

// *********************************************************
// curl 処理
// *********************************************************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $twit_url);		// ★ twitpic API 
// twitpic への投稿データ用
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);

// *********************************************************
// http ヘッダ作成
// *********************************************************
$header = array();

// 資格情報確認用の http ヘッダ
$header[] = 'X-Verify-Credentials-Authorization: OAuth realm="http://api.twitter.com/",'.
url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
url_rfc3986("oauth_token")."=\"".url_rfc3986($oauth_token)."\",".
url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\",".
url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\"";

// ★ verify_credentials を行う twitpic API v2 指定の URL 
$header[] = 'X-Auth-Service-Provider: ' . $twitter_url;

print "<pre>";
print_r($header);
print "</pre>";

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);

// *********************************************************
// 送信
// *********************************************************
curl_setopt($curl, CURLOPT_VERBOSE, true);	// デバッグ
$handle = fopen("./debug.txt", "w");
curl_setopt($curl, CURLOPT_STDERR, $handle);
$handle2 = fopen("./ret_header.txt", "w");
curl_setopt($curl, CURLOPT_WRITEHEADER, $handle2);
$result = curl_exec($curl);


// *********************************************************
// 結果
// *********************************************************
print "<br>";

if($result === false) {
	$json = 'Curl error: ' . curl_error($curl);
}
else {
	echo 'Operation completed without any errors';
	$json = json_decode($result);
}
curl_close($curl);
fclose($handle2);
fclose($handle);

//print "<pre>";
//var_dump($json);
//print "</pre>";

print "<pre>";
print_r($json);
print "</pre>";


?>






yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[sh_web]
CCBot/2.0 (http://commoncrawl.org/faq/)
17/10/19 23:32:49
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube