MicroPython + ESP8266 で、ネイティブ tweet bot を作る

投稿者: | 2016年10月3日

Implemented  a native tweet bot which runs MicroPython + ESP8266.  No intermediate server (which is converting requests to Twitter API) is required.  SSL, HMAC-SHA1 and OAuth are all running on ESP8266.

というわけで、MicroPython + ESP8266 で Twitter ボットを書いてみました。ESP8266 から単純な HTTP 要求を投げて中間サーバーで変換の上 Twitter API を呼び出すという実装は多いと思いますが、ネイティブな twitter bot は少ないかも知れません。

動かすとこんな感じです。なお、この Twitter ID は検証用なので、フォローして頂いてもあまり面白くありません。あしからず。

まだ、ときどき認証エラーが出るのですが、とりあえず動いています。(「ときどきエラー」ということで、署名の作成に根本的な問題があるというより、なにか条件チェック漏れなどがあるのではないかと睨んでいます。)

MicroPython + ESP8266 で Twitter API を叩くに当たって課題になるのは、以下の部分です。

  • SSL が必要。(これは、現在の MicroPython 1.8.4 ではなんとか動くようになっています。感謝)
  • OAuth が必要。(大きな実装だと載りそうもないので、サブセットを書いてみました)
  • HMAC-SHA1 による署名が必要。(hmac ライブラリは micropython-lib に標準であるようですが、標準では SHA1 に対応してないので、まだマージされていないパッチを拝借しました。これまた感謝です)
  • Twitter API は oauth_timestamp をちゃんと見ているぽいので、時計が必要。(MicroPython に SNTP のライブラリがあるので利用しました)
  • メモリがギリギリしかない

実は一番想定外だったのは最後の「メモリが足りない」ということでした。Python で普通にコーディングしていると、途中で MicroPython の MemoryError なるものが表示されるようになってきます。どうもヒープが足りないということなので、必要なときにしかライブラリを import しない、不要なオブジェクトはメモリに持たない、など工夫してみたのですが、うまくガベージコレクションされないようで、解決できませんでした。

そこで、最初の起動(リセット)では Twitter API の POST メッセージだけを作成し、次の起動で SSL 通信をする、というセコい実装になってしまいました。リセットボタンを押す度に、動作が入れ替わります。(いずれ MicroPython も ESP8266(の後継デバイス?)も進化するでしょうから、あまり深追いしないことにします。)

ではここにプログラムコードを、、、と言いたいところですが、まだバグがあるみたいなので、今回は御容赦ください。明日から本業が忙しくなりそうなので、しばらくしたらアップロードさせて頂きます。

ソースコード(2016/10/04)

バグを直しましたので、ソースコードをアップロードしておきます。main.py とtweet.py の他に、/lib の下に hmac.py(上記参照。SHA1 パッチが必要)を置いて御利用ください。なお、tweet.py 中の CK, CS, AT, AS については、Twitter にて認証コードを取得して設定してください。