maya's blog

About programming, aws and ubuntu

twitter botを作る

はじめに

ずいぶん前にソフトウェアアーキテクトが知るべき97のことを読んだ。

たまに読みたくなったり内容を思い出したくなる時があったけど、都度本を読み返すのも億劫で結局読まずじまいになっていた。 TLに流すようにすれば嫌でも目に入って良いんじゃないかと思っていた。

結局以下の理由からtwitter botを自作することにした。

  • twitter APIでなんか作ってみたかった
  • 既にあるbot作成サービスを調べるのが億劫だった
    • どこまで細かく設定できるのか、利用制限があるんじゃないかって勝手に不安に思ったのもある
  • 既存サービスを利用するより自作したほうがカスタマイズ性がよい
  • スキル維持のため
    • 仕事を辞めてから競プロ以外であまりコードを書いておらず、忘れるのが怖くなった

即席で動くものが欲しかったので、超荒削りなコードで実装した。

f:id:maya2250:20190407232651p:plain

仕様

  1. 決まった時間・時間間隔で以下自動ツイート
    • エッセイのタイトル
    • エッセイの著者
    • エッセイのリンク(ここにあるやつ)

設計

今回はプロトタイプまででもない超ライトなものになりそうなので、基本的に必要最小限の選定をするという方針

  1. 言語

    python

  2. エッセイの取得&格納方法

    手動でコピペしてDBに入れるのは人間のすることじゃないので、 スクレイピングスクリプトを書いて、初回(または内容が変わったとき)にデータを更新することにした。

    スクレイピングパッケージはScrapyを使うことにした。

    データ格納にはRDBかNoSQLかも考えたけど、 データ数が100個強で超ライト&更新頻度低なのでDB使わずjsonファイルから読み取ることにした。

    (後々データが増えていったりリレーションが必要になったらまたそのときは然るべきDBを使う)

  3. 定期実行させる方法

    1. cron
    2. AWSのCloudWatch EventでLambdaを定期実行(CloudWatch Event使ったこと無いけど)
    3. CircleCIのtrigge

    が思いついた。

    今回AWS使うまでもないかなと思っていたし、軽い定期実行のためだけにCloudWatch Event & Lambda構築するのはめんどくさい。 CircleCIはそもそも用途と違うのでちょいと不適かな…。

    ってことで、ひとまずcronで構築することにした。

  4. 誰が実行するのか EC2とかLambdaとかあるけど、金使いたくない…& 使われていないraspberrypiがあったので、raspiに任せることにした

実装

ローカル開発マシン(Ubuntu 18.10)で実装&確認しつつ、スクレイピングとツイートスクリプトが書けたところでraspiでに乗せた。

不満

Pythonのversion差異

raspiにはデフォでPython 2.7.13 と Python 3.5.3が入っていた。 ローカルのpythonは最新の3.7.3でf string使っていたので、移植性が…

魔のcron

cronめんどい。

実際にcron設定&動作確認して初めて考慮すべきことが多いことに気付いた。

  • 実行ユーザはroot or pi?
  • 環境変数の設定が引き継げない
    • API tokenががが…
  • なんか/etc/crontabを編集してsudo crontab -lしても反映されてない?
    • sudo crontab -e -u rootで行けた。そもそもマニュアル読めってか

今後

  • Dockerに乗っける
    • docker runしてcron実行させるようにすれば環境依存で動かない…なんてことが少なくなって移植性があがるため
    • raspberrypiでdocker使えるぽい
  • AWSに乗っけるのも勉強になりそう
  • プログラマが知るべき97のことプロジェクト・マネジャーが知るべき97のことも追加したい
  • tweetの文字数が許す限り投稿内容に本文を載せるのもあり
    • タイトルだけじゃなんの話か分かりづらい?

次: twitter botを作る② - maya's blog