現在、弊社でもSlackを試験的に利用しているのですが、RTM APIを使えばローカルでもbotが作成できることを知ったのでPythonで作ってみようという記事です。
今回は第3回目です。
前回はSlackbotのプラグインとして、DMやBotが参加しているチャンネル(グループ含む)内でのメンションや投稿内の特定の言葉に反応する機能を実装しましたが、Botとしては、任意の契機で投稿してくれる機能も欲しいですよね。ケースとしては時報であったり、リマインダだったりGitリポジトリへのpushの時だったりと色々と使えそうです。
残念ながら、今回利用しているSlackbotライブラリに自体はそのような機能を持っていないのですが、Slackbotライブラリが内部で利用しているSlackerライブラリを用いてSlack APIを使えばやりたいことは実現できます。
os/slacker: Full-featured Python interface for the Slack API
Slack API
Slackerで投稿(その1)
Slackerライブラリを利用するのはどのディレクトリでも問題はないのですが、Bot用にAPIトークンを記述したファイルをそのまま参照したいのでbot用のディレクトリに移動します。
$ cd bossan/ $ vi bossan_post1.py
プライベートグループに投稿してみます。
# -*- coding: utf-8 -*- from slacker import Slacker import slackbot_settings if __name__ == '__main__': slack = Slacker(slackbot_settings.API_TOKEN) slack.chat.post_message('bossan_test','こんにちわー')
$ python3 bossan_post1.py
あれ?アイコンと名前が違いますね。引数を追加してみましょう。
$ vi bossan_post2.py
# -*- coding: utf-8 -*- from slacker import Slacker import slackbot_settings if __name__ == '__main__': slack = Slacker(slackbot_settings.API_TOKEN) slack.chat.post_message( 'bossan_test', 'こんにちわー', as_user=True )
今度は引数に「as_user」をTrueで指定します。
$ python3 bossan_post2.py
おお、ちゃんと名前とアイコンが表示されました。でも、時にはデフォルトの名前とアイコン以外を使いたい時もありますよね?そんな時は…
$ vi bossan_post3.py
# -*- coding: utf-8 -*- from slacker import Slacker import slackbot_settings if __name__ == '__main__': slack = Slacker(slackbot_settings.API_TOKEN) slack.chat.post_message( 'bossan_test', 'こんにちわー', username='ボッサン', icon_emoji=':simple_smile:', )
引数に「username」と「icon_emoji」を指定します。
$ python3 bossan_post3.py
と、デフォルトとは別のものでも使えます。
投稿先は第一引数で指定しているのですが、当然普通にチャンネルやDMも送ることができます。
chat.postMessage method | Slack
投稿先の指定は名前でもIDでもよいのですが、今回は名前で指定してみました。なお、投稿先をチャンネルやグループではなく特定のユーザに対するDMとする場合は、as_user=Trueにしないと送信元がAPIトークンを指定したBotではなく、標準のslackbotになるので注意しましょう。
Slackerで投稿(その2)
さて、これで投稿はできましたがなんだかシンプルでさみしいですね。実はSlackではAttachementsという仕組みを使うともう少しリッチな形式を指定した投稿ができます。
$ vi bossan_post4.py
# -*- coding: utf-8 -*- from slacker import Slacker import slackbot_settings if __name__ == '__main__': slack = Slacker(slackbot_settings.API_TOKEN) attachment = { 'author_name': 'ビットログ', 'author_icon': 'https://XXXXXXXXXXXX/blog/bitlogo.png', 'author_link': 'https://blog.bitmeister.jp/?p=3892', 'title': 'PythonでSlackbotを作る(1)', 'text': '現在、弊社でもSlackを試験的に利用しているのですが、RTM APIを使えばローカルでもbotが作成できることを知ったのでPythonで作ってみようという記事です。\n今回は第1回目です。', 'image_url': 'https://XXXXXXXXXXXX/blog/07_slack.png', 'color': '#1e2c5b' } slack.chat.post_message( 'bossan_test', 'ブログが更新されました', as_user=True, attachments=[attachment] )
引数に「attachments」にdictの配列を指定します。dictに設定するキー項目は「Message Attachments」を参照してください。なお、配列を指定しているのでおわかりかと思いますが、複数のAttachment(dict)を設定することができます。
$ python3 bossan_post4.py
このように、タイトルや画像を添付した投稿を行うことが可能です。
※上記サンプルでは「author_icon」と「image_url」のURLは擬似なので環境に応じで変更してください。なお、参照先のURLによってはSlack側からの画像取得に時間がかかり送信エラーとなるケースが見受けられたので、同じ症状が発生した場合はdropbox等のクラウドストレージで共有して試してみると改善されるかもしれません。
ということで、Slackerライブラリを使えば、簡単に投稿できることができました。次回はいよいよ応用編に突入します。