
目次
サンプル・プログラム:実行例

たとえば、"putTweetMedia.php?msg=%E5%B0%8F%E7%94%B0%E5%8E%9F%E5%9F%8E%E3%81%AF%E9%9B%A3%E6%94%BB%E4%B8%8D%E8%90%BD+https%3A%2F%2Fwww.pahoo.org%2Fathome%2Falbum%2F2019%2Fimg20190907-173131e.jpg&reply=https%3A%2F%2Ftwitter.com%2Fpapa_pahoo%2Fstatus%2F123456789" のようにすると、"https://twitter.com/papa_pahoo/status/123456789" にリプライ(返信)する形で、メッセージ「小田原城は難攻不落」と画像ファイル "/athome/album/2019/img20190907-173131e.jpg" を付けることができる。
サンプル・プログラム
putTweetMedia.php | サンプル・プログラム本体 |
pahooTwitterAPI.php | Twitter APIを利用するクラス pahooTwitterAPI。 使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。 |
putTweetMedia.php | サンプル・プログラム本体 |
pahooTwitterAPI.php | Twitter APIに関わるクラス pahooTwitterAPI。 使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
2.1.0 | 2024/05/18 | twitter.com → x.com 変更対応 |
2.0.0 | 2023/07/16 | Twitter API v2対応,その他大幅改訂 |
1.1 | 2022/01/09 | PHP8対応,リファラ・チェック改良 |
1.0 | 2016/02/13 |
バージョン | 更新日 | 内容 |
---|---|---|
5.5.1 | 2024/11/23 | __construct() -- PHP8.4における応急処置 |
5.5.0 | 2024/06/21 | TwitterOAuth 7.0.0 対応 |
5.4.0 | 2024/05/18 | twitter.com → x.com 変更対応 |
5.3.0 | 2023/08/15 | tweet3() -- メディアのシャフル機能 |
5.2.1 | 2023/07/22 | bug-fix |
バージョン | 更新日 | 内容 |
---|---|---|
1.8.1 | 2025/03/15 | validRegexPattern() -- debug |
1.8.0 | 2024/11/12 | validRegexPattern() 追加 |
1.7.0 | 2024/10/09 | validURL() validEmail() 追加 |
1.6.0 | 2024/10/07 | isButton() -- buttonタグに対応 |
1.5.0 | 2024/01/28 | exitIfExceedVersion() 追加 |
準備:pahooTwitterAPI クラス
pahooTwitterAPI.php
11: //TwitterOAuth クラスをロードする.
12: $version = explode('.', phpversion());
13: if ($version[0] >= 8) {
14: require __DIR__ . '/vendor/autoload.php';
15: }
16: use Abraham\TwitterOAuth\TwitterOAuth;
17:
pahooTwitterAPI.php
34: /**
35: * コンストラクタ
36: * @param なし
37: * @return なし
38: */
39: function __construct() {
40: $this->responses = array();
41: $this->webapi = '';
42: $this->error = FALSE;
43: $this->errmsg = '';
44: $this->errcode = 0;
45:
46: $this->connection = new TwitterOAuth($this->TWTR_CONSUMER_KEY, $this->TWTR_CONSUMER_SECRET, $this->TWTR_ACCESS_KEY, $this->TWTR_ACCESS_SECRET);
47: //v2使用を宣言
48: $this->connection->setApiVersion('2');
49:
50: // PHP8.4で暗黙的にnullableを指定することが非推奨になったため
51: // TwitterOAuthが対応するまでの応急処置
52: error_reporting(E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);
53: }
pahooTwitterAPI.php
27: //OAuth用パラメータ
28: // https://apps.twitter.com/
29: var $TWTR_CONSUMER_KEY = '***************'; //Cunsumer key
30: var $TWTR_CONSUMER_SECRET = '***************'; //Consumer secret
31: var $TWTR_ACCESS_KEY = '***************'; //Access Token (oauth_token)
32: var $TWTR_ACCESS_SECRET = '***************'; //Access Token Secret (oauth_token_secret)
33:

事前にプログラムを登録しておく必要があり、その方法は「Twitter API - WebAPIの登録方法」を参照されたい。入手したパラメータを、上述の変数に代入しておくこと。
PHP の https対応
関数 phpinfo を使って、下図のように表示されればOK。


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

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

これで準備は完了だ。
Twitter API:POST /2/tweets
URL |
---|
https://api.twitter.com/2/tweets |
フィールド名 | 要否 | 内 容 | |
---|---|---|---|
text | 必須 | 投稿文。UTF-8でエンコードされたテキストで、140文字以下。 | |
media | media_ids | 任意 | メディアID。最大4つ。 |
reply | in_reply_to_tweet_id> | 任意 | リプライID。 |
Twitter API:POST media/upload
URL |
---|
https://upload.twitter.com/1.1/media/upload.json |
フィールド名 | 要否 | 内 容 |
---|---|---|
media | mediaまたはmedia_dataが必須 | media:メディアデータ(バイナリ) |
media_data | mediaまたはmedia_dataが必須 | media_data:メディアデータ(base64形式) |
解説:メディア付きツイート

続いて、メッセージの中からユーザー関数 extractMediaURL( を使ってメディアURLを取り出す。
メディアURLが1つでもあれば、「Twitter API:POST media/upload」を使ってアップロードする。
アップロードに成功すると、メディアIDを返す。これはツイートの時に必要になるので、配列 $media_ids に格納しておく。
1つのツイートに含めることができる画像の数は4つなので、この作業を最大4回繰り返す。

次に、「PHPでTwitterに投稿(ツイート)する」と同じ要領で、「Twitter API:POST /2/tweets」を使ってツイートする。オプションに配列 $media_ids を追加することで、先ほどアップロードした画像が付いたメッセージとなる。
pahooTwitterAPI.php
819: /**
820: * 指定したテキストをツイートする.
821: * リプライ(返信)先を指定したり,メディアを投稿できる.
822: * Tweetet API v2 を使用する.
823: * @param string $message 投稿メッセージ(UTF-8限定);メディアを指定するときは 'http(s)://' または 'file:///' を含める.メディアが5つ以上あるときにはランダムに4つを選ぶ.
824: * @param string $reply リプライ先のURL(省略可能)
825: * @return bool TRUE:リクエスト成功/FALSE:失敗
826: */
827: function tweet3($message, $reply=NULL) {
828: $id = NULL;
829: $name = NULL;
830:
831: //リプライ先のidを取り出す.
832: if ($reply != NULL) {
833: if (preg_match('/\/([0-9]+$)/i', $reply, $arr) > 0) {
834: $id = (string)$arr[1];
835: } else {
836: $this->error = TRUE;
837: $this->errmsg = 'リプライ先のURLが間違っています';
838: return FALSE;
839: }
840: }
841: //スクリーンネームを取り出す
842: if ($reply != NULL) {
843: // if (preg_match('/https\:\/\/twitter\.com\/([^\/]+)\//i', $reply, $arr) > 0) {
844: if (preg_match('/https\:\/\/x\.com\/([^\/]+)\//i', $reply, $arr) > 0) {
845: $name = (string)$arr[1];
846: } else {
847: $this->error = TRUE;
848: $this->errmsg = 'リプライ先のURLが間違っています';
849: return FALSE;
850: }
851: }
852:
853: //メディアURLを取り出す.
854: $mediaURLs = array();
855: $str = $this->extractMediaURL($message, $mediaURLs);
856: //メディアが5つ以上あるときにはシャフルする.
857: if (count($mediaURLs) >= 5) shuffle($mediaURLs);
858:
859: //スクリーンネームを追加する.
860: if ($id != NULL) {
861: $str = '@' . $name . ' ' . $str;
862: }
863:
864: //メディア付きリプライを行う.(Tweetet API v2 を使用する)
865: if (count($mediaURLs) > 0) {
866: $media_ids = array();
867: $cnt = 0;
868: //メディアのアップロード.
869: //Tweetet API v1.1 を使用する(v2にメディアアップロードが未実装のため)
870: $this->connection->setApiVersion('1.1');
871: foreach ($mediaURLs as $fname) {
872: $tmpname = $this->media2temp($fname);
873: if ($tmpname == FALSE) {
874: echo 'failure';
875: exit(1);
876: }
877: // $media = $this->connection->upload('media/upload', ['media' => $tmpname]);
878: $media = $this->connection->upload('media/upload', ['media' => $tmpname], ['chunkedUpload' => true]); //twitteroauth 7.0.0 対応
879: unlink($tmpname);
880: if (! isset($media->media_id_string)) break;
881: $media_ids[] = (string)$media->media_id_string;
882: $cnt++;
883: if ($cnt > 3) break; //最大4つまで
884: }
885:
886: //メディア付きリプライ
887: $this->connection->setApiVersion('2');
888: $option = [
889: 'text' => $str,
890: 'media' => [
891: 'media_ids' => $media_ids
892: ]
893: ];
894: if ($id != NULL) {
895: $option = array_merge($option, [
896: 'reply' => [
897: 'in_reply_to_tweet_id' => $id
898: ]
899: ]);
900: }
901:
902: //メディアなしリプライを行う.
903: } else {
904: $option['text'] = $str;
905: if ($id != NULL) {
906: $option = array_merge($option, [
907: 'reply' => [
908: 'in_reply_to_tweet_id' => $id
909: ]
910: ]);
911: }
912: }
913: // $status = $this->connection->post('tweets', $option, TRUE);
914: $status = $this->connection->post('tweets', $option, ['jsonPayload' => true]); //twitteroauth 7.0.0 対応
915: $this->webapi = 'https://api.twitter.com/2/tweets';
916:
917: //処理に成功した.
918: if ($this->isSuccess()) {
919: $this->responses = $status->data;
920: $this->errcode = NULL;
921: $this->errmsg = '';
922: $this->error = FALSE;
923: $res = TRUE;
924: //処理に失敗した.
925: } else {
926: if ($this->isAuthError() == FALSE) {
927: $this->errmsg = $status->detail;
928: $this->error = TRUE;
929: }
930: $res = FALSE;
931: }
932: return $res;
933: }
参考サイト
- Twitter Developer Platform Documentation:公式サイト
- PHPでTwitterに投稿する:ぱふぅ家のホームページ
- PHPでTwitterに画像付きメッセージ投稿:ぱふぅ家のホームページ
- PHPでツイートの埋め込み用HTMLを取得:ぱふぅ家のホームページ
(2024年6月21日)TwitterOAuth 7.0.0 対応
(2024年5月18日)ドメイン変更 twitter.com → x.com に対応
(2022年1月9日)Twitter API v2対応,その他大幅改訂