[Cron] เขียน slackbot ส่ง notification เตือน standup meeting

โจทย์คือ เราต้องการสร้าง Slackbot เพื่อแจ้งเตือนใน channels ที่เรา subscribe ไว้ ตอนเวลา 9.59 น.ตอนเช้า เพื่อในเวลา 10.00 น.จะมี standup meeting ที่ Pronto Tools

Set up environment

$ virtualenv venv

$ source venv/bin/activate

โหลด slackclient API library เพื่อที่จะให้เราส่งและรับข้อความจาก Slack ให้ได้ก่อน

(venv) $ pip install slackclient

  1. ก่อนอื่น ไปสร้าง Slack team ให้เรียบร้อย หรือจะใช้ที่มีอยู่ก็ได้

2. เข้าไปสร้าง bot

note : แต่ชื่อจะซ้ำกับ Slackbot ซึ่งเป็น bot จริงๆของ Slack ไม่ได้นะ

Screen Shot 2559-12-29 at 9.23.39 PM.png

จากนั้นเราก็จะได้ SLACK_BOT_TOKEN มา ซึ่งเป็น access token ที่ทำให้เราเชื่อม API ต่อในฐานะ bot ได้

3. เข้า Slack เพื่อสร้าง channel ใหม่ เพื่อ test ในที่นี้จะชื่อว่า slackbot_test

และอย่าลืม invite slackbot ของเราด้วยล่ะ

Start our project

สร้าง directory  ขึ้นมาเพื่อความเรียบร้อย

(venv) $ mkdir slackbot

สร้างไฟล์ send_noti_by_bot.py


from slackclient import SlackClient

slack_token = "xoxb-1206XXXXXXXX" #ใส่ access token ที่เราได้มา
slack_client = SlackClient(slack_token)
api_call = slack_client.api_call("channels.list")

if slack_client.rtm_connect():
  print "Successfully connected"
  for channel in api_call.get("channels"):
      if channel.get("name") == "slackbot_test":
         response = "NOW it's time for STANDUP MEETING. YEAH"
         slack_client.api_call("chat.postMessage", channel="slackbot_test", text=response, as_user=True)
else:
   print "Connection failed"

if slack_client.rtm_connect():
  print "Successfully connected"

จะเป็นการเช็คว่าเราเชื่อมกับ RTM หรือ Real Time Messaging API ได้หรือไม่  เพราะ Bot ของ slack จะใช้ API ตัวนี้

api_call = slack_client.api_call("channels.list")
..
  for channel in api_call.get("channels"):
      if channel.get("name") == "slackbot_test"

สร้าง api_call instantiate มาจาก slack_client เพื่อใช้ method channels.list  เพื่อเรียกดู list ของ channels ทั้งหมดของ team (ในกรณีนี้จะไม่รวม private channel) และหาชื่อ channel ที่เราได้สร้างขึ้น

slack_client.api_call("chat.postMessage", channel="slackbot_test", text=response, as_user=True)

chat.postMessage เป็น method ที่ช่วยให้เราส่งข้อความไปยัง public channel ได้


Now get back to our main point — Cron

ถ้าใครยังไม่เคยอ่าน อันเชิญญญญญญ

ดังนั้น Cron ของเราจะแบ่งออกเป็น 2 ส่วน นึกคร่าวๆในหัว

[time] [command]

เราอยากให้ bot เตือนเรา ณ เวลา 9.59 น. เพื่อไป standup meeting ให้ทันตอน 10 โมง

 59 9 * * 1-5

แน่นอนว่าเราไม่ทำงานวัน ส-อา แน่นอน

ในส่วนของ command นั้น ถ้าเราทำเหมือนที่เราเคยทำ

/usr/bin/python /home/ubuntu/slackbot/send_noti_by_bot.py

ดังนั้นเราเริ่มสร้าง Cron  จริงๆกันเลย

crontab -e

 59 9 * * 1-5 /usr/bin/python /home/ubuntu/slackbot/send_noti_by_bot.py

และเซฟให้เรียบร้อย

แต่!

ในวันถัดมาตอน 9.59 น.  slackbot กลับไม่ส่งข้อความมาเตือนเราซะงั้น ?

ทำไมล่ะ นั่นก็เพราะ python ที่เราใช้เป็นของ virtualenv ยังไงล่ะ

59 9 * * 1-5  /home/ubuntu/slackbot/venv/bin/python /home/ubuntu/slackbot/send_noti_by_bot.py

เพียงเท่านี้เราก็จะได้ slackbot มาเตือนเแบบ auto แล้ว

screen-shot-2559-12-30-at-9-25-33-am
ทดสอบระบบด้วยการส่ง msg มาทุก 1 นาที

Reference: https://api.slack.com/bot-users

2 thoughts on “[Cron] เขียน slackbot ส่ง notification เตือน standup meeting

  1. Pingback: [Cron] Automate Tweet บอกเวลาด้วย Python กันเถอะ | mesodiar

  2. Pingback: [ขำขัน] ใช้ Slack แจ้งเตือนเมื่อรัน Command บนเครื่องเซิฟเวอร์เสร็จ – NatkungZ Blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.