年間レポート 〜2015年版〜

ぐだぽよ~、おきなわです。

先ほどメールチェックをしていたら jetpack から 2015年 の年間レポートなるものが見れるようになったので、自分用にもメモとして掲載しておこうと思います。

2015年のブログ

自分で Facebook にこのブログのことを投稿したことはないため、トップリファラーサイトとして Facebook があるのが謎です、、、

まぁ眺める分には面白かったので、興味がある方はぜひ見てみて下さい。

5 秒くらいは暇つぶし出来ます(*^_^*)

ではでは〜

簡単!にゃんぱす 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 を作ってみてください。楽しいですよ♪

終了ステータスを見える化しよう!

やっはろー、おきなわです。

皆さんは普段プログラムやコマンドを実行した後、ちゃんと終了ステータスを確認したりしてますか?

確認しないよ〜って人はプログラムやコマンドが正常に動作した事をどうやって確かめてますか?

私は作業中は基本的に終了ステータスを確認するようにしています。そうしておいたほうが経験上、何かと便利なので。そんな終了ステータスですが、もちろん毎回

$ echo $?

と打って確認している訳ではありません。見える化をしてひと目で分かるようにしています。

というわけで今回はこういう風に見える化してるよ!という紹介をしたいと思います。ちなみに私は普段 bash を使っているので今回は bash での設定の話になります。

他のシェルを使ってる方はまぁ、頑張ってください(*^_^*)

とまぁ前置きが長くなってしまいましたが、私がやっている見える化は .bashrc に以下の一文を追加しているだけです。

PS1="[ \`if [ \$? = 0 ]; then echo \[\e[1m\e[32m\]\u\[\e[0m\]; else echo \[\e[1m\e[31m\]\u\[\e[0m\]; fi\` @ \[\e[1m\e[31m\]\h\[\e[0m\] \[\e[33m\]\[\e[1m\]\w\[\e[0m\] ]\$ "

詳しくは説明しませんが PS1 を設定することでシェルの表示を変更する事が出来ます。コレを上手く利用することで、コマンドの終了ステータスが 0 以外ならユーザ名が赤色に、0 なら緑色になるようにしています。

ちなみにこんな感じで表示されます。

表示例

これで正常終了したかそうじゃないかが一目でわかりますね。

またホスト名やカレントディレクトリの表示色も変えて目立つようにしています。よく複数のホストにまたがって作業を行うので、サーバを間違えないように目立つようにしています。

地味に便利なので一度お試しあれ☆(ゝω・)vキャピ

ブログ初めたよ

初めまして。

これまでに何度かブログを作っては消し作っては消しをしてきました、おきなわです。

今まではこれといって書く事がなかったためにブログを作っても更新せず、結局消してしまうといった流れが確立していたのですが、最近になってブログがないと備忘録とか Write up とかを書く場所が無いな〜と思い始めたため、なんとなく気の向くままにまた作ってみました。

これからはちゃんと更新して続けていけるように頑張ります(*^_^*)

よろしくね☆(ゝω・)vキャピ