PHPでTwitterに投稿(ツイート)する

(1/1)
Twitter - PHP
PHPで Twitter にメッセージを投稿(ツイート)するプログラムを作る。PHP5でなければ動かなかったり、PEARが必要なものが出回っているが、ここではPHP 5以上でフレームワークを必要としないプログラムを作ることを目標にする。
(2022年1月4日)PHP8対応,リファラ・チェック改良
(2016年2月11日)pahooTwitterAPIクラスを分離
(2014年1月19日)Twitter API呼び出しのhttps対応
(2013年7月21日)Twitter API 1.0が廃止になったため、API 1.1 に対応
(2010年9月10日)BASIC認証が利用できなくなったため、OAuth認証に対応

サンプル・プログラムの実行例

PHPでTwitterに投稿(ツイート)する

サンプル・プログラム

圧縮ファイルの内容
putTwitter.phpサンプル・プログラム本体
pahooTwitterAPI.phpTwitter APIに関わるクラス pahooTwitterAPI。
使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。
OAuth認証処理を行うコードについては、「PHP4でoAuth。Twitter APIでつぶやく。『マチルダさ~ん』」(motooLogue)および「Twitter APIの使い方まとめ」(シンカー)を参考にさせていただいた。便利なコードを公開されていることに感謝する。

準備:pahooTwitterAPI クラス

0022:     //OAuth用パラメータ
0023:     // https://apps.twitter.com/
0024:     var $TWTR_CONSUMER_KEY    = '***************';  //Cunsumer key
0025:     var $TWTR_CONSUMER_SECRET = '***************';  //Consumer secret
0026:     var $TWTR_ACCESS_KEY      = '***************';  //Access Token (oauth_token)
0027:     var $TWTR_ACCESS_SECRET   = '***************';  //Access Token Secret (oauth_token_secret)
0028: 

TwitterAPI を利用するために、クラスファイル "pahooTwitterAPI.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。

事前にプログラムを登録しておく必要があり、その方法は「Twitter API - WebAPIの登録方法」を参照されたい。入手したパラメータを、上述の変数に代入しておくこと。

PHP の https対応

Twitter APIの呼び出しはhttps通信で行うため、PHPにOpenSSLモジュールが組み込まれている必要がある。
関数  phpinfo  を使って、下図のように表示されればOK。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、phop.iniの下記の行を有効化する。
extension=php_openssl.dll


Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

Twitter API:POST statuses/update

ツイートするには、「Twitter API:POST statuses/update」を用いる。
WebAPIのURL
URL
https://api.twitter.com/1.1/statuses/update.json

入力パラメータ
フィールド名 要否 内  容
status 必須 投稿文。UTF-8でエンコードされたテキストで、140文字以下。
応答データ(一部)(json) id_str 投稿ID created_at 投稿日時 text 投稿文 user screen_name ユーザー名 retweet_count リツイート回数

解説:リクエスト

0127: /**
0128:  * Twitter API:アクセストークンを用いたリクエスト(ユーザー認証あり)
0129:  * @param   string $url    TwitterAPIのリクエストURL
0130:  * @param   string $method GET|POST
0131:  * @param   array  $optionオプションパラメータ配列
0132:  * @return  bool TRUE:リクエスト成功/FALSE:失敗
0133: */
0134: function request_user($url$method$option) {
0135:     //キー生成
0136:     $signature_key = $this->_rawurlencode($this->TWTR_CONSUMER_SECRET) . '&' . $this->_rawurlencode($this->TWTR_ACCESS_SECRET);
0137: 
0138:     //パラメータ
0139:     $params = array(
0140:         'oauth_token'              => $this->TWTR_ACCESS_KEY,
0141:         'oauth_consumer_key'       => $this->TWTR_CONSUMER_KEY,
0142:         'oauth_signature_method'   => 'HMAC-SHA1',
0143:         'oauth_timestamp'          => time(),
0144:         'oauth_nonce'              => microtime(),
0145:         'oauth_version'                => '1.0'
0146:     );
0147:     $params = array_merge($option$params);
0148:     ksort($params) ;
0149: 
0150:     //リクエスト文字列生成
0151:     $request_params = http_build_query($params, '', '&');
0152:     $request_params = $this->_rawurlencode($request_params);
0153:     $encoded_request_method = $this->_rawurlencode($method);
0154:     $encoded_request_url = $this->_rawurlencode($url);
0155: 
0156:     //シグネチャ生成
0157:     $signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params;
0158:     $hash = hash_hmac('sha1', $signature_data$signature_keyTRUE);
0159:     $signature = base64_encode($hash);
0160:     $params['oauth_signature'] = $signature;
0161: 
0162:     //ヘッダ文字列生成
0163:     $header_params = http_build_query($params, '', ',');
0164: 
0165:     //リクエスト用コンテキスト
0166:     $context = array(
0167:         'http' => array(
0168:             'method' => $method,           //リクエストメソッド
0169:             'header' => array(             //ヘッダー
0170:                 'Authorization: OAuth ' . $header_params
0171:             ),
0172:         ),
0173:     );
0174: 
0175:     //オプション処理
0176:     if (count($option) > 0) {
0177:         if ($method == 'GET') {
0178:             $url .= '?' . http_build_query($option);
0179:         } else {
0180:             $context['http']['content'] = http_build_query($option) ;
0181:         }
0182:     }
0183: 
0184:     // cURLを使ってリクエスト
0185:     $curl = curl_init() ;
0186:     curl_setopt($curlCURLOPT_URL , $url);
0187:     curl_setopt($curlCURLOPT_HEADER, 1) ; 
0188:     curl_setopt($curlCURLOPT_CUSTOMREQUEST$context['http']['method']);
0189:     curl_setopt($curlCURLOPT_SSL_VERIFYPEER , FALSE);      //証明書は無視
0190:     curl_setopt($curlCURLOPT_RETURNTRANSFERTRUE);        //結果を文字列で
0191:     curl_setopt($curlCURLOPT_HTTPHEADER$context['http']['header']);
0192:     if (isset($context['http']['content']) && !empty($context['http']['content'])) {
0193:         curl_setopt($curlCURLOPT_POSTFIELDS$context['http']['content']);          //リクエストボディ
0194:     }
0195:     curl_setopt($curlCURLOPT_TIMEOUT, 5);
0196:     $res1 = curl_exec($curl);
0197:     $res2 = curl_getinfo($curl);
0198:     curl_close($curl);
0199: 
0200:     //結果処理
0201:     $this->webapi = $url;
0202:     $json = substr($res1$res2['header_size']);
0203:     if ($this->isphp7over()) {
0204:         $this->responses = @json_decode($jsonFALSE, 512, JSON_BIGINT_AS_STRING);
0205:     } else {
0206:         $this->responses = @json_decode($jsonFALSE, 512);
0207:     }
0208:     if (isset($this->responses->errors)) {
0209:         $this->error   = TRUE;
0210:         $this->errmsg  = $this->responses->errors[0]->message;
0211:         $this->errcode = $this->responses->errors[0]->code;
0212:     }
0213: 
0214:     return (! $this->error);
0215: }

Twitter APIへのリクエスト処理は、ユーザー関数 request_user で行う。大部分は OAuth認証のための処理である。
Twitter APIの戻り値はJSON形式である。結果をデコードし、クラス変数 $responses に代入しておく。同時にエラー判定も行う。

解説:ツイート

0335: /**
0336:  * 投稿する
0337:  * @param   string $message投稿メッセージ(UTF-8限定)
0338:  * @return  bool TRUE:リクエスト成功/FALSE:失敗
0339: */
0340: function tweet($message) {
0341:     $url    = 'https://api.twitter.com/1.1/statuses/update.json';
0342:     $method = 'POST' ;
0343:     $option = array('status' => $message);
0344: 
0345:     return $this->request_user($url$method$option);
0346: }

ツイートは、Twitter APIの "POST statuses/update" を用いる。
先ほど紹介したユーザー関数 request_user に対し、リクエストURL、メソッド(POSTまたはGET)、投稿文を渡すだけで完了である。

解説:メイン・プログラム

0200: //ツイート実行
0201: if ($msg != '') {
0202:     $msg = htmlspecialchars($msg);
0203:     if ($ptw->twitter_strlen($msg) <= 140) {
0204:         $res = $ptw->tweet($msg);
0205:         if ($res == FALSE) {
0206:             $outmsg = '<p style="text:red;">投稿失敗:' . $ptw->errmsg . '</p>';
0207:         } else {
0208:             $id_str = (string)$ptw->responses->id_str;
0209:             $url = 'https://twitter.com/' . (string)$ptw->responses->user->screen_name . '/status/' . $id_str;
0210:             $outmsg = '<p>投稿成功:<a href="' . $url . '">' . $url . '</a></p>';
0211:         }
0212:     } else {
0213:         $outmsg = '<p style="text:red;">メッセージを140文字以下にしてください.</p>';
0214:     }
0215: }
0216: 

メイン・プログラムは、冒頭でPHP5以上かどうかの判定を行い、クラス "'pahooTwitterAPI.php" を読み込む。

一度に投稿できるツイートは、半角でも全角でも140文字以下なので、入力文字数のチェックをしておく。
ユーザー関数 twitter_strlen は、英数字も日本語も1文字としてカウントするが、URLのみ23文字としてカウントするTwitter仕様である。140文字を超えた場合にはツイートしない。

tweet を実行した後、戻り値を解析し、成功した場合には投稿メッセージへのリンクを表示する。

Twitterへの再登録が必要な場合も

https対応のバージョンアップしたプログラムを、以前のアクセストークンのまま利用しようとしたのだが、Twitter APIがエラーを返してくる。そこで、新しいプログラムとして登録したところ、なぜが正常に動作した。

プログラムのバージョンアップで正常に動作しない場合は、Twitterへ新規登録してみるといいだろう。

参考サイト

参考書籍

表紙 Twitter API ポケットリファレンス
著者 山本裕介
出版社 技術評論社
サイズ 単行本
発売日 2011年07月
価格 2,728円(税込)
ISBN 9784774147321
Twitter APIの機能を完全解剖!最新のAPI群もサンプルコードを交えてわかりやすく解説。PHP、Java、Ruby、Pythonなどメジャーな言語でTwitter APIを自在にプログラミング。ライブラリのセットアップ方法、JSON、OAuthなど重要な技術要素も、総合的に解説。この1冊でTwitter APIの全機能がわかる、使える、開発できる。
 
表紙 Twitter APIリファレンスガイドブック
著者 池田成樹
出版社 カットシステム
サイズ 単行本
発売日 2010年09月
価格 3,300円(税込)
ISBN 9784877832438
つぶやく世界をプログラミング。OAuth認証+Ruby+twurl環境でのAPI呼び出しを紹介。
 

質疑応答

【質問】
Twitterのトレンドを毎時ごとに表示し、そのトレンドワードに対して複数のユーザー(Aさん・Bさん・Cさん・・・など)でつぶやかせることは可能ですか
【回答】
PHPで指定した住所のTwitterトレンドを表示する」のプログラムを使ってトレンドを取得し、本項のプログラムを使って投稿すれば実現できるでしょう。
(この項おわり)
header