โจทย์คือ เราต้องการสร้าง 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
- ก่อนอื่น ไปสร้าง Slack team ให้เรียบร้อย หรือจะใช้ที่มีอยู่ก็ได้
2. เข้าไปสร้าง bot
note : แต่ชื่อจะซ้ำกับ Slackbot ซึ่งเป็น bot จริงๆของ Slack ไม่ได้นะ

จากนั้นเราก็จะได้ 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 แล้ว

Reference: https://api.slack.com/bot-users
Leave a reply to [Cron] Automate Tweet บอกเวลาด้วย Python กันเถอะ | mesodiar Cancel reply