シェルスクリプトマガジン

香川大学SLPからお届け!(Vol.66掲載)

著者:檜垣 龍德

 今回は、Pythonとそのライブラリである「slacker」「python-crontab」を用いて、チャットサービス「Slack」にメッセージを自動投稿するbo(t Slackbot)を開発する方法を解説します。例として開発するのは、参加者からメッセージが投稿されるまで「Get Up !!」というメッセージを連続投稿するbotです。

シェルスクリプトマガジン Vol.66は以下のリンク先でご購入できます。

図7 「.env」ファイルに記述する内容

ACCESS_TOKEN=アクセストークン
CHANNEL_ID=チャンネルID

図8 「settings.py」ファイルに記述する内容

import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

ACCESS_TOKEN = os.environ.get("ACCESS_TOKEN")
CHANNEL_ID = os.environ.get("CHANNEL_ID")

図9 「main.py」ファイルに記述する内容

from slacker import Slacker
import settings

slack = Slacker(settings.ACCESS_TOKEN)
slack.chat.post_message("チャンネル名", "Get Up !!")

図11 「cron.py」ファイルに記述する内容

from crontab import CronTab

cron = CronTab()
job = cron.new('python main.py')
job.setall('00 00 * * *')
for result in cron.run_scheduler():
  print("Done Job"

図12 書き換えたmain.pyファイルの内容

from slacker import Slacker
from time import sleep
import settings

slack = Slacker(settings.ACCESS_TOKEN)
channel_id = settings.CHANNEL_ID
slack.chat.post_message("チャンネル名", "Get Up !!")
history = slack.channels.history(channel_id)
start_ts = history.body["messages"][0]["ts"]
while True:
    sleep(1)
    history = slack.channels.history(channel_id, count=10000, oldest=start_ts)
    not_bot_users = [message["user"] for message in history.body["messages"] if "bot_id" not in message]
    if len(not_bot_users):
        break
     else:
        slack.chat.post_message("チャンネル名", "Get Up !!")

図14 書き換えたmain.pyファイルに追記する内容

history = slack.channels.history(channel_id, count=10000, oldest=start_ts)
ts_list = [message["ts"] for message in history.body["messages"] if 'bot_id' in message]
ts_list.append(start_ts)
for ts in ts_list:
    slack.chat.delete(channel_id, ts=ts, as_user=True)