2014/11/22 twitterBotをつくってみたよ!

python twitter API

今回は、pythonとtwitterAPIを使用して、定期的につぶやくbotを作成しようと思います。

botとは!


機械による自動発言システム。語源はロボットから来ている。特定の時間に自動ツイートする bot、ユーザーの bot 宛の発言にリプライする bot、特定のキーワードに反応する bot 等、様々な bot が存在する。 -ツイナビより引用

製作

ということで、作成にとりかかります。

  1. python単体でtwitterに発言できるものを作る。
  2. サーバーでpythonをはしらせる
このような手順で行いたいと思います。

さて、pythonでプログラムを書くわけなのですが、
前段階として、以下の手順を行う必要があります。

  1. Twitterに(bot用の)アカウントを登録する
  2. 認証用のキーを入手する。(https://apps.twitter.com/)
  3. プログラム作成!

まずは手順1から順に行いましょう。

Twitterにアクセスし、アカウントを登録します。

こちらに関しては説明を省きます。

手順2,認証用のキーを取得します。アカウントが登録できたら、
こちらのサイトにアクセスし、認証用のキーを取得します。

  1. 「Create New App」をクリックします。
  2. 「Name(アプリの名前)」「Description(説明)」「Website(自分の持つホームページ)」を入力。
  3. 「Kes and AccessTokens」タブをクリックし、(Access Level)という項目の、(modify app permisions)を押す。
  4. 「Read only」から「Read and write」もしくは「Read,Write and direct messeges」に変更する。
  5. 「Keys and AccessTokens」タブに戻り、Your Access Tokenの「Create my access token」を押す。
  6. Consumer Key ,Consumer Secret,Access Token,AccessToken Secretがこれで出揃う。

これで、Twitterの認証に使うキーを入手することができたので、これからpythonプログラムを作成する。

こちらを参考に、pythonプログラムを作成した。
				
  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3
  4 #feedparse
  5 import feedparser,time
  6 #OAuth
  7 from requests_oauthlib import OAuth1Session
  8 #shot url
  9 import urllib2
 10 import simplejson
 11 API_URL = 'https://www.googleapis.com/urlshortener/v1/url'
 12 API_KEY = None
 13
 14
 15
 16 CK = ''                             # Consumer Key
 17 CS = ''         # Consumer Secret
 18 AT = '' # Access Token
 19 AS = ''         # Accesss Token Secret
 20
 21
 22
 23 # ツイート投稿用のURL
 24 url = "https://api.twitter.com/1.1/statuses/update.json"
 25
 26 #feedparse
 27 def feedParse(url):
 28   fd = feedparser.parse(url)
 29   return fd
 30 #url shorten
 31 def shorten(longUrl):
 32     if isinstance(longUrl, unicode):
 33         longUrl = longUrl.encode('utf-8')
 34
 35     if API_KEY is None:
 36         data = '{longUrl:"%s"}' % (longUrl)
 37     else:
 38         data = '{longUrl:"%s", key:"%s"}' % (longUrl, API_KEY)
 39     req = urllib2.Request(API_URL, data)
 40     req.add_header('Content-Type', 'application/json')
 41
 42     result = urllib2.urlopen(req)
 43     return simplejson.loads(result.read()).get('id')
 44
 45
 46
 47 #Amazon ranking
 48 #programming bestseller
 49 site1 = 'http://www.amazon.co.jp/gp/rss/bestsellers/books/492352/ref=zg_bs_492352_rsslink'
 50 fdd = feedParse(site1)
 51
 52 for i in [9,8,7,6,5,4,3,2,1,0]:
 53   # ツイート本文
 54   params = {"status": fdd.entries[i].title  + " " + shorten(fdd.entries[i].link)}
 55
 56   # OAuth認証で POST method で投稿
 57   twitter = OAuth1Session(CK, CS, AT, AS)
 58   req = twitter.post(url, params = params)
 59   time.sleep(60)
				
			
これは、Amazonのプログラミング部門のベストセラーを10位までつぶやくというものである。
ライブラリは、feedparserというRSSフィードを解析するものを使っている。
また、OAuthの認証は一からやるととても面倒くさいものらしいので、OAuthのライブラリを使用している。
プログラムもできたので実行してみよう。
すると、1分毎につぶやいてくれているだろう!

さて、プログラムが出来たのはいいが、一々人間の手でプログラムを実行していたのでは、手間がかかる。
そこで、サーバで動かしてしまえばうまくいく

そこで、私は研究室のサーバ上で動かすことを試みた。
簡単ではあるが、前回の記事「RaspberryPiで16*32マトリックス制御」で紹介した、crontabを使ってみた。

しかし、問題が発生した!
それは、研究室のサーバは外部には接続されておらず、研究室の内部のネットが切れたら動かなくなってしまうのだ・・・!
(研究室のサーバを外部に公開することも可能であるが、ルータの設定をいじらねばならないとのこと。)

そこで、herokuというサービスを使うことにした。

herokuとは?

簡単にいえば、色々な言語をサーバで動かせるレンタルサーバみたいなもの?(私も、つい最近使ったのでよくわかってない。)

こちらに詳しく書かれておりました。


herokuを使ってみよう!

ということで、軽いチュートリアルを終わらせた後、以下の作業に入ります。
herokuのアカウントを取得した後はWindows,Linuxでわかれます。

Windowsの場合
--Windowsではやってないのでわかりません。

Linuxの場合

  1. gemをインストールします。
  2. gem install heroku
  3. vim ProcFileでProcFileを作成します。(中身は bot: python amazon.py)
  4. vim requirements.txtでrequirements.txtを作成します。(中身は後述)
  5. git をインストールします。
  6. リポジトリにする場所にgit init
  7. git add -A
  8. git commit -m "Initialize commit"
  9. 最後に、git push heroku master でherokuにデプロイできます。

最終的にherokuにデプロイしたコード
amazon.py

			
  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3
  4 #feedparse
  5 import feedparser,time
  6 #OAuth
  7 from requests_oauthlib import OAuth1Session
  8 #shot url
  9 import urllib2
 10 import simplejson
 11
 12 #shorrt url
 13 API_URL = 'https://www.googleapis.com/urlshortener/v1/url'
 14 API_KEY = None
 15
 16
 17
 18 CK = ''                             # Consumer Key
 19 CS = ''         # Consumer Secret
 20 AT = '' # Access Token
 21 AS = ''         # Accesss Token Secret
 22
 23 #feedparse
 24 def feedParse(rssUrl):
 25   fd = feedparser.parse(rssUrl)
 26   return fd
 27 #url shorten
 28 def shorten(longUrl):
 29     if isinstance(longUrl, unicode):
 30         longUrl = longUrl.encode('utf-8')
 31
 32     if API_KEY is None:
 33         data = '{longUrl:"%s"}' % (longUrl)
 34     else:
 35         data = '{longUrl:"%s", key:"%s"}' % (longUrl, API_KEY)
 36     req = urllib2.Request(API_URL, data)
 37     req.add_header('Content-Type', 'application/json')
 38
 39     result = urllib2.urlopen(req)
 40     return simplejson.loads(result.read()).get('id')
 41
 42
 43
 44 # ツイート投稿用のURL
 45 url = "https://api.twitter.com/1.1/statuses/update.json"
 46
 47 #Amazon ranking
 48 #programming bestseller
 49 site1 = 'http://www.amazon.co.jp/gp/rss/bestsellers/books/492352/ref=zg_bs_492352_rsslink'
 50 fdd = feedParse(site1)
 51
 52 for i in [9,8,7,6,5,4,3,2,1,0]:
 53   # ツイート本文
 54   params = {"status": fdd.entries[i].title  + " " + shorten(fdd.entries[i].link)}
 55
 56   # OAuth認証で POST method で投稿
 57   twitter = OAuth1Session(CK, CS, AT, AS)
 58   req = twitter.post(url, params = params)
 59   print req.status_code
 60   time.sleep(5)
 61 time.sleep(3600)
			
		
Procfile
			
1 bot: python amazon.py
			
		
requirements.txt
			
1 feedparser==5.1.3
2 oauth==1.0.1
3 oauthlib==0.7.2
4 python-twitter==2.0
5 requests==2.2.1
6 requests-oauthlib==0.4.2
7 simplejson==3.3.1
			
		
完成したbotのID
https://twitter.com/amazon_mybot

参考にさせていただいたサイト

Heroku使ってPythonでTwitterのbot動かしてみる
http://firstspring1845.hatenablog.com/entry/2013/12/16/181601

heroku上のpythonアプリで使うライブラリをgithubからインストールする
http://d.hatena.ne.jp/yuheiomori0718/20120927/1348754427

よく使うHerokuコマンド
http://qiita.com/yuch_i/items/b9898ce482f30ab7ca87

Python で Twitter API にアクセス
http://qiita.com/yubais/items/dd143fe608ccad8e9f85

Python + goo.gl の API で短縮URL
http://d.hatena.ne.jp/mohayonao/20110111/1294723881

Pythonのfeedparserを使ってみる
http://bty.sakura.ne.jp/wp/archives/86