PythonでTwitter Botを作るまでの長い長い物語(完結編)
前編の失敗編に引き続き、後編の完結編です。
PythonでTwitter Botを作るまでの長い長い物語(失敗編) - からあげ定食
最初に予告しておきますが、後編も半分が失敗です。
"Python Twitter Bot"と検索すると、Google App Engineなるものが目につきます。
Google App Engine(以下GAE)とは、
”Google社の提供するクラウドサービス。同社の運用するサーバ環境に自分の開発したWebアプリケーションを置き、実行・公開することができる。利用できるプログラミング言語はPythonかJava”
(引用:Google App Engineとは 【 GAE 】 - 意味/解説/説明/定義 : IT用語辞典)
Google先生につきまとっていたところ、どうやら前回の自分と同じところでつまづいてGAEに移っている人が多かったようで、自分もその流れにのることに。
GAEでPythonを使う方法はこちらのサイトが素晴らしくわかりやすくまとめてあり、とても勉強になりました。
Google AppEngine/Python入門 - サーバを作ってみよう | adamrocker
ですので、細かい使い方は省略します。
このサイトを参考に、既に作っているtweepyを使ったpythonでツイートを投稿するコードを実行できるようにする。
もちろん、tweepyライブラリも作業ディレクトリにアップロードするのですが、他にも大量のライブラリを入れさせられます。
実行しては、ImportError: No module named ~
また実行しては ImportError: No module named ~
の繰り返しです。気力との戦いでした……
最終的にディレクトリはこんな感じに
app.yaml crom.yaml main.py ----ここから下が追加したライブラリ---- tweepy outhlib requests requests_outhlib six.py
やっと動くかとおもいきや、
The Socket API will be enabled for this application once billing has been enabled in the admin console
課金の設定をしろといわれました。え、無料じゃなかったの!?と思いましたが、ここまでやったし課金して動くなら……と思い、クレジットカードを登録。結果……
動きませんでした!!!!涙!!!
もうやだ!
心が折れそうになりました。必至で調べましたが、Socket APIはGAEでは対応していないとのこと。そしてどうやらtweepyやpython-twitterはSocket APIを使わなければいけないということが分かりました。じゃあなんでできてる人がいるんですか!!!分かりません。分かったら誰か教えてください。
第二章 Google App Engine + tweepy編 〜完〜
第三章 tweepy無しでGoogle App Engine編
折れかけた心をなんとかつなぎとめてくれたのがこのサイトでした。
Google App Engine for Python でTwitter bot (twitter API 1.1) - homma.py
自分と同じように、GAEでtweepyを使うことを諦めて、ライブラリを使わずにtweetを投稿しています。最後のお願いということで、このサイトをほぼパクるような形でbotを作らせていただきました。すると、
負けと知りつつ、目を覆うような手を指して頑張ることは結構辛く、抵抗がある。でも、その気持ちをなくしてしまったら、きっと坂道を転げ落ちるかのように、転落していくんだろう。
- 木村一基
— 将棋格言名言bot (@shogikakumei) 2015, 3月 6
うごきました!!!!!涙!!!
コードはこんな感じ。
tweet.py #ツイートの機能を実装 #!/usr/bin/env python from google.appengine.ext import webapp import keys import GAE_Oauth.oauth CONSUMER_KEY = keys.twi_key['consumer_key'] CONSUMER_SECRET = keys.twi_key['consumer_secret'] ACCESS_TOKEN = keys.twi_key['access_token_key'] ACCESS_SECRET = keys.twi_key['access_token_secret'] class TweetHandler(webapp.RequestHandler): def get(self): import GAE_Oauth.oauth from random import choice client = GAE_Oauth.oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET, None) tweet = choice(list(open("meigen.txt"))).replace("\\n","\n") param = {'status': tweet} # Twitter API 1.1 に対応 client.make_request('https://api.twitter.com/1.1/statuses/update.json', token=ACCESS_TOKEN, secret=ACCESS_SECRET, additional_params=param, protected=True, method='POST') self.response.out.write(tweet)
app.py #機能を実行する #!/usr/bin/env python import webapp2 from google.appengine.ext.webapp.util import run_wsgi_app from tweet import * app = webapp2.WSGIApplication([ ('/tweet', TweetHandler) ], debug=True) def main(): run_wsgi_app(app) if __name__ == "__main__": main()
app.yaml application: shogi-bot version: 1 runtime: python27 api_version: 1 threadsafe: false handlers: - url: /.* script: app.app libraries: - name: webapp2 version: "2.5.2" - name: ssl version: "latest"
cron.yaml cron: - description: tweet_post url: /tweet schedule: every 1 hours timezone: Asia/Tokyo
tweepy無しでtwitterAPIを使う方法は、このサイトが参考になります。
Twitter - Google App Engine for PythonでTweet(API1.1) - Qiita
meigen.txtに改行区切りでつぶやく言葉を書いておき、その中からランダムにつぶやきます。
open()でテキストを読み込んでいますが、\nを\\nと読み込んでしまうので、replace()で置き換えています。
画像付きでつぶやけるようにしたいので、いろいろ自分流にアップグレードできたら報告します。
でもとりあえず今はつかれた……