そのうち書こうとおもいつつ放置しておいた記事をば。
ソウルジェムメーカーで実装した画像付きツイートの方法について。
今後も使いそうなので、忘れないようにメモしておきます。
multipart/form-dataのPOSTに対応している「tmhOAuth」を使ったやり方です。
1年以上前の記事です。情報が古くなっている可能性があります。
Contents
画像付きツイートをする手順
画像付きツイートには方法としては2つあります。
1. 画像を新しくTwitterにアップロードしてツイート
Twitter API 1.1 + PHP で画像付きPOSTで紹介されている方法です。
アプリを認証して、ローカルから画像を選択し、Twitterにアップロードと同時にツイート。
$params = array(
'media[]' => "@" . $_FILES['picture']['tmp_name'] . ";".
"type=" . $_FILES['picture']['type'] . ";".
"filename=" . $_FILES['picture']['name'],
'status' => $_POST['tweet']
);
こんな感じでデータを渡してます。
2. サーバにすでにある画像をTwitterにアップロードしてツイート
【php】twitterのREST APIで画像付きツイートをする at softelメモ
ここの参考で書かれているように、サーバ上にある画像を指定&取得し、Twitterにアップロード&ツイート。
$upImg = "test.jpg";
$params = array(
'media[]' => "@{$upImg}",
'status' => $_POST['tweet']
);
データをそのまま指定して渡します。
動的に画像を生成する場合
上記の方法は画像がすでにある場合の方法でしたが、今度は動的に画像を生成した場合はどうするのか。
最初はこんな感じで考えていたんですが、
$upImg = "test.jpg";
$image = new Imagick($upImg);
// ここで画像生成のあれこれ
$image->setImageFormat('png');
$params = array(
'media[]' => "@" . $image . ";".
"type=image/png;".
"filename=test.png",
'status' => $_POST['tweet']
);
$image->clear();
動きませんでした。_(:3 」∠ )_
ヘッダーとかそういうのの問題なのかなーということで、以下のようにやったらできました。
$upImg = "test.jpg";
$mFile = 'magick.png';
$image = new Imagick($upImg);
// ここで画像生成のあれこれ
$image->setImageFormat('png');
$image->writeImage($mFile); //一度画像を書き出す
$params = array(
'media[]' => "@{$mFile}",
'status' => $_POST['tweet']
);
// 〜〜 中略 〜〜
// 一番最後に書く
unlink($mFile); //書き出した画像を削除
$image->clear();
unlink()のタイミングを間違えると、画像がツイートされる前に画像が消えてしまうので注意です。
tmhOAuthでツイートしたときのURL
tmhOAuthを使ってツイートした時のツイートURLの取得方法。
$response = $tmh->response;
$data = json_decode($response["response"]);
$stNum = '';
foreach($data as $key => $value) {
if($key == 'id_str'){$stNum = $value;break;}
}
$tweetURL = 'https://twitter.com/'.$_SESSION['user']['screen_name'].'/status/'.$stNum;
//ツイートへリンク
echo '<a href="'.$tweetURL.'" target="_blank">'.$tweetURL.'</a>';
//ツイートを表示
echo '<blockquote class="twitter-tweet" lang="ja"><a href="'.$tweetURL.'" target="_blank">'.$tweetURL.'</a></blockquote>';
echo '<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>';
画像が複数投稿出来るようになったわけですが
ためしにファイルを複数アップする方法のようにしてみたんですが、できませんでした。
何かしら方法はあると思うんですけど、単純ではないようです。
ページのIDとかはどうやって渡すのか?
ソウルジェムメーカーでは個別ページから画像付きツイートボタンクリック→アプリ認証→ツイートページという風に遷移します。
アプリ認証を間に挟むので、個別ページのIDを渡す方法にちょっと頭をひねりました。
画像付きツイートをする場合、アクセストークンなどは全てセッションに格納していたので、
$response = $tmh->extract_params($tmh->response['response']);
// oauth token, secret を保存
$_SESSION['oauth_token'] = $response['oauth_token'];
$_SESSION['oauth_token_secret'] = $response['oauth_token_secret'];
$_SESSION['pageID'] = $pageID; // ←ここで個別ページIDもセッションに格納
// 認証用URL生成。
$OAuthURL = $tmh->url('oauth/authorize', '') . "?oauth_token=" . $response['oauth_token'];
こんな感じでやってました。
画像付きツイートは色々なwebサービスで使えるので、便利ですよ@・ェ・@

