2014/11/22 twitterBotをつくってみたよ!
python twitter API
今回は、pythonとtwitterAPIを使用して、定期的につぶやくbotを作成しようと思います。
botとは!
機械による自動発言システム。語源はロボットから来ている。特定の時間に自動ツイートする bot、ユーザーの bot 宛の発言にリプライする bot、特定のキーワードに反応する bot 等、様々な bot が存在する。-ツイナビより引用
製作
ということで、作成にとりかかります。
- python単体でtwitterに発言できるものを作る。
- サーバーでpythonをはしらせる
さて、pythonでプログラムを書くわけなのですが、
前段階として、以下の手順を行う必要があります。
- Twitterに(bot用の)アカウントを登録する
- 認証用のキーを入手する。(https://apps.twitter.com/)
- プログラム作成!
まずは手順1から順に行いましょう。
Twitterにアクセスし、アカウントを登録します。
こちらに関しては説明を省きます。
手順2,認証用のキーを取得します。アカウントが登録できたら、
こちらのサイトにアクセスし、認証用のキーを取得します。
- 「Create New App」をクリックします。
- 「Name(アプリの名前)」「Description(説明)」「Website(自分の持つホームページ)」を入力。
- 「Kes and AccessTokens」タブをクリックし、(Access Level)という項目の、(modify app permisions)を押す。
- 「Read only」から「Read and write」もしくは「Read,Write and direct messeges」に変更する。
- 「Keys and AccessTokens」タブに戻り、Your Access Tokenの「Create my access token」を押す。
- 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の場合
- gemをインストールします。
- gem install heroku
- vim ProcFileでProcFileを作成します。(中身は bot: python amazon.py)
- vim requirements.txtでrequirements.txtを作成します。(中身は後述)
- git をインストールします。
- リポジトリにする場所にgit init
- git add -A
- git commit -m "Initialize commit"
- 最後に、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のIDhttps://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