簡単!にゃんぱす Bot を作ろう!

にゃんぱすー、おきなわです。

ついに待ちに待ったのんのんびより りぴーとの放送が始まりました!!!いぇーい!

ということで Twitter のタイムラインをにゃんぱすーで賑やかにするために、Twitter に「にゃんぱすー」と自動投稿する Bot プログラム、にゃんぱす Bot を作っていきたいと思います。

環境の事前準備

今回は Python を使って Bot プログラムを書いていきます。Python にも Twitter API を簡単に使えるように有志が作成したライブラリが多くあるのですが、ここでは tweepy を使用します。なので事前に Python の実行環境を用意し、tweepy をインストールしておいてください(pip を利用すると簡単に tweepy をインストールできます)。

では環境が既に準備されているという前提で、まずは Bot を作るために必要な情報を用意しましょう。

Bot を Twitter Apps に登録する

まず最初に Bot を動かしたいアカウントで Twitter にログインし、ログインが出来たら Twitter Application Management にアクセスします。

スクリーンショット 2015-07-09 5.23.12

Create New App をクリックします。(上の画面だと既に幾つか登録してあったため登録済みのアプリが表示されていますが、一度も登録したことがないと何も表示されず、Create New App ボタンが真ん中に表示されます。)

スクリーンショット 2015-07-09 5.28.41

作成するアプリの情報を適当に入力します。

  • Name:アプリの名前です。ほかのユーザからも見ることが出来ます
  • Description:アプリの説明です。10 文字以上 200 文字以内で書くことが出来ます
  • Website:アプリのホームページとして登録するサイトの URL を入力します
  • Callback URL:今回は使用しないため、入力しなくても大丈夫です

スクリーンショット 2015-07-09 5.28.55

アプリの情報を入力後、規約に同意するというチェックボックスをチェックし、Create your Twitter application をクリックします。

スクリーンショット 2015-07-09 5.40.11

アプリが作成出来ました。次にアプリ名の下に表示されているタブのうち、Keys and Access Tokens をクリックします。

スクリーンショット 2015-07-09 5.49.28

Consumer Key (API Key) と Consumer Secret (API Secret) が表示されると思うのでメモっといてください。あとで使用します。(上の画像ではわざと消しています。)

スクリーンショット 2015-07-09 5.49.44

下の方に Create my access token というボタンがあるので、それをクリックします。

スクリーンショット 2015-07-09 5.56.26

Access Token と Access Token Secret が表示されますのでこれもまたメモっといてください。あとで使用します。(上の画像ではわざと消しています。)

これで準備が整いました。それでは早速 Bot プログラムを書きましょう。

にゃんぱす Bot のプログラムを書く

では Python で次のようなプログラム simple_tweet.py を書きましょう。


#!/usr/bin/env python
#-*- coding:utf-8 -*-
import tweepy
# infomation to access twitter api.
consumer_key = 'XXXXXXXXXXXXXXXXXXXXXXXXX'
consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
access_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
# authenticate the twitter account by OAuth
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth_handler=auth)
# tweet
api.update_status(status="にゃんぱすー")

view raw

simple_tweet.py

hosted with ❤ by GitHub

7 行目から 10 行目の consumer_key などのところはそれぞれ Bot を登録した際にメモったものを書いてください。その情報を使用して 13 行目から 15 行目でアカウントの認証を OAuth 認証で行います。最後に 18 行目でツイートを行います。「にゃんぱすー」と書かれた部分を変更することでさまざまなことをつぶやくことが出来ます。

では早速動かしてみましょう。ターミナルで以下のように実行します。

$ chmod 744 simple_tweet.py
$ ./simple_tweet.py

すると以下のようにツイートができます。

上記のプログラムを決まった時間に実行することで時報などの定期的につぶやく Bot が作れるわけです。簡単ですね。

では今度は「にゃんぱすー」と挨拶されたら「にゃんぱすー」と返事をするボットを作ってみましょう。次のようなプログラム simple_bot.py を書きましょう。


#!/usr/bin/env python
#-*- coding:utf-8 -*-
import tweepy
import simplejson
import random
# infomation to access twitter api.
consumer_key = 'XXXXXXXXXXXXXXXXXXXXXXXXX'
consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
access_token_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
# authenticate the twitter account by OAuth.
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth_handler=auth)
# get bot name
bot_name = api.me().screen_name
# create streamlistener class to modify action in userstreaming.
class myStreamListener(tweepy.StreamListener):
# define the action when data come from twitter.
def on_data(self, data):
# the style of data which come from twitter is json, so start with "{".
if data.startswith("{"):
# convert json to Python dictionary, because it is very useful.
data = simplejson.loads(data)
# define the action when catch any tweet.
if "text" in data:
# if the tweet is reply to bot and it contains keyword, return a greeting.
if data['in_reply_to_screen_name'] == bot_name and "にゃんぱすー" in data['text']:
Tweet = "@" + data['user']['screen_name'] + " にゃんぱすー" + " " * random.randint(0,10)
api.update_status(status = Tweet, in_reply_to_status_id = data['id'])
# set information to start streaming
stream = tweepy.Stream(auth=api.auth, listener=myStreamListener(), secure=True, timeout=None)
# start userstreaming
stream.userstream()

view raw

simple_bot.py

hosted with ❤ by GitHub

上記のプログラムでは userstream を使用しています。そうすることでリアルタイムで返答を返すことが出来ます。7 行目から 10 行目の consumer_key などのところは先ほどと同じように、それぞれ Bot を登録した際にメモったものを書いてください。20 行目で Bot 自身の名前を取得し、それを元に 33 行目で自分へのツイートかどうか、またツイートに「にゃんぱすー」というキーワードが含まれているかどうかを判断しています。34 行目では返事のツイートを作成しているのですが、ツイートの最後に全角スペースをランダムで付けることでツイートが重複して呟けなくなることを防いでいます。ではコマンドラインから動かしてみましょう。このプログラムは一度動作させると接続が切られるまでずっと動作し続けるので、& を付けてバックグラウンドで動作させるのがよいでしょう。

$ chmod 744 simple_bot.py
$ ./simple_bot.py &

ではボットに話しかけてみましょう。

挨拶をすると自動で返答してくれました。より Bot らしくなりましたね。

より複雑な Bot への発展

より複雑な挙動を行う Bot を作成したい場合は、上記の simple_bot.py プログラムの myStreamListener クラスの 32 行目以下を書き換えることで作ることが出来ます。なお userstream における 1 つのツイートが持つ情報ですが、例えば

というツイートだと、以下のように情報が流れてきます。


{
'lang': 'ja',
'possibly_sensitive': False,
'geo': None,
'contributors': None,
'in_reply_to_status_id_str': None,
'truncated': False,
'user': {
'profile_link_color': '00B4CC',
'following': None,
'default_profile': False,
'utc_offset': 32400,
'friends_count': 419,
'statuses_count': 57898,
'time_zone': 'Tokyo',
'listed_count': 38,
'geo_enabled': True,
'default_profile_image': False,
'favourites_count': 1551,
'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme19/bg.gif',
'profile_sidebar_border_color': 'FFF8AD',
'verified': False,
'description': "九州工業大学 学生です\r\nクズです☆(ゝω・)vキャピ\r\nLet's begin FX! \r\n\\カーニバルダヨ!/",
'profile_background_tile': False,
'id': 215645258,
'profile_text_color': '333333',
'profile_background_color': 'FFF04D',
'profile_sidebar_fill_color': 'F6FFD1',
'notifications': None,
'name': 'ふぃりぴん∅おきなわ',
'followers_count': 438,
'created_at': 'Sun Nov 14 14:38:03 +0000 2010',
'protected': False,
'profile_image_url_https': 'https://pbs.twimg.com/profile_images/564047755547377667/r7uHX8kc_normal.png',
'profile_image_url': 'http://pbs.twimg.com/profile_images/564047755547377667/r7uHX8kc_normal.png',
'id_str': '215645258',
'location': '福岡/飯塚',
'is_translator': False,
'screen_name': 'take01x',
'lang': 'ja',
'profile_use_background_image': True,
'contributors_enabled': False,
'follow_request_sent': None,
'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme19/bg.gif',
'url': 'http://www.take01x.okinawa',
'profile_banner_url': 'https://pbs.twimg.com/profile_banners/215645258/1400589127'
},
'place': None,
'source': '<a href="http://sites.google.com/site/yorufukurou/" rel="nofollow">YoruFukurou</a>',
'id_str': '618913474677059584',
'text': 'This is sample\nこれはサンプルです',
'in_reply_to_user_id': None,
'timestamp_ms': '1436395445876',
'in_reply_to_screen_name': None,
'created_at': 'Wed Jul 08 22:44:05 +0000 2015',
'favorite_count': 0,
'entities': {
'urls': [],
'hashtags': [],
'trends': [],
'user_mentions': [],
'symbols': []
},
'in_reply_to_status_id': None,
'filter_level': 'low',
'id': 618913474677059584,
'favorited': False,
'retweet_count': 0,
'in_reply_to_user_id_str': None,
'retweeted': False,
'coordinates': None
}

view raw

tweet.py

hosted with ❤ by GitHub

そのため、例えば上記の simple_bot.py プログラムの myStreamListener クラスの 32 行目以降において、ツイートしたユーザの名前にアクセスするには data[‘user’][‘screen_name’] 、ツイート本文にアクセスするには data[‘text’] と書けば良いわけです。なお、詳しいデータ構造や各値の意味については以下のサイトを参考にしてください。

Streaming message types | Twitter Developers

さいごに

だいぶ説明を省きましたが、以上のように、単純に特定のキーワードに反応して特定のツイートを行うという Bot なら比較的簡単に書くことが出来ます。

Python をこれから勉強したいという方、Twitter の Bot を作ってみたいという方はぜひ自分の Bot を作ってみてください。楽しいですよ♪