Twitterのbotをリモートで動かすまでの長い道のり
ここ最近、Java(Android)から少し離れてPythonでTwitterのbotを作っています。
別にAndroidを辞めたわけじゃないですが、少し気分転換にサーバで動く簡単なものを作ってみたいと思って、思いついたのがTwitterのbotでした。
動かすまでとても長い道のりだったんです。
エラーも続出だったので参考になればなと思います。
最終的には、Python2.7でTweepyを使用し、Google App Engineでcronで動作させています。
今回はLLを使いたかったので、その中でもPythonにしました。
選んだ理由はTwitterのライブラリが揃っていて、書き方が結構好きだったからですねw
とりあえず、開発環境を揃えたりしました。
現在Sublime textで開発しています。
これも、なかなか設定が面倒だったのでまた今度記事にまとめたいなと思います。
私はこの時Python 3.4.2でコードを書いていました。
これがあとあと面倒になるとは思ってもいませんでしたが…。
とりあえず、ローカルで動くようにOAuthをしたり、ツイートがかぶってもいいようにするために時刻を表示させたりと機能を実装しました。
Pythonも慣れないのでなかなか四苦八苦しながらコードを書きましたが。
なんでしょうか、ここまでは簡単に行ったんです。
さて、botとして動かすにはcronというモノを使うと知って、
あ、じゃあそこら辺のレンタルサーバをとりあえず借りてcronっていうのにコードを登録すればいいのかと思い、minibirdというところに登録して設定とかなんやかんやしました。
正直ここですんなり行けていれば問題なかったんです。
なにが問題だったかと言うと、cronが全然動かなかったんです。
なんてこった、logすらメールで送ってこなかった。
もちろんメアドはそれ用に設定していました。
しかし、そもそもこのコードはTweepyというライブラリを使って書いていて、それをインストールしようと思っても、
SSH、このサーバでは使えなかったw
もちろん、ライブラリ無しでも書けるとは思うのですが。
私はそのときPython2日目でOAuthってどうやってPythonで書くの?状態でしたので使わせていただきました。
SSHを使わなくとも出来るんじゃないかと思って、Googleで検索しまくったんですが、どれもサーバ上では出来ませんでした。
ということでこのレンタルサーバは諦めてロリポップの最上級(チカッパ)プランがSSHが使えると聞いて、やってみたんです。
SSHで接続して、Tweepyをインストールして、ちゃくちゃくと進んでいきました。
あれ?これ行けるんじゃね?と思ったのですが無理でした。
エラー続出でもう…。
権限が足らないんですよね、サーバ自体もともとあまり弄ったことがないのでうそーん状態になってました。
そもそもレンタルサーバってそこまで権限が与えられてるわけじゃないので…
次の選択肢を考えました。
VPSを使う。
これはあっさり不採用にしました。
何故かと言うと月額が…ねえ
Twitterのbotを動かすためだけにそんな大金、私にはありませんよ…。
ということで他のサービスを探していました。
「Twitter Python」で検索すると、よくGAEという文字が出てきます。
GAEってなんだ?と思って調べてみると今流行り?のPaaSらしいですね。
PaaSなんだよそれみたいな人はここ見てください。
PaaSとは 【 Platform as a Service 】 - 意味/解説/説明/定義 : IT用語辞典
GAEとはGoogle App Engineのことでその名の通り、Googleが提供しているPaaSです。
あ、なんだあの天下のGoogleさんが基本無料で提供しているのか
しかもPythonも使用可能。
これはキタ━(゚∀゚)━!
とこの時は思っていました。
ここから私の長いGAE上でPythonを動作させる戦いが始まるのです。
GAEとの長い戦い
まずはGAEクライアントをダウンロードしたり、cronの設定をしたりしました。
しかしここもなかなか順調には進みませんでした。
このクライアント、なんか日本語(2バイト)文字がデプロイするフォルダのパスに入っているとエラー吐くみたいなんです。
親切に2バイト文字入ってたら駄目だよ、とか教えてくれたらいいんですが、そんなことはもちろんありません。
ていうか人生で何度も2バイト文字のせいでアプリが動かなかったことがあるので、作業フォルダは英数字にすべきだとは思ってるんですけどね。
Windows 8をクリーンインストールした時にMicrosoftのアカウントを登録したのが間違いでした。
同じ気持ちの人、多分居ると思います。
まあ、そんなこんなで、デプロイが正常に行われました。
そしてWeb上でcronが動いているかLogを見たんですけど。
エラー
ばっかりでした。
いや、こんなのではくじけませんよ。
ぶっちゃけますと、ここから3時間以上エラーと格闘していました。
まず、始めに私はこのコードをPython3で書いてました。
GAEってPython3動かないらしいんです。
環境の再構築ですよ
ほんともう。
Python2.7にするとエラーが出て、加えてライブラリを何個も入れさせられました。
ソースコードも2.7で動かないとこを書き直していました。
ここで全てのコードが2.7になったと思ったんです。
後々まだ間違っていたと気づくのですが…。
それからの主なエラーはライブラリが読み込めないぞ、オラァって感じでした。
そもそもこのGAE、外部ライブラリを入れるには、ルートディレクトリにそのライブラリを入れないといけないみたいで。
Tweepyをgit cloneして、入れました。
自分でほかのライブラリを入れた記憶が無いので、これで動くと思ってました。
答えはNOですがw
ConfigParserがないよ、Sixがないよ、~OAuthlibがないよ、、、
正直ダウンロードした覚えがないんですけどね、
今思ったら、なんか少し上の方で2.7に環境を変更するときにいろいろ入れられた覚えがあります。
これらをダウンロードしたりするのは案外簡単だったんですけど
ルートディレクトリにそのまま入れても全然反応しなくて。。。
結局動くには動いたんですけど、ディレクトリはごちゃごちゃしてました。
あらゆるところにライブラリが散乱してました。
他の人に見られたら恥ずかしいレベルw
もう朝の8時くらいからこれやってるのに、もう日が暮れそうになってました。
さすがに疲労で死にそうだったのでこの日はとりあえず中断。
そして、今日、ディレクトリの簡素化に入りました。
とりあえず、Tweepy以外のライブラリを消しました。
そして、Logを見てみるとConfigParserが足りないと言われたのでConfinParserをローカルのPython27のlibsフォルダ以下のsite-modulesフォルダの中身からコピってきました。
そのままじゃ動かなかったのでリネームしたりして。
そしたら、久しぶりに違うエラーが出たんです。
inifile = configparser.SafeConfigParser() AttributeError: 'module' object has no attribute 'SafeConfigParser'
ん?ローカルでは動くのになんでmoduleにはSafeConfigParserが無いと言ってくるんだろう。
そう思って、いろいろ検索などしてみたのですが、
ここで、Python2.7にした弊害が…
configparser.SafeConfigParser()という文があると思うのですが
これが駄目だったんです。
ConfigParser.SafeConfigParser()にしないといけなかったんです。
うそーん。
なんとPython3ではlowercaseだったんですけど
それ以下ではCapWordsだったらしいです。
なんでローカルで動いたのだろうか。
とりあえず、これを変更すると、これ以上のライブラリは要求されませんでした。
ふう…。
とても長い道のりでした。
たった1日+1時間の出来事なのにもう4000字近く書いてますよw
まとめ
疲れたり躓いたりしたら休憩すること。
まあ正直、計画がどんどん崩壊していって、あの手この手でやっていったので相当疲れました。
ライブラリの件だって、今日朝やってみると1時間もかからないくらいで解決しました。
やっぱり疲れたら思考回路が鈍りますね。