8年目の波bot 〜GoogleCloudバージョン〜

大学生の時にサーフィン始めてちょっとしたくらいに作った波bot。

最初は辻堂ばかりで入ってたので辻堂botを作った。

(2010/9/28) 辻堂の波情報をつぶやくbot作成

ただtwitterのAPIで"辻堂 波"って検索して引っかかったやつをリツイートするだけのもの。

https://twitter.com/tudidu_surf

リアルタイムの波情報を知るすべとして当時は(今もかな)ツイッターで検索すれば新鮮かつ質の高い波情報を見られるので、検索する手間を省くために自分のタイムラインに垂れ流しにするために作った。

鵠沼にもたまに行ってたので、これをベースに鵠沼版のbotも作った。
https://twitter.com/kugenuma_surf

最初はさくらのレンタルサーバに置いてたが、サーバー自作してからは実家の自宅サーバーに移管していた。

が、2017年の12月に実家のJCOMのモデムが知らぬ間に交換され、サーバーのネットワークが崩壊してから1年半、この波botとかその他自分で作ったプログラムたちは冬眠状態だった。

で、この前実家帰った時にサーバー復活させようとしたら、ネットワーク云々以前にマシン自体が再起不能になっていた。

冬眠 からの 永眠。

R.I.P ubuntu先生


波botのアカウントを久しぶりに見てみると、若干フォロワー減ったもののまだ3000弱のフォロワーが残ってたので、別の手で復活させることにした。

※スクリプトは作り直し....


今はなきエロ動画サイト作った時にAWSでcron回してたことがあるのでAWSにしようかと思ったけど、せっかくだしGoogleCloud使ってみることにした。

AWS × WordPress × PHPで全自動エロ動画サイトを作った。


とりあえず、クラウドサーバー云々は後にして、ローカルでコーディングした。

macなので適当な場所にphpスクリプト作って即テストできる。(windowsだったらxamppとか入れてローカル環境作る必要あるけど)

mac神

とりあえず、

コーディング

うまく貼れなかったので画像.....
たったこれだけ。




以前と変わった点は、リツイート対象の重複判定方法。
旧:前回リツイートしたIDをファイルに吐いておいて、それと重複するIDを除外してリツイート
新:前回リツイートした最新のIDをファイルに吐いておいて、次の検索パラメータで、そのIDより新しいものに絞って検索してリツイート

twitterの仕様で、検索パラメータに "-from:アカウント" を追加するとそのアカウントを除外して検索してくれるので、うざいアカウントをリツイートしてしまったらこれで除外して省くようにする。

あとは、前提条件は、以下2点
  1. TwitterのAPIキーを取得してあること(最新のやり方はこれっぽいhttps://qiita.com/kngsym2018/items/2524d21455aac111cdee)
  2. twitteroauthライブラリを落としてあること(terminalで適当な場所で"wget https://github.com/abraham/twitteroauth/archive/master.zip"すれば落とせる。落としたらunzipコマンドとかで解凍)

テストするにはphpスクリプト置いた場所で php "スクリプトのファイル名" で実行される。

ローカルでちゃんと動くことが確認できた。(実際にtwitterのアカウントを見て、リツイートされたことが確認できた)

続いて、

GoogleCloudの設定とデプロイ


googlecloudはgoogleアカウントがあればすぐ始められた。

具体的な設定はgoogleの公式チュートリアル見ればすぐできるけど、
ハマり箇所だけここに残す。

gcloudコマンドのインストール

これがちゃんとできてなかったのだが、以下コマンドで解決。
(公式に書いといてくれよ..)

1. "curl https://sdk.cloud.google.com | bash"
2. "exec -l $SHELL"

(Thanks to : https://qiita.com/kentarosasaki/items/2232113b44b016a56adc)


curlがデフォルトで使えない件

今回使うtwitterのライブラリ twitteroauthはcurlを使う前提で処理が書かれている。
で、googlecloud環境で今回書いた上記スクリプトを実行しようとするとcurlねえよ的なエラーがでた。

googlecloudではcurl liteとかいうgoogle独自?のcurlのラッパーライブラリが使えるらしいのでそのための設定をして解決した。

1. 以下を記載したphp.iniをスクリプトとapp.yamlがあるディレクトリに置く。

"google_app_engine.enable_curl_lite = "1"
"extension = "curl.so"



2. app.yamlのruntimeをphp55に設定


これでcurl関連のエラーが解消した。
(Thanks to : http://takaya030.hatenablog.com/entry/20160306/1457274541)

app.yamlは基本的に最低限の設定だけ書いたが、"login : admin" とすることで公開URlにアクセスしても認証を通過しない限り一般ユーザーからは見られないように設定した。

今回のこれは、cronで動かすスクリプトなので。

その他ファイル構成とcron設定など

デプロイ対象のディレクトリ内は以下の通り。



  • twitteroauth : twitterAPIをphpで使うライブラリ
  • kuge_last_id : 最後のリツイートのid(次のリツイート対象の検索パラメータに使う)
  • kugenuma_surf.php : メインのプログラム(内容は上に貼ったコードの通り)
  • cron.yaml : cron設定ファイル(内容は1つ下の画像の通り)
  • app.yaml : デプロイ設定ファイル(内容は2つ上の画像の通り)
  • php.ini : 今回はcurlを有効にするために配置した(内容は3つ上の画像の通り)



cron.yamlは以下のように記述した。


urlにはapp.yamlのurlに設定したのと同じパスを設定。
20分おきに起動。
リトライも設定。



デプロイ

appディレクトリ内で "dev_appserver.py ." のコマンドを実行すると、ローカルにサーバーが立ち上がるので、ブラウザで "http://localhost:8080/対象のパス/" にアクセスして動作確認ができる。

超便利。

で、問題なければ本番デプロイ。
appディレクトリ内で以下実行。

"gcloud app deploy app.yaml"

xcodeがなんちゃらって怒られてるけど問題なしなので無視。



続いてcron.yamlをデプロイ

"gcloud app deploy cron.yaml"



デプロイ後、コンソールにジョブが反映されてるのが確認できた。



ちょいと待ってからtwitterを確認すると、テスト用のツイートが波ボットにリツイートされた!



これで完了。

あとは、うざいアカウントをリツイートしないように順次ブラックリストにぶっこんで行けば、元の状態に戻るはず。