SQLの窓

2013年09月23日


PHP : 少し強引ですが、twitteroauth の画像アップロード対応( statuses/update_with_media )

$_POST['image_path'] = "c:\\user\\_img.png";
$_POST['image_status'] = "画像アップロード投稿";

と、こんな感じでテストしました。画面があれば、二つのフィールドを作ればいいでしょう。image_path は、PHP スクリプトから見たパスなんで、実際問題として PHP で画像アップロードって使いどころがあまり無いですが、ローカルからバッチ処理なら意味あると思います。
  /**
   * Make an HTTP request
   *
   * @return API results
   */
  function http($url, $method, $postfields = NULL) {
    $this->http_info = array();
    $ci = curl_init();
    /* Curl settings */
    curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
    curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
//    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
    curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
    curl_setopt($ci, CURLOPT_HEADER, FALSE);

    switch ($method) {
      case 'POST':
        curl_setopt($ci, CURLOPT_POST, TRUE);
        if (!empty($postfields)) {

if ( $_POST['image_path'] != '' ) {

	// postfields から認証情報を取り出して、ヘッダーを作成
	// ※ 呼び出し時には、フィールドは指定しない
	$wk = explode("&", $postfields);
	$data = array();
	$header_oauth = "";
	for( $i = 0; $i < count($wk); $i++ ) {
		$wk2 = explode("=", $wk[$i]);
		if ( $wk2[0] != '' ) {
			if( $header_oauth == '' ) {
				$header_oauth .= "Authorization: OAuth " . "{$wk2[0]}={$wk2[1]}";
			}
			else {
				$header_oauth .= ", " . "{$wk2[0]}={$wk2[1]}";
			}
		}
	}
	curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:', $header_oauth));

	$file_post_data = array();
	$file_post_data["media[]"] = "@" . $_POST['image_path'];
	$file_post_data["status"] = $_POST['image_status'];

          curl_setopt($ci, CURLOPT_POSTFIELDS, $file_post_data);
}
else {
          curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}

        }
        break;
      case 'DELETE':
        curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
        if (!empty($postfields)) {
          $url = "{$url}?{$postfields}";
        }
    }

    curl_setopt($ci, CURLOPT_URL, $url);
    $response = curl_exec($ci);
    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
    $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
    $this->url = $url;
    curl_close ($ci);
    return $response;
  }
要点は二つあって、CURLOPT_HTTPHEADER でヘッダをセットするので、追加で認証情報をするところです。もう一つは、ファイルのアップロード用データとして、連想配列でデータを作成して、ファイルのパスの前に @ をセットして CURLOPT_POSTFIELDS にセットするところです。

認証情報には、oauth_ 以外は使われないので、twitteroauth には、URL しか渡さないようにします。
( ※ 他のオプションは試していません )

ちなみに、PHP 5.5.0 以降、@ プレフィックスは非推奨になったと PHP マニュアルには書かれています。どーすんだとか思ったら、CURLFile というクラスがあるからそれを使えという事です。



posted by lightbox at 2013-09-23 01:41 | PHP + Twitter | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり