twitterからapiで自分のツイートを取得してhexoに埋め込む

 twitterがAPIを有料化するとか言っている中で突然自分のツイートを別保存したくなって、いろいろと研究。

 現状無料ではAPI v2で読み込みができない。v1.1では読み込みができるが、これとていつ使えないようになるかはわからない。実際、昨日は使えなくなった。これはフリー版登録者が強制的にBASICに変更させられたせいで、フリーにダウングレードしたら使えるようになった。

 で、スクリプト。定数的な変数は外部ファイルから読み込み、テンプレートも外部ファイル、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して、そのデータを毎日処理するという形式。