![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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 …
$params = array(
'status' => $message,
'media[]' => $content_base64 . ";type=" . $imagesize['mime'] . ";filename=" . basename( $file ),
);
----------------------------------------------------------------
という方法を行ってみましたが、エラーが「0」という形で返ってきてしまいます。
twitter developersのwebsite・Callback URLは自分のドメイン名を設定しています。アクセスレベルは「Read and write」です。
文字の投稿はできているので、$params 周辺の記載に問題があると考えています。
TwitterAPI関係に詳しい方がおられましたら、よい方法を教えていただければと思います。
宜しくお願い致します。
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 …
$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 …
$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/stat …
現在は以下の方法が推奨されています。
https://dev.twitter.com/rest/public/uploading-me …
・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());
}
To_aru_User様
詳しいご回答ありがとうございました。
ここまで詳しく書いていただけると、だいぶ前に進むことができそうです。
「Uploading Media: Multiple Photos」が推奨ということも知りませんでした。
理解するのには時間がかかりそうですが、ひとつひとつ理解を深めていきたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- HTML・CSS ブロックエディターで作りつつ、画像を挿入しつつ、画像にスタイルシートのコードを付ける方法はありますか 1 2022/08/23 18:46
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アロー演算子について
-
関数の動きと記述方法の意味を...
-
templateクラスについて
-
protectedなのにアクセスできな...
-
独習C言語のコンパイル
-
protectedなのにアクセスできな...
-
検索結果へのリンク
-
エラーの理由が分りません。Pri...
-
classの再定義エラーについて
-
.htaccessによる301リダイレクト
-
DLL内でnewしたインスタンスを...
-
サブネットマスクを用いたIP制...
-
ユーザー関数の外の変数は呼べ...
-
変数格納 クォーテーション「...
-
htmlで変数の表示
-
PHPで、相対的な変数名の場合の...
-
fwriteで改行出来ない
-
関数内関数から関数外関数を呼...
-
IIS5.1で「規定のドキュメント...
-
if文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
VB.NETからVBAマクロ(引数)を呼...
-
PHP、ヒアドキュメント内でのIF...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
vb作成したらでbeep音が鳴りま...
-
次のhtml・cssでspan内の文字を...
-
classの再定義エラーについて
-
既存関数の上書き
-
protectedなのにアクセスできな...
-
配列の操作時にLNK2001外部シン...
-
UNIX CP "で上書きしません"
-
PHPでの画像の形式の変換
-
PHPプログラム上で「URLを直接...
-
Let's Encryptで自動更新がされ...
-
ExcelVBAで部分一致(*)をしたい
-
VB6のコンボボックスのテキスト...
-
ASPのResponse.WriteをPHPでは...
おすすめ情報