twitterがAPIを有料化するとか言っている中で突然自分のツイートを別保存したくなって、いろいろと研究。
現状無料ではAPI v2で読み込みができない。v1.1では読み込みができるが、これとていつ使えないようになるかはわからない。実際、昨日は使えなくなった。これはフリー版登録者が強制的にBASICに変更させられたせいで、フリーにダウングレードしたら使えるようになった。
この期に及んでTwitter APIを叩くスクリプトを作って自分のツイートを記録していたんだが、ついにブロックされた模様。{"errors":[{"code":32,"message":"Could not authenticate you."}]}と返ってくる。
— 泥山田@チーム泥んこプロレス (@doroyamada) 2023年5月21日
twitter api 、フリーにダウングレードしたら使えるようになった。ベーシックへ強制変更が行われた模様。
— 泥山田@チーム泥んこプロレス (@doroyamada) 2023年5月21日
で、スクリプト。定数的な変数は外部ファイルから読み込み、テンプレートも外部ファイル、hexoのジェネレートと公開ディレクトリへのコピーも外部ファイル。エラーは自分のところで起こりそうな最低限。cronで毎日0時過ぎに実行。
<?php include(dirname(__FILE__) . "/variables.php"); if(isset($argv[1])) { $yesterday_epoch =strtotime($argv[1]); if($yesterday_epoch == false ) { die("引数のフォーマットが正しくありません");} $today_epoch = $yesterday_epoch + 60*60*24; }else{ $yesterday_epoch = strtotime("yesterday"); $today_epoch = strtotime("today"); } $entrytime_text = date("Y-m-d H:i:s",$today_epoch - 1); $entrytdate_text = date("Y-m-d",$today_epoch - 1); $REQUEST_TWEET_PARAMS = [ 'screen_name' => "@${screen_name}", 'count' => 40, 'since_id' => ($yesterday_epoch*1000 - 1288834974657)<<22, 'max_id' => ($today_epoch*1000 - 1288834974657)<<22, 'trim_user' => true, 'include_rts' => false ]; $REQUEST_TWEET_URL .= '?' . http_build_query ( $REQUEST_TWEET_PARAMS ); $tweet_params = [ 'method' => 'GET', 'header' => [ 'Authorization: Bearer ' . $bearer_token, ], ]; $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, $REQUEST_TWEET_URL ); curl_setopt( $curl, CURLOPT_HEADER, false ); // ヘッダー取得する curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $tweet_params['method'] ); curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ); // 証明書の検証なし curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); // 結果を文字列で curl_setopt( $curl, CURLOPT_HTTPHEADER, $tweet_params['header'] ); curl_setopt( $curl, CURLOPT_TIMEOUT, 5 ); $response = curl_exec( $curl ); curl_close( $curl ); if($response === false || strlen($response) == 0 ) {die("curlに失敗しました\n");} #publish APIでembed用htmlを取得してファイルに書き込み $entries = json_decode($response,true); if(count($entries) == 0) { die("その日のツイートはありません\n");} $text_parts = preg_split("/(。|、)/", $entries[0]['text']); #最新tweetの句読点までをタイトルに。 $title = $text_parts[0]; $title = preg_replace("/@[^ ]+ /", "", $title); #タイトル行に@があるとhexo生成でエラーになるので。 $contents = file_get_contents(dirname(__FILE__) . "/markup_template.txt"); $contents = str_replace("___TITLE___", $title, $contents); $contents = str_replace("___DATE___", $entrytime_text, $contents); $filename = "${output_dir}${entrytdate_text}.md"; $n = 0; foreach($entries as $entry){ $n++; $tweet_id = $entry['id_str']; $entry_publish = json_decode(file_get_contents("$publish_url$tweet_id"),true); if($n == 3){$contents .= "{% collapsebtn \"続きを表示\" \"折りたたむ\" %}\n";} #plugin対応 $contents .= $entry_publish['html']; $contents .= PHP_EOL; } if($n >= 3) {$contents .= "{% endcollapsebtn %}\n";} file_put_contents($filename, $contents); #hexoでhtmlをジェネレートしてコピー exec(dirname(__FILE__) . "/hexosync.sh"); ?>
いつまで使えるかわからないので、iftttを使った方法も検討中。ツイートのたびに自宅サーバにwebhookして、そのデータを毎日処理するという形式。