読者です 読者をやめる 読者になる 読者になる

からあげ定食

僻地の大学生の進捗発表。R,Python,yacht,twitteR,自然言語処理,将棋,機械学習,ヨット

PythonでTwitter Botを作るまでの長い長い物語(完結編)

前編の失敗編に引き続き、後編の完結編です。

PythonでTwitter Botを作るまでの長い長い物語(失敗編) - からあげ定食

最初に予告しておきますが、後編も半分が失敗です。

"Python Twitter Bot"と検索すると、Google App Engineなるものが目につきます。
Google App Engine(以下GAE)とは、
Google社の提供するクラウドサービス。同社の運用するサーバ環境に自分の開発したWebアプリケーションを置き、実行・公開することができる。利用できるプログラミング言語PythonJava
(引用: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を作らせていただきました。すると、

うごきました!!!!!涙!!!


コードはこんな感じ。

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()で置き換えています。

画像付きでつぶやけるようにしたいので、いろいろ自分流にアップグレードできたら報告します。
でもとりあえず今はつかれた……