Twitter API で特定のアカウントのツイートを取得する方法、修正版

Twitter API で特定のアカウントのツイートを取得する方法」ですが、タイムアウトして情報が取れないことがあり、その辺りを改良しました。

<?php
require_once 'TwistOAuth.phar';

$consumer_key = '{your-consumer-key}';
$consumer_secret = '{your-consumer-secret}';
$access_token = '{your-access-token}';
$access_token_secret = '{your-access-token-secret}';

$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
$count = 3;
$max_length = 25;

function get_tweet($screen_name){
  global $connection, $count, $max_length;
  $ret = "";

	// connect
	try{
		$user = $connection->get('statuses/user_timeline',
    array('screen_name' => $screen_name,
      'count' => $count,
      'exclude_replies' => 'false',
      'include_rts' => 'false',)
    );
	} catch (TwistException $e) {
		fputs(STDERR, "Error : $screen_name , " . date("Y/m/d H:i:s") . "\n");
		$text = '<h4><a href = "https://twitter.com/@' . $screen_name . '">@' . $screen_name . '</a></h4>';
		$text .= '<ul class = "tweet"><li>取得失敗</li></ul>' . "\n";
		return $text;
	}

	// get user names.
	$screen_name = htmlspecialchars($user[0]->user->screen_name, ENT_QUOTES, 'UTF-8', false);
  $names = "<h4>" . htmlspecialchars($user[0]->user->name, ENT_QUOTES, 'UTF-8', false) 
      . ' <a href = "https://twitter.com/@' . $screen_name . '">@' . $screen_name . "</a></h4>\n";
  $ret .= $names;

  $ret .= '<ul class = "tweet">';

  // get tweets.
  foreach ($user as $value){
    $screen_name = htmlspecialchars($value->user->screen_name, ENT_QUOTES, 'UTF-8', false);
    $post_date_utc = htmlspecialchars($value->created_at, ENT_QUOTES, 'UTF-8', false);
    $post_date = timezone_change_ja($post_date_utc);
    $text = htmlspecialchars(mb_substr($value->text, 0, $max_length, 'UTF-8'), ENT_QUOTES, 'UTF-8', false);
    $link = '<a href = "https://twitter.com/' . $screen_name . '/status/' . $value->id_str . '">';
    $ret .= "<li>" . $post_date . " " . $link . $text . "</a></li>\n";
  }

  $ret .= "</ul>\n";
  return $ret;
}

/*
	Twitterからのタイムゾーンを日本時間(東京)に変換するq
         $time = timezone_change('Tue Jul 12 06:27:46 +0000 2011');
         echo $time{"tm_year"};
         
*/

function timezone_change_ja($timezone = null){

	$year = $month = $day = $hour = $minute = $second = null;
	if(!empty($timezone)){

		$date_arr = explode(" ", $timezone);
		$year = intval($date_arr[5]);
		
		if($date_arr[1] == "Jan"){
			$month = 1;
		}else if($date_arr[1] == "Feb"){
			$month = 2;
		}else if($date_arr[1] == "Mar"){
			$month = 3;
		}else if($date_arr[1] == "Apr"){
			$month = 4;
		}else if($date_arr[1] == "May"){
			$month = 5;
		}else if($date_arr[1] == "Jun"){
			$month = 6;
		}else if($date_arr[1] == "Jul"){
			$month = 7;
		}else if($date_arr[1] == "Aug"){
			$month = 8;
		}else if($date_arr[1] == "Sep"){
			$month = 9;
		}else if($date_arr[1] == "Oct"){
			$month = 10;
		}else if($date_arr[1] == "Nov"){
			$month = 11;
		}else if($date_arr[1] == "Dec"){
			$month = 12;
		}

		$day = intval(sprintf("%d", $date_arr[2]));

		$arr = explode(":", $date_arr[3]);
		
		$hour = intval(sprintf("%d", $arr[0]));
		$minute = intval(sprintf("%d", $arr[1]));
		$second = intval(sprintf("%d", $arr[2]));

		$time = mktime($hour, $minute, $second, $month, $day, $year);
		$time = $time + 60 * 60 * 9; # 9時間進める
    //$date = localtime($time, true);
    return date("Y-m-d H:i", $time);
		//return $date;
	}else{
                  return false;
         }
}

?>

取得失敗の例外発生時に、スクリーンネームと「取得失敗」を戻り値にして返して、標準エラー出力にエラー内容を出力するようにしました。

このため PHP の実行文も変わります。
エラー内容を itawoerror.log に追記していきます。

php ./itawotweet/itwt_cjpn.php > ./www/itawotweet/itwt_cjpn.html 2>> itawoerror.log

ログは定期的に自分のメールアドレスに送るようにシェルスクリプトを書きました。

#!/bin/sh
if [ -s ./itawoerror.log ]; then
	cat -v ./itawoerror.log | mail -s "itawotweet error log" {your-mail-address}
	rm -f itawoerror.log
fi

これを cron に登録します。

AWS の CloudFront で WordPress を稼働してて、かつ ec2 間に SSL 通信をしている場合

Amazon Web Service で ec2 と CloudFront で WordPress を稼働している、かつ Let’s Encrypt で CloudFront – ec2 間を SSL 通信している場合。

これはハマる気がした。
certbot renew が失敗する。
WordPress が勝手にリダイレクトするから。

3ヶ月に1回、ダミーの静的ウェブサイトに接続先変えて証明書を取得するもの面倒くさいなー。

Twitter API で特定のアカウントのツイートを取得する方法

Twitter API を使って、特定の(指定した)アカウントのツイートを取得する方法です。
作ってみたのが以下のサイトです。

https://www.bass-world.net/itawotweet/

https://developer.twitter.com/en.html からAPI キーを取得する

https://developer.twitter.com/en.html からアクセスして、

  • consumer_key
  • consumer_secret
  • access_token
  • access_token_secret

を取得します。どんなアプリを作るのか、英作文しないといけないけどがんばって!

TwistOAuth の取得

https://github.com/mpyw/TwistOAuth から TwistOAuth を入手します。
TwistOAuth.phar を今から作るプログラムと同階層においてください。

“Twitter API で特定のアカウントのツイートを取得する方法” の続きを読む

偽中国語翻訳机工作了

偽中国語翻訳机を作りました。

Qiita に上げました。

老師によると「我做了假的中文翻譯机」が正しいそうです。

$ python pseudo-chinese.py 私はお酒を飲みたい
我想喝酒

$ python pseudo-chinese.py 私は本日定時退社します
我今天定時退社也

$ python pseudo-chinese.py 私は理解しました
我明白了

$ python pseudo-chinese.py 私は明日、伊豆大島に行きたい
我想去明天、伊豆大島

$ python pseudo-chinese.py 私は昨日、日本の料理を食べました
我吃昨天、日本的料理了

$ python pseudo-chinese.py 今日は10時に仕事が終わります
今天10時工作了也

$ python pseudo-chinese.py あなたは何時に終わりますか?
你何時了也嗎?

AWS CloudFront で WordPress を立ち上げる大日程

  1. http で静的なオリジンサイトを立ち上げる。
  2. Let’s Encrypt で オリジンサイトに SSL 導入。
  3. https なオリジンサイトに WordPress インストール。
  4. CloudFront 導入。詳しくは
  5. 表側サイトの動作確認。
  6. WordPress の設定。管理画面で「一般」→「WordPress アドレス」「サイトアドレス」を表側の URL に変更。
  7. ec2 の方の httpd.conf にも表側サイトの設定を書く。←なぜ?
  8. マルチサイト作成。

Postfix + Amazon SES で Duplicate header ‘Delivered-To’ エラー

Amazon Linux 2 と Amazon SES でメール配送できるようにしたんだけど、特に root 周りにメールを送ると SES がエラーを出して送信してくれない。

Duplicate header ‘Delivered-To’

ググったところ「転送する時はヘッダに Delivered-To を付けないようにするといいよ」と書いてあったので、

main.cf に以下の行を追加。

prepend_delivered_header = file

無事 SES に怒られずに転送できるようになりました。

AWS で ec2 + RDS で WordPress 作る時の備忘録

  • amazon-linux-extras で PHP7.2 と MariaDB をインストールする。
  • データベースもユーザも「localhost」で作らない。
  • Amazon Polly + WordPress のアマゾン公式ドキュメントはポリシーの JSON が間違っている。
  • 同じく、プラグインの設定がちょっとおかしい。一周遅れで来る感じ。日英中に翻訳させたいなら、一度日英中で保存した後、日英だけにして保存すると、投稿が日英中になる。