仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書く雑記ブログ

PythonでSlackBot開発③「Twitterで話題のツイートを教えてくれる」


PythonでSlackBotを開発しよう企画の第3回目。今回は、Twitterで話題になっているツイートを探して教えてくれる機能を実装し、返答内容を追加する方法を紹介します。

今回紹介する内容を応用すれば、割となんでもBotで完結できそうな予感がしてます。


現在日時を教えてくれる機能の実装

まずは、「今何時?」と聞いたら今日の日時を教えてくれるように実装します。slack_settings.pyとrun.pyを以下のように変更します。


slack_settings.py

PLUGINS = [
    "slackbot.plugins"
]

↑ slackbot.pluginsというプラグインを利用できるように追加する。


run.py

# coding=utf-8
from slackbot.bot import Bot
from slackbot.bot import respond_to
from slackbot.bot import listen_to
import re
from datetime import datetime

# 「@bot名 今何時?」とメッセージすると時間を教えてくれる
@respond_to('今何時?')
def now(message):
    strftime = datetime.now().strftime("%Y/%m/%d %H時%M分%S秒っすね")
    message.reply(strftime)

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    main()

↑ 「@respond_to」で「@Bot名」以降の特定の文字列の入力を検知して、処理を行います。message.reply("文字列")で、文字列を返してくれます。


ファイルの記述ができたら、以下のコマンドでherokuにlocalの変更内容を反映させ、herokuアプリケーションを再起動します。

$ git add {変更したファイルパス名}
$ git commit -m "{コミット名}"
$ git push heroku master
$ heroku restart


これで実装は完了です。Slackで実際に話しかけてみると。。。

f:id:virtual-surfer:20180401155500p:plain

今の日時を教えてくれました!


日時を教えてくれるだけだとさすがに寂しいので、もっと有益な回答してくれるように実装していきましょう。


話題のツイートを教えてくれる機能の実装

Twitterから特定の文章で100検索をして、いいね数が多いものの上位5件を表示するようにしてみましょう。まずは以下のようにrun.pyファイルを編集します。


run.py

# coding=utf-8
from slackbot.bot import Bot
from slackbot.bot import respond_to
import tweepy
import os

@respond_to('searchTweet (.*)')
def search_tweet(message, word):
    # twitterのアクセス情報
    auth = tweepy.OAuthHandler(os.environ['CONSUMER_KEY'], os.environ['CONSUMER_SECRET'])
    auth.set_access_token(os.environ['ACCESS_TOKEN'], os.environ['ACCESS_TOKEN_SECRET'])
    api = tweepy.API(auth)
    post_text = ''
    message.send('「' + word + '」でtweet検索するね...')
    search_results = api.search(q=word, lang='ja', result_type='recent', count=100)
    # 検索結果を辞書{検索結果, いいね数}に詰めていく
    result_dictionary = {}
    for result in search_results:
        user = result.user
        favorite_count = result.favorite_count
        tweet_link = 'https://twitter.com/' + user.screen_name + '/status/' + str(result.id)
        result_text = '\n' + user.name + '@(' + user.screen_name + ')\n' + result.text + '\n(' + str(favorite_count) + 'いいね)' +tweet_link + '\n'
        result_dictionary.setdefault(result_text, result.favorite_count)
    if len(result_dictionary) == 0:
        message.send('ツイート見つからなかったす。')
        return
    # いいね数が多い(valueの降順)ものからユーザー情報とつぶやき文章を取得
    loop_count = 0
    for k, v in sorted(result_dictionary.items(), key=lambda x: -x[1]):
        loop_count += 1
        post_text = post_text + '-------------------------------------------------------' + k
        # 5個分のツイートが取れたらループ中断
        if loop_count >= 5:
            break
    message.send(post_text)

def main():
    bot = Bot()
    bot.run()

if __name__ == '__main__':
    main()

↑ やっていることとしては、TwitterAPIを使ってTweetを検索し、その中でいいね数の多いもの上位5つを表示するようにしてる感じですね。「loop_count >= 5」の数を変えれば表示するツイート数を変えることもできます。


ファイルの編集ができたら、TwitterAPIのアクセスキーをHerokuに登録していきます。

f:id:virtual-surfer:20180401160007p:plain

↓TwitterAPIはここを参照。そもそもAPIキー用意していないなら、こちらを参考に設定しましょう。

f:id:virtual-surfer:20180401151101p:plain


APIキーを登録できたら、ファイルの変更を反映して、Herokuを再起動していきます。

$ git add {変更したファイルパス名}
$ git commit -m "{コミット名}"
$ git push heroku master
$ heroku restart


これでSlackBotがいい感じに話題のつぶやきを返してくれるようになったはずです。話しかけてみましょう。「イケダハヤト」とかで検索してみると...

f:id:virtual-surfer:20180401154700p:plain


↓ 検索しても見つからなかった場合

f:id:virtual-surfer:20180401154847p:plain


これで気になった言葉で話題のつぶやきを探すことができるようになりました!


まとめ

今回はTwitterAPIとSlackBotライブラリを利用してBotが返答してくれる機能を実装してきました。

もっと他のAPI活用すれば便利な機能作れそう。割と職場でSlackを活用する場面が多いので、いろいろ触って機能追加していこうと思います!次回はCoingeckoとか仮想通貨チャート情報サイトのAPIを活用して相場情報を回答してくれるように実装していこうと思います!


↓ こちらを参考にして今回の実装をしました。

github.com


では!