SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】画像付きツイートを何のライブラリも使わないで投稿する

問題

phpで画像付きツイートしたい。なるべく簡単に。

twitter-bird-white-on-blue upload with media

答え

わかりやすいかどうかは人それぞれだと思うけど、何のライブラリも使わないでコピペで動く画像付きツイートスクリプトの例は以下の通り。

<?php

//twitterのAPIを使うために必要なもの
$consumer_key = 'xxxxxxxxxxxxxxxxxxxx';
$consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$oauth_token = 'xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$oauth_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

//画像を用意する
$content_type = 'image/jpeg';
$contents = file_get_contents('test.jpg');

//本文を用意する
$status = 'テストです。テストです。';

//POSTするデータを作る
$boundary = '--' . '12345678900987654321';
$data = '--' . $boundary . "\r\n"
. 'Content-Disposition: form-data; name="status"' . "\r\n\r\n"
. $status . "\r\n"
. '--' . $boundary . "\r\n"
. 'Content-Disposition: form-data; name="media[]"; filename="' . time() . '"' . "\r\n"
. 'Content-Type: ' . $content_type . "\r\n"
. 'Content-Transfer-Encoding: binary' . "\r\n\r\n" 
. $contents . "\r\n"
. '--' . $boundary . '--' . "\r\n\r\n";

//投稿する
$url = 'https://api.twitter.com/1.1/statuses/update_with_media.json';
$method = 'POST';
$oauth_parameters = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_nonce' => microtime(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp' => time(),
    'oauth_token' => $oauth_token,
    'oauth_version' => '1.0',
);
$base_string = implode('&', array(
    rawurlencode($method),
    rawurlencode($url),
    rawurlencode(http_build_query($oauth_parameters, '', '&', PHP_QUERY_RFC3986))
));
$key = implode('&', array(rawurlencode($consumer_secret), rawurlencode($oauth_token_secret)));
$oauth_parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $base_string, $key, true));

$options = array(
    'http'=>array(
        'method' => $method,
        'header' => array(
            'Authorization: OAuth ' . http_build_query($oauth_parameters, '', ',', PHP_QUERY_RFC3986),
            'Content-Type: multipart/form-data; boundary=' . $boundary,
        ),
        'content' => $data,
        'ignore_errors' => true,
    )
);
$result = file_get_contents($url . ($get_parameters ? '?' . http_build_query($get_parameters) : ''), false, stream_context_create($options));

//結果を確認してみる
var_dump($result);

備考

上の例では画像は1つだけ。複数画像添付する手順はまた少し違うので、また別の記事で。

関連するメモ

コメント