2018/04/01 ブログのテーマをcocoonに変更しました。

Pythonで作るTwitter Bot(晩飯Bot)

前回の記事の続きになります。

見てない方は是非こちらの記事もご覧ください!!

【GAS】Google Apps Scriptで作るTwitter Bot(晩飯 Bot)
いつも当ブログを見ていただいてる読者様からこんなリクエストがありました!! 実際に作っていこうと思います!! 作る機能 Twitterからのリクエストなので、Twitterのbotを作っていきます。 ...

 

今回はこちらのリクエストPythonを用いて作っていきます。

 

前回(GAS)のおさらい

正直リプライに最大1分かかるのって、ゴミですよねww

第1話、オーカワ ゴミBotを作る から抜粋

 

はい、リプライに1分かかるのを解決する為に、Raspberry Piをサーバーにします。

サーバーの設定(Raspberry Piの設定)

今回もRaspberry Piを使っていきます。

家に1つ余っていたので、それを使いますー

OSはRaspbianを入れました。

初期設定

OS入れたらみんな大好き!最初に唱える呪文

$ sudo apt update
$ sudo apt upgrade

を実行します。

SSHの設定(任意)
$ sudo raspi-config

SSH serverを解放してあげました。今のRaspbianってセキュリティを考えてSSH serverを最初から開放してないんです。

後はRaspberry Piが起動したら、無線で勝手に家のネットワークに繋がる設定をして、IPアドレスをルーター側の設定で固定しました。

前回(GAS)と今回(Python)の違い

使っているTwitterのAPI(アプリケーションプログラミングインタフェース)が違います。

GASの場合

REST APIsを使っていました。

いちいちアクセスしないといけない仕組みです。

GASだとREST APIsを使うしかないと思います。

 


GAS側
Twitterさん、新しいリプライ来てる?

Twitter側
例(2件来てるよーん)

Pythonの場合

Streaming APIsを使います。

これは一度、アクセスしたら、通信エラーを起こさない限り、永遠にデータをもらえます。(例えば、鍵垢以外のツイートをリアルタイムで取得できます。)

 

下のツイートを見ていただくと、想像しやすいかもしれません。

今回は、ツイートの中から、自分に来たリプライだけを取得し続けます。

作成したプログラム

アプリの作成

Twitter Applicationから適当にアプリを作っておきます。作らないと、プログラムを動かせません。

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access Token Secret

をプログラムに使います。

モジュールのインストール

今回はPython3を使うので、pip3でインストールします。

sudo pip3 install tweepy

twitterを扱えるモジュールはいくつかありますが、今回はtweepyを使います。深い理由はありません。

sudo pip3 install bs4

Web スクレイピングをするためにBeautiful Soupを使います。

 

 

#! /usr/bin/env python3
# -*- coding: utf-8 -*-
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import urllib
import tweepy
AT = "入れてね"
AS = "入れてね"
CS = "入れてね"
CK = "入れてね"
class Listener(tweepy.StreamListener):
def on_status(self, status):
#status.created_at += datetime.timedelta(hours=9)
# リプライが来たら行動
if (status.in_reply_to_screen_name) == api.me().screen_name:
status_id = status.id
text = status.text.replace("@" + str(api.me().screen_name), "")
text = text.replace(" ", "")
tweet = self.cookpad(text)
tweet_rep = "@" + str(status.user.screen_name) + " " + str(tweet)
api.update_status(status=tweet_rep,in_reply_to_status_id=status_id)
return True
#エラーでたら
def on_error(self, status):
print('Got an error with status code: ' + str(status))
return True
#たまにエラーでる
def on_timeout(self):
print('Timeout...')
return True
#自動フォロー
def on_event(self, event):
if event.event == 'follow':
if event.source["id"] != api.me().id:
api.create_friendship(event.source["id"])
def cookpad(self, menu):
search = urllib.parse.quote(menu)
try:
html = urlopen("https://cookpad.com/search/" + search)
soup = BeautifulSoup(html.read(), "html.parser")
if soup == []:
return "一致するレシピがありませんでした"
link = soup.find_all(class_="title font16")
#url取得
regex = r'recipe/\d*'
pattern = re.compile(regex)
url = pattern.findall(str(link))
url = url[0]
url = 'https://cookpad.com/' + str(url);
#title取得
regex = r'">.*<'
pattern = re.compile(regex)
title = pattern.findall(str(link))
title[0] = title[0][2:-1]
return 'こんなのどうでしょう?' + '【' + str(title[0]) + '】' + str(url)
except :
return  "原因不明のエラー"
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)
listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.userstream()

ぱぱぱーと1時間程で書いたプログラムなので、もしかしたら変な所があるかも......

今のところ動きます。

Raspberry Piの電源を入れたら、プログラムを起動するように設定をする

先ほどのプログラム(twitter.py)を /usr/local/bin/ の中に保存しました。

 $ which twitter.py
/usr/local/bin/twitter.py

 

次に /etc/rc.local に twitter.pyと記述して保存します。

これでRaspberry Piを再起動したら、プログラムが自動で起動しているはずです。

おかしい場合は、/var/log/boot.log にエラーが出ます。

 

これで間違えて電源のコードを抜いても大丈夫ね!!

結果

GASの時とやってる事は変わりません。変わらなすぎて、プログラムの勉強になるかも(笑)

 

ただ返信は爆速になりました。リプライした瞬間に返って来ます。

感想

なるべく、サーバーを使いたくなかったのですが、リアルタイムを希望ならしょうがないですね。

でもでも簡単に出来てよかったです。Pythonは最高です。

 

この晩飯BOTは鍵垢以外だったら返信出来ますので、試してみてください!!

余談

Twitter IDが @banmsesi_bot のローマ字がおかしいのはわざとです。メンバーにめちゃくちゃ突っ込まれた

本当は @banmesi_botがよかったけど、使われていたので、Twitterさんの候補のIDを使いました。

参考

いつもお世話になっております。

Python Webスクレイピング 実践入門
Tweepy
TweepyとStreaming APIで自動リプライbotをつくる | Anyway, Let's Create!
TweepyでTwitterのStreaming APIを使って自動リプライbotを作ってみた。 ラズパイでbotとなるとpythonで書きたくなってくるので、 python対応...

コメント