• 締切済み

tmhOAuthでtwitterに画像投稿

tmhOAuthとTwitterAPIを使ってサーバーに保存してある画像をtwitterに投稿したいと考えています。 tmhOAuthを使ってつぶやき(文字列)の投稿は成功しています。 画像の投稿になるとうまく行きません。ウェブ上で情報を探せるだけ探して数日間トライしてみましたが、どれも成功には至りませんでした。 「開発環境」 PHP:5.5 Cakephp:2.5 function test(){ $twConf = array( 'consumer_key' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'consumer_secret' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'user_token' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'user_secret' => 'xxxxxxxxxxxxxxxxxxxxxxx', 'curl_ssl_verifypeer' => false, ); $tmhOAuth = new tmhOAuth($twConf); $image ='http://www.example.com/img/test.jpg'; $message='hoge hoge'; $params = array( 'media[]' => "@{$image}", 'status' => "{$message}" ); $code = $tmhOAuth->request('POST', $endpoint, $params, true, true); if ($tmhOAuth->response["code"] == 200){ var_dump($tmhOAuth->response["response"]); } else { var_dump($tmhOAuth->response["error"]); } } このソースを実行するとエラーレスポンスが返らずに$codeの中身は403となります。 (何かのエラーが返ってきているようです) 上記のやり方以外にも ---------------------------------------------------------------- $file = 'http://www.example.com/img/test.jpg'; $image = file_get_contents( $file ); $imagesize = getimagesize( $file ); $content_base64 = base64_encode($image); $api_url = 'https://api.twitter.com/1.1/statuses/update_with_media.json'; $params = array( 'status' => $message, 'media[]' => $content_base64 . ";type=" . $imagesize['mime'] . ";filename=" . basename( $file ), ); ---------------------------------------------------------------- という方法を行ってみましたが、エラーが「0」という形で返ってきてしまいます。 twitter developersのwebsite・Callback URLは自分のドメイン名を設定しています。アクセスレベルは「Read and write」です。 文字の投稿はできているので、$params 周辺の記載に問題があると考えています。 TwitterAPI関係に詳しい方がおられましたら、よい方法を教えていただければと思います。 宜しくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数8

みんなの回答

noname#244856
noname#244856
回答No.1

【解決策】 リモートパスは「@」では指定できないようです。正しくは、テンポラリファイルにリモートデータを書き込んだあと、そのパスを指定します。 $twConf = [ ....'consumer_key' => 'xxx', ....'consumer_secret' => 'xxx', ....'user_token' => 'xxx', ....'user_secret' => 'xxx', ....'curl_ssl_verifypeer' => false, ]; $endpoint = 'https://api.twitter.com/1.1/statuses/update_with_media.json'; $status = 'hoge hoge'; $media = 'http://www.example.com/img/test.jpg'; $tmhOAuth = new tmhOAuth($twConf); $tmp = tmpfile(); stream_copy_to_stream(fopen($media, 'rb'), $tmp); $params = [ ....'status' => $status, ....'media[]' => '@' . stream_get_meta_data($tmp)['uri'], ]; $tmhOAuth->request('POST', $endpoint, $params, true, true); var_dump(json_decode($tmhOAuth->response['response'])); 実際には、のちに説明する問題上、ツイートの前に常に半角スペースを付加すべきです。 $twConf = [ ....'consumer_key' => 'xxx', ....'consumer_secret' => 'xxx', ....'user_token' => 'xxx', ....'user_secret' => 'xxx', ....'curl_ssl_verifypeer' => false, ]; $endpoint = 'https://api.twitter.com/1.1/statuses/update_with_media.json'; $status = 'hoge hoge'; $media = 'http://www.example.com/img/test.jpg'; $tmhOAuth = new tmhOAuth($twConf); $tmp = tmpfile(); stream_copy_to_stream(fopen($media, 'rb'), $tmp); $params = [ ....'status' => ' ' . $status, ....'media[]' => '@' . stream_get_meta_data($tmp)['uri'], ]; $tmhOAuth->request('POST', $endpoint, $params, true, true); var_dump(json_decode($tmhOAuth->response['response'])); 【そもそも「POST statuses/update_with_media」が非推奨である】 ・複数画像アップロードのためには「media[]」という同名のキーを複数セットするように当初は設計されていたが、連想配列(ハッシュ)で同名のキーを扱えるプログラミング言語がそうそう無い。 ・マルチパートリクエスト送信に関して、PHPのcURL関数の設計に問題があり、そのことについて全く考慮が為されていない手抜きライブラリがあまりにも普及しすぎてしまった。(tmhOAuthもそのうちの1つ) http://qiita.com/mpyw/items/c2d2f9cf67072e926721 このような背景があり、このエンドポイントは複数画像アップロード可能になることもなく非推奨にされたようです。TwitterAPIのドキュメントを見るとしっかり「Deprecated」と書かれています。 https://dev.twitter.com/rest/reference/post/statuses/update_with_media 現在は以下の方法が推奨されています。 https://dev.twitter.com/rest/public/uploading-media-multiple-photos ・1枚ずつアップロードし、更にツイートを実行するリクエストはアップロードとは別に必要なため、必ず2回以上のリクエストが発生します。 ・パラメータ名が「media[]」ではなく「media」であることに注意してください。 ・画像データは、非マルチパートの場合はBASE64エンコードしてセットします。マルチパートの場合は何もせずそのままセットします。以前はマルチパート必須でしたが、新しいエンドポイントはどちらでも受け付けるようになっています。「media」と「status」は混在しないため、どちらを採用しても以前発生していたようなcURL関数特有の問題は発生しません。 【宣伝: もっと洗練されたライブラリ、使ってみませんか?】 https://github.com/mpyw/TwistOAuth [旧いエンドポイントを使う場合] try { ....$to = new TwistOAuth('xxx', 'xxx', 'xxx', 'xxx'); ....var_dump($to->postMultipart('statuses/update_with_media', [ ........'status' => 'hoge hoge', ........'@media[]' => 'http://www.example.com/img/test.jpg', ....])); } catch (TwistException $e) { ....var_dump($e->getMessage()); } [新しいエンドポイントを使う場合] try { ....$to = new TwistOAuth('xxx', 'xxx', 'xxx', 'xxx'); ....var_dump($to->post('statuses/update', [ ........'status' => ............'hoge hoge', ........'media_ids' => ............$to->postMultipart('media/upload', [ ................'@media' => 'http://www.example.com/img/test.jpg', ............])->media_id_string, ....])); } catch (TwistException $e) { ....var_dump($e->getMessage()); }

hpmt28
質問者

お礼

To_aru_User様 詳しいご回答ありがとうございました。 ここまで詳しく書いていただけると、だいぶ前に進むことができそうです。 「Uploading Media: Multiple Photos」が推奨ということも知りませんでした。 理解するのには時間がかかりそうですが、ひとつひとつ理解を深めていきたいと思います。

関連するQ&A

  • codebirdでプロフィール画像を変更できない

    入門書を読んだ程度のphp初心者です。 codebird.phpを使用してtwitterのAPIにアクセスして情報を取得したり文章を投稿したり一通り試してみたのですが account/update_profile_imageとaccount/update_profile_background_imageだけエラーが返ってきてしまいます。 require_once("codebird.php"); \Codebird\Codebird::setConsumerKey($consumer_key, $consumer_secret); $cb = \Codebird\Codebird::getInstance(); $cb->setToken($access_token, $access_token_secret); $params = array("image" => "xxx.png"); $response = $cb->account_updateProfileImage($params); print_r($response); を実行すると Array ( [errors] => Array ( [0] => Array ( [code] => 91 [message] => One or more parameters contains an invalid UTF-8 sequence ) ) [httpstatus] => 400 ) と返ってきてプロフィール画像が変更されません。他のライブラリでは成功しますし、 statuses/update_with_mediaでは文章・画像共に投稿できたので、画像ファイルに問題はないと思います。 どうすればcodebird.phpでプロフィール画像を変更できるようになるのでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP
  • TwitterAPIの検索が使えません。

    TwitterAPIの検索の【GET Search/tweets】の使い方が良くわかりません。 他のはいくつか旨くいった方法で同じように書いているのですが使えないのです。 以下のように書いています。 ==========ここから=========== <?php //twitterAPIライブラリの読み込み require_once('twitteroauth/twitteroauth.php'); //キー $Consumer_key = '*****************'; $Consumer_secret = '*****************'; $Access_token = '*****************'; $Access_token_secret = '*****************'; $conn= new TwitterOAuth($Consumer_key,$Consumer_secret,$Access_token,$Access_token_secret); $para = array('q'=>'test','count'=>'4'); $result=$conn->GET('search/tweets',$para); echo "<pre>"; print_r($result); echo "</pre>"; ?> ==========ここまで=========== するとエラーコード34のエラーが出て取得できません。。。 上記のような書き方で、ツイートするとか指定のIDをフォローするなどは正常に動いているので、キーが違うなどのエラーは無いはずです。 わかる方居ましたらお願いします。

    • ベストアンサー
    • PHP
  • OAuth認証でtwitterにアクセスできません

    PHPでOAuth認証でtwitterにつぶやきを投稿するプログラムを作ってます。 twitterの画面までは飛ぶのですが。 こちらです。 このページに対するリクエスト・トークンがありません。アプリケーションがTwitterアカウントを使用するかどうかを確認するために必要な特殊キーです。 送信したサイトまたはアプリケーションに戻って再度お試しください。何らかの手違いがあったかもしれません。 という文章が出てきて、アプリ認証画面に飛びません。 twitterのdeveloperのページでちゃんと登録して、キーなどはちゃんと入力しました。 今はローカルで試しています。 該当のプログラムはこんな感じです。 ~~~~~~ $twitter = new tmhOAuth( array("consumer_key"=>"****","consumer_secret"=>"****")); $here = tmhUtilities::php_self(); session_start(); if(isset($_REQUEST["command"]))switch($_REQUEST["command"]){ case "authorize"; //OAuth認可,まずリクエストトークンを取得 $twitter->request("POST",$twitter->url("oauth/request_token",""), array("oauth_callback" => $here."?command=callback")); //リクエストトークンはコールバックを受けてアクセストークンする際に必要なのでセッションに格納 $_SESSION["request_token"] = $twitter->extract_params($twitter->response["response"]); //twitterの認証画面へリダイレクト header("Location:".$twitter->url("oauth/authorize","")."?oauth_token={$_SESSION['request_token']['oauth_token']}"); break; ~~~~~~

    • 締切済み
    • PHP
  • ツイッターAPIについて

    今回私は http://nanapi.jp/11891/ の通りにツイッターアプリを作ることにしました。 開発環境はeclipceです。ここで問題なのは 上記サイトのステップ6のソースコードの18行目の Twitter twitter = factory.getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET); と39行目の Twitter twitterAct = factory.getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET, accessToken); にエラーが起きました。 そのエラー内容は「メソッドgetOAuthAuthorizedInstance(String, String, AccessToken)は型 TwitterFactoryで未定義です。」との事でした。上記URLのソースをコピペしただけなのですが何か間違っているのでしょうか?もしかしたら私がeclipce初心者なのでTwitter4Jのパッチの当て方やプロジェクトの作り方そのものが間違っていた可能性もありますが・・・ よろしくお願いします。

  • TwitterのOauth認証プログラムについて

    TwitterのOauth認証プログラムについて 現在、Oauth認証を使って、一般ユーザが認証確認後、 WEBから投稿できるシステムを作ろうとしています。 Oauth_TokenとOauth_Token_Secretは、 $tok = $to->getRequestToken(); で取得されたものを変数として保持して取得しようとしているのですが、 この2つの認証コードと、固有の consumer_keyとconsumer_secretを使用して 認証させ、投稿プログラム $req = $to->OAuthRequest("https://twitter.com/statuses/update.xml","POST",array("status"=> $tweet . " " . $url . " #" . $hash)); を実行させると、なぜか <?xml version="1.0" encoding="UTF-8" ?> - <hash> <request>/statuses/update.xml</request> <error>Could not authenticate you.</error> </hash> つまり、認証されてない状態になってしまいます。 Oauth_TokenとOauth_Token_Secretを取得している場所が間違っているのでしょうか? もしかしてこの2つのコードが逆だったのかもしれないと思い、 逆にして投稿してみたのですが、それでも同じエラー画面に飛んでしまいます。 なぜだか分かる方、いらっしゃいますか?

    • ベストアンサー
    • PHP
  • twitterのbotが動かなくなりました。

    twitterのbotがtwitterAPI1.1へのバージョンアップで動かなくなりました。 当方素人なため、最初製作した時もググりながらでしたのでさっぱりわかりません。 コードを書き直す以外にも何かやらなければならないのでしょうか? 下記以外にもファイルがありますが他にも修正しなければいけないのでしょうか? 易しく教えていただけると助かります。 ↓↓↓bot.phpのコードです↓↓↓ #!/usr/local/bin/php <?php require_once ("./oauth/twitteroauth.php"); //インクルードパスを基準に書いたら何故かコマンドラインからの実行でrequrireされなかったのでこのように相対パスを記述 //以下は、上記URLから取得した内容をコピペ $consumer_key = '**************'; $consumer_secret = '*******************'; $access_token = '***************'; $access_token_secret = '**********************'; //リクエストURL作成、XML取得。ここでは5件取得するよう記述 $keyword = urlencode('**'); $url = "http://search.twitter.com/search.atom?q=".$keyword."&rpp=5"; $xml = simplexml_load_file($url); //for文で5件をリツイート for($i=5;$i>0;$i--){ $id = $xml->entry[$i]->id; //それぞれのつぶやきからidを取得 $id = str_replace('tag:search.twitter.com,2005:','',$id); //使うidの部分だけ抜き取る $endpoint = "http://api.twitter.com/1/statuses/retweet/".$id.".xml"; //エンドポイントURL作成 $to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret); //twitteroauthクラスのインスタンス生成。 $req = $to->OAuthRequest($endpoint,'POST',array()); //リクエスト送信。リツイートされる。 } ?>

    • 締切済み
    • PHP
  • C++でのTwitter画像投稿

    現在、twicpp(http://www.soramimi.jp/twicpp/)を使ってC++でTwitter投稿を勉強しています。通常の投稿は何とか出来たのですが。画像投稿をどうすれば良いか見当もつかず困ってます。ヒントなどご教示いただければ助かります。 twicppのmain.cppを以下のように変更して、request parameterに画像ファイルを渡せば良いかと考えましたが、画像ファイルをどうやってparameterにエンコードすれば良いのか分からず、詰まってしまっています。そもそもこれだけで大丈夫なのかも自信がなくて。 std::string uri = "http://api.twitter.com/1/statuses/update.xml"; // 2012-11-15 uri += "?status="; uri += oauth_url_escape(message.c_str()); ↓ std::string uri = "http://upload.twitter.com/1/statuses/update_with_media.xml"; uri += "?status="; uri += oauth_url_escape(message.c_str()); uri += "&media[]="; uri += ここをどうすれば良い?; twicppを使っての画像投稿についてご教示願います。 以上よろしくお願いします。

  • twitterのOAuth認証+xml抽出(php

    こんにちは。 PHPのプログラムで分からない部分があるので質問させてください。 twitterAPIを用いてアカウントの情報のxmlを取得し、simplexmlで解析して ・フォロワー数 ・フォロー数 ・リストされている数 ・ツイート数 ・認証アカウントかどうか といったステータスをsimplexml_load_fileで読み込んで、抽出して変数に入れたいのですが・・・ (この変数に入れたステータスで色々と計算をする予定です) エラーが出てファイルを読み込んでくれません。 ユーザー情報を取得するAPIが認証を通さないといけないため、OAuthを用いて認証しています。 認証が必要のないAPIで返ってきたxmlは問題無くsimplexml_load_fileが使えます。 ちなみにさくらのレンタルサーバーのスタンダードで、PHPのバージョンは5.2.17です。 色々試してみたのですが、何が原因なのか分からないので、ご教授お願いします。 <コード> <?php // twitteroauth.phpを読み込む。 require_once("twitteroauth.php"); // Consumer keyの値 $consumer_key = "******"; // Consumer secretの値 $consumer_secret = "*****"; // Access Tokenの値 $access_token = "******"; // Access Token Secretの値 $access_token_secret = "******"; // OAuthオブジェクト生成 $to = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret); $req = $to->OAuthRequest("http://api.twitter.com/1/users/show/id.xml","GET",array("user_id"=>"******")); $xml = simplexml_load_file($req) or die("XMLパースエラー"); ?> <実行結果> Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "<?xml version="1.0" encoding="UTF-8"?> <user> <id>*******</id> <name>******</name> <screen_name>******</screen_name> <location>九州</location> <description>webクリエイ ・・・(以下略)・・・ ;。 &am in /home/*********/www/newfile.php on line 20 XMLパースエラー

    • 締切済み
    • PHP
  • Twitter BOTのアイコン変更について

    Twitter BOTのアイコン変更について http://twbot.blogspot.com/2010/03/easybotter2pearhttpoauth.html?spref=tw 上記のサイトを参考に、Twitter BOTのアイコン変更をしたいと思っています。 同じく、上記サイトからDLできるソースをそのまま設置しbot.phpを実行したのですが 以下のエラーが表示され、アイコン変更は出来ませんでした。 エラー内容 Fatal error: Call to undefined method HTTP_OAuth_Consumer::sendRequest2() in /home/***/public_html/***/bot.php on line 11 line 11 のソース $response = $eb->consumer->sendRequest2('http://twitter.com/account/update_profile_image.xml', null, "POST", array('image' => 'fc.jpg','mime' => 'image/jpeg')); OAuthの関係かと思ったのですが、通常の動作(post)は出来、困惑しております。 どなたが御知恵を拝借頂けますと助かります。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHPでパースエラーが出て困ってます 初心者です

    PHP初心者でろくに調べもしずにすいません>< 今、PHPでTwitterに投稿するPHPスクリプトを作っているのですが・・・ $url = "http://twitter.com/statuses/update.xml?"; $username = $_POST["name"]; $password = $_POST["pass"]; $message = $_POST["message"] $params = "status=". rawurlencode($message); $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password) ) ))); 5行目の所でエラーが出てしまい、投稿する事が出来ません どうしたら正常な動作をしてくれるのでしょうか? よろしくお願いします。

専門家に質問してみよう