
ÁÄÌì»úÆ÷ÈË(Bot) ÊÇÒ»ÖÖÏñ Slack Ò»ÑùµÄʵÓõĻ¥¶¯ÁÄÌì·þÎñ·½Ê½¡£Èç¹ûÄã֮ǰ´ÓÀ´Ã»Óн¨Á¢¹ýÁÄÌì»úÆ÷ÈË£¬ÄÇôÕâÆªÎÄÕÂÌṩÁËÒ»¸ö¼òµ¥µÄÈëÃÅÖ¸ÄÏ£¬¸æËßÄãÈçºÎÓÃ
Python ½áºÏ Slack API ½¨Á¢ÄãµÚÒ»¸öÁÄÌì»úÆ÷ÈË¡£
ÎÒÃÇͨ¹ý´î½¨ÄãµÄ¿ª·¢»·¾³, »ñµÃÒ»¸ö Slack API µÄÁÄÌì»úÆ÷ÈËÁîÅÆ£¬²¢ÓÃ
Pyhon ¿ª·¢Ò»¸ö¼òµ¥ÁÄÌì»úÆ÷ÈË¡£
ÎÒÃÇËùÐèµÄ¹¤¾ß
ÎÒÃǵÄÁÄÌì»úÆ÷ÈËÎÒÃǽ«Ëü³Æ×÷Ϊ¡°StarterBot¡±£¬ËüÐèÒª Python
ºÍ Slack API¡£ÒªÔËÐÐÎÒÃÇµÄ Python ´úÂ룬ÎÒÃÇÐèÒª£º
Python 2 »òÕß Python 3
pip ºÍ virtualenv À´´¦Àí Python Ó¦ÓóÌÐòÒÀÀµ¹ØÏµ
Ò»¸ö¿ÉÒÔ·ÃÎÊ API µÄÃâ·Ñ Slack Õ˺ţ¬»òÕßÄã¿ÉÒÔ×¢²áÒ»¸ö
Slack Developer Hangout team¡£
ͨ¹ý Slack ÍŶӽ¨Á¢µÄ¹Ù·½ Python Slack ¿Í»§¶Ë´úÂë¿â
Slack API ²âÊÔÁîÅÆ
µ±ÄãÔÚ±¾½Ì³ÌÖнøÐй¹½¨Ê±£¬Slack API Îĵµ ÊǺÜÓÐÓõġ£
±¾½Ì³ÌÖÐËùÓеĴúÂë¶¼·ÅÔÚ slack-starterbot ¹«¹²¿âÀ²¢ÒÔ
MIT Ðí¿ÉÖ¤¿ªÔ´¡£
´î½¨ÎÒÃǵĻ·¾³
ÎÒÃÇÏÖÔÚÒѾ֪µÀÎÒÃǵÄÏîÄ¿ÐèҪʲôÑùµÄ¹¤¾ß£¬Òò´ËÈÃÎÒÃÇÀ´´î½¨ÎÒÃÇËùµÄ¿ª·¢»·¾³°É¡£Ê×Ïȵ½ÖÕ¶ËÉÏ(»òÕß
Windows ÉϵÄÃüÁîÌáʾ·û)²¢ÇÒÇл»µ½ÄãÏëÒª´æ´¢Õâ¸öÏîÄ¿µÄĿ¼¡£ÔÚÄǸöĿ¼À´´½¨Ò»¸öÐ嵀 virtualenv
ÒÔ±ãºÍÆäËûµÄ Python ÏîÄ¿Ïà¸ôÀëÎÒÃǵÄÓ¦ÓóÌÐòÒÀÀµ¹ØÏµ¡£
¼¤»î virtualenv£º
source starterbot/bin/activate |
ÄãµÄÌáʾ·ûÏÖÔÚÓ¦¸Ã¿´ÆðÀ´Èç½ØÍ¼£º

ÒѾ¼¤»îµÄ starterbot µÄ virtualenvµÄÃüÁîÌáʾ·ûÕâ¸ö¹Ù·½µÄ
slack ¿Í»§¶Ë API °ïÖú¿âÊÇÓÉ Slack ½¨Á¢µÄ£¬Ëü¿ÉÒÔͨ¹ý Slack ͨµÀ·¢ËͺͽÓÊÕÏûÏ¢¡£Í¨¹ýÕâ¸öpip
ÃüÁî°²×° slackclient ¿â£º
µ± pip ÃüÁîÍê³Éʱ£¬ÄãÓ¦¸Ã¿´µ½ÀàËÆÕâÑùµÄÊä³ö£¬²¢·µ»ØÌáʾ·û¡£

ÔÚÒѾ¼¤»îµÄ virtualenv Óà pip °²×° slackclient
µÄÊä³öÎÒÃÇÒ²ÐèҪΪÎÒÃÇµÄ Slack ÏîÄ¿»ñµÃÒ»¸ö·ÃÎÊÁîÅÆ£¬ÒÔ±ãÎÒÃǵÄÁÄÌì»úÆ÷ÈË¿ÉÒÔÓÃËüÀ´Á¬½Óµ½ Slack
API¡£
Slack ʵʱÏûÏ¢´«µÝ(RTM)API
Slack ÔÊÐí³ÌÐòͨ¹ýÒ»¸ö Web API À´·ÃÎÊËûÃǵÄÏûÏ¢´«µÝͨµÀ¡£È¥Õâ¸ö
Slack Web API Ò³Ãæ ×¢²á½¨Á¢Äã×Ô¼ºµÄ Slack ÏîÄ¿¡£ÄãÒ²¿ÉÒԵǼһ¸öÄãÓµÓйÜÀíȨÏÞµÄÒÑÓÐÕ˺š£

ʹÓà Web APIÒ³ÃæµÄÓÒÉϽǵǼ°´Å¥µÇ¼ºóÄã»áµ½´ï ÁÄÌì»úÆ÷ÈËÓû§Ò³Ãæ¡£

¶¨ÖÆÁÄÌì»úÆ÷ÈËÓû§Ò³Ãæ¸øÄãµÄÁÄÌì»úÆ÷ÈËÆðÃûΪ¡°starterbot¡±È»ºóµã»÷
¡°Add bot integration¡± °´Å¥¡£

Ìí¼ÓÒ»¸öbot integration ²¢ÆðÃûΪ¡°starterbot¡±Õâ¸öÒ³Ãæ½«ÖØÐ¼ÓÔØ£¬Ä㽫¿´µ½Ò»¸öÐÂÉú³ÉµÄ·ÃÎÊÁîÅÆ¡£Ä㻹¿ÉÒÔ½«±êÖ¾¸Ä³ÉÄã×Ô¼ºÉè¼ÆµÄ¡£ÀýÈçÎÒ¸øµÄÕâ¸ö¡°Full
Stack Python¡±±êÖ¾¡£

ΪÄãµÄРSlack ÁÄÌì»úÆ÷È˸´ÖƺÍÕ³Ìù·ÃÎÊÁîÅÆÔÚÒ³Ãæµ×²¿µã»÷¡°Save
Integration¡±°´Å¥¡£ÄãµÄÁÄÌì»úÆ÷ÈËÏÖÔÚÒѾ׼±¸ºÃÁ¬½Ó Slack API¡£
Python ¿ª·¢ÈËÔ±µÄÒ»¸ö³£¼ûµÄ×ö·¨ÊÇÒÔ»·¾³±äÁ¿Êä³öÃØÃÜÁîÅÆ¡£Êä³öµÄ
Slack ÁîÅÆÃû×ÖΪSLACK_BOT_TOKEN£º
export SLACK_BOT_TOKEN='ÄãµÄ slack ÁîÅÆÕ³ÌûÔÚÕâÀï' |
ºÃÁË£¬ÎÒÃÇÏÖÔڵõ½Á˽«Õâ¸ö Slack API ÓÃ×÷ÁÄÌì»úÆ÷È˵ÄÊÚȨ¡£
ÎÒÃǽ¨Á¢ÁÄÌì»úÆ÷ÈË»¹ÐèÒª¸ü¶àÐÅÏ¢£ºÎÒÃǵÄÁÄÌì»úÆ÷È赀 ID¡£½ÓÏÂÀ´ÎÒÃǽ«»áдһ¸ö¼ò¶ÌµÄ½Å±¾£¬´Ó
Slack API »ñµÃ¸Ã ID¡£
»ñµÃÎÒÃÇÁÄÌì»úÆ÷È赀 ID
ÕâÊÇ×îºóдһЩ Python ´úÂëµÄʱºòÁË! ÎÒÃDZàдһ¸ö¼ò¶ÌµÄ
Python ½Å±¾»ñµÃ StarterBot µÄ ID À´ÈÈÉíһϡ£Õâ¸ö ID »ùÓÚ Slack ÏîÄ¿¶ø²»Í¬¡£
ÎÒÃÇÐèÒª¸Ã ID£¬µ±½âÎö´Ó Slack RTM ÉÏ·¢¸ø StarterBot
µÄÏûϢʱ£¬ËüÓÃÓÚ¶ÔÎÒÃǵÄÓ¦ÓÃÑéÃ÷ÕýÉí¡£ÎÒÃǵĽű¾Ò²»á²âÊÔÎÒÃÇ SLACK_BOT_TOKEN »·¾³±äÁ¿ÊÇ·ñÉèÖÃÕýÈ·¡£
½¨Á¢Ò»¸öÃüÃûΪ printbotid.py µÄÐÂÎļþ£¬²¢ÇÒÌîÈëÏÂÃæµÄ´úÂ룺
import os from slackclient import SlackClient BOT_NAME = 'starterbot' slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN')) if __name__ == "__main__": api_call = slack_client.api_call("users.list") if api_call.get('ok'): # retrieve all users so we can find our bot users = api_call.get('members') for user in users: if 'name' in user and user.get('name') == BOT_NAME: print("Bot ID for '" + user['name'] + "' is " + user.get('id')) else: print("could not find bot user with the name " + BOT_NAME) |
ÎÒÃǵĴúÂëµ¼Èë SlackClient£¬²¢ÓÃÎÒÃÇÉèÖõĻ·¾³±äÁ¿ SLACK_BOT_TOKEN
ʵÀý»¯Ëü¡£ µ±¸Ã½Å±¾Í¨¹ý python ÃüÁîÖ´ÐÐʱ£¬ÎÒÃÇͨ¹ý»á·ÃÎÊ Slack API ÁгöËùÓеÄ
Slack Óû§²¢ÇÒ»ñµÃÆ¥ÅäÒ»¸öÃû×ÖΪ¡°satrterbot¡±µÄ ID¡£
Õâ¸ö»ñµÃÁÄÌì»úÆ÷È赀 ID µÄ½Å±¾ÎÒÃǽöÐèÒªÔËÐÐÒ»´Î¡£
µ±ËüÔËÐÐΪÎÒÃÇÌṩÁËÁÄÌì»úÆ÷È赀 ID ʱ£¬½Å±¾»á´òÓ¡³ö¼òµ¥µÄÒ»ÐÐÊä³ö¡£

ÔÚÄãµÄ Slack ÏîÄ¿ÖÐÓà Python ½Å±¾´òÓ¡ Slack ÁÄÌì»úÆ÷È˵Ä
ID¸´ÖÆÕâ¸ö½Å±¾´òÓ¡³öµÄΨһ ID¡£²¢½«¸Ã ID ×÷Ϊһ¸ö»·¾³±äÁ¿ BOT_ID Êä³ö¡£
(starterbot)$ export BOT_ID='bot id returned by script' |
Õâ¸ö½Å±¾½ö½öÐèÒªÔËÐÐÒ»´ÎÀ´»ñµÃÁÄÌì»úÆ÷È赀 ID¡£ ÎÒÃÇÏÖÔÚ¿ÉÒÔÔÚÎÒÃǵÄÔËÐÐ
StarterBot µÄ PythonÓ¦ÓóÌÐòÖÐʹÓÃÕâ¸ö ID ¡£
±àÂëÎÒÃÇµÄ StarterBot
ÏÖÔÚÎÒÃÇÓµÓÐÁËдÎÒÃÇµÄ StarterBot ´úÂëËùÐèµÄÒ»ÇС£ ´´½¨Ò»¸öÐÂÎļþÃüÃûΪ
starterbot.py £¬Ëü°üÀ¨ÒÔÏ´úÂë¡£
import os import time from slackclient import SlackClient |
¶Ô os ºÍ SlackClient µÄµ¼ÈëÎÒÃÇ¿´ÆðÀ´ºÜÊìϤ£¬ÒòΪÎÒÃÇÒѾÔÚ
theprintbotid.py ÖÐÓùýËüÃÇÁË¡£
ͨ¹ýÎÒÃǵ¼ÈëµÄÒÀÀµ°ü£¬ÎÒÃÇ¿ÉÒÔʹÓÃËüÃÇ»ñµÃ»·¾³±äÁ¿Öµ£¬²¢ÊµÀý»¯ Slack
¿Í»§¶Ë¡£
# starterbot µÄ ID ×÷Ϊһ¸ö»·¾³±äÁ¿ BOT_ID = os.environ.get("BOT_ID") # ³£Á¿ AT_BOT = "<@" + BOT_ID + ">:" EXAMPLE_COMMAND = "do" # ʵÀý»¯ Slack ºÍ Twilio ¿Í»§¶Ë slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN')) |
¸Ã´úÂëͨ¹ýÎÒÃÇÒÔÊä³öµÄ»·¾³±äÁ¿ SLACK_BOT_TOKEN ʵÀý»¯SlackClient`
¿Í»§¶Ë¡£
if __name__ == "__main__": READ_WEBSOCKET_DELAY = 1 # 1 ´Ó firehose ¶ÁÈ¡ÑÓ³Ù 1 Ãë if slack_client.rtm_connect(): print("StarterBot connected and running!") while True: command, channel = parse_slack_output(slack_client.rtm_read()) if command and channel: handle_command(command, channel) time.sleep(READ_WEBSOCKET_DELAY) else: print("Connection failed. Invalid Slack token or bot ID?") |
Slack ¿Í»§¶Ë»áÁ¬½Óµ½ Slack RTM API WebSocket£¬È»ºóµ±½âÎöÀ´×Ô
firehose µÄÏûϢʱ»á²»¶ÏÑ»·¡£Èç¹ûÓÐÈκη¢¸ø StarterBot µÄÏûÏ¢£¬ÄÇôһ¸ö±»³Æ×÷
handle_command µÄº¯Êý»á¾ö¶¨×öʲô¡£
½ÓÏÂÀ´Ìí¼ÓÁ½¸öº¯ÊýÀ´½âÎö Slack µÄÊä³ö²¢´¦ÀíÃüÁî¡£
def handle_command(command, channel): """ Receives commands directed at the bot and determines if they are valid commands. If so, then acts on the commands. If not, returns back what it needs for clarification. """ response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \ "* command with numbers, delimited by spaces." if command.startswith(EXAMPLE_COMMAND): response = "Sure...write some more code then I can do that!" slack_client.api_call("chat.postMessage", channel=channel, text=response, as_user=True) def parse_slack_output(slack_rtm_output): """ The Slack Real Time Messaging API is an events firehose. this parsing function returns None unless a message is directed at the Bot, based on its ID. """ output_list = slack_rtm_output if output_list and len(output_list) > 0: for output in output_list: if output and 'text' in output and AT_BOT in output['text']: # ·µ»Ø @ Ö®ºóµÄÎı¾£¬É¾³ý¿Õ¸ñ return output['text'].split(AT_BOT)[1].strip().lower(), \ output['channel'] return None, None |
parse_slack_output º¯Êý´Ó Slack ½ÓÊÜÐÅÏ¢£¬²¢ÇÒÈç¹ûËüÃÇÊÇ·¢¸øÎÒÃǵÄ
StarterBot ʱ»á×÷³öÅжϡ£ÏûÏ¢ÒÔÒ»¸ö¸øÎÒÃǵÄÁÄÌì»úÆ÷ÈË ID µÄÖ±½ÓÃüÁʼ£¬È»ºó½»ÓÉÎÒÃǵĴúÂë´¦Àí¡£Ä¿Ç°Ö»ÊÇͨ¹ý
Slack ¹ÜµÀ·¢²¼Ò»¸öÏûÏ¢»ØÈ¥¸æËßÓû§È¥¶àдһЩ Python ´úÂë!
ÕâÊÇÕû¸ö³ÌÐò×éºÏÔÚÒ»ÆðµÄÑù×Ó (ÄãÒ²¿ÉÒÔ ÔÚ GitHub Öв鿴¸ÃÎļþ)£º
import os import time from slackclient import SlackClient # starterbot µÄ ID ×÷Ϊһ¸ö»·¾³±äÁ¿ BOT_ID = os.environ.get("BOT_ID") # ³£Á¿ AT_BOT = "<@" + BOT_ID + ">:" EXAMPLE_COMMAND = "do" # ʵÀý»¯ Slack ºÍ Twilio ¿Í»§¶Ë slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN')) def handle_command(command, channel): """ Receives commands directed at the bot and determines if they are valid commands. If so, then acts on the commands. If not, returns back what it needs for clarification. """ response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \ "* command with numbers, delimited by spaces." if command.startswith(EXAMPLE_COMMAND): response = "Sure...write some more code then I can do that!" slack_client.api_call("chat.postMessage", channel=channel, text=response, as_user=True) def parse_slack_output(slack_rtm_output): """ The Slack Real Time Messaging API is an events firehose. this parsing function returns None unless a message is directed at the Bot, based on its ID. """ output_list = slack_rtm_output if output_list and len(output_list) > 0: for output in output_list: if output and 'text' in output and AT_BOT in output['text']: # ·µ»Ø @ Ö®ºóµÄÎı¾£¬É¾³ý¿Õ¸ñ return output['text'].split(AT_BOT)[1].strip().lower(), \ output['channel'] return None, None if __name__ == "__main__": READ_WEBSOCKET_DELAY = 1 # 1 second delay between reading from firehose if slack_client.rtm_connect(): print("StarterBot connected and running!") while True: command, channel = parse_slack_output(slack_client.rtm_read()) if command and channel: handle_command(command, channel) time.sleep(READ_WEBSOCKET_DELAY) else: print("Connection failed. Invalid Slack token or bot ID?") |
ÏÖÔÚÎÒÃǵĴúÂëÒѾÓÐÁË£¬ÎÒÃÇ¿ÉÒÔͨ¹ý python starterbot.py
À´ÔËÐÐÎÒÃÇ StarterBot µÄ´úÂëÁË¡£

µ± StarterBot ¿ªÊ¼ÔËÐжøÇÒÁ¬½Óµ½ API µÄÊä³öͨµÀÔÚ
Slack Öд´½¨ÐÂͨµÀ£¬²¢ÇÒ°Ñ StarterBot ÑûÇë½øÀ´£¬»òÕß°Ñ StarterBot ÑûÇë½øÒ»¸öÒѾ´æÔÚµÄͨµÀÖС£

ÔÚ Slack ½çÃæ´´½¨Ò»¸öÐÂͨµÀ²¢ÇÒÑûÇë StarterBotÏÖÔÚÔÚÄãµÄͨµÀÖиø
StarterBot ·¢ÃüÁî¡£

ÔÚÄãµÄ Slack ͨµÀÀï¸øÄãµÄ StarterBot ·¢ÃüÁîÈç¹ûÄã´ÓÁÄÌì»úÆ÷È˵õ½µÄÏìÓ¦ÖÐÓö¼ûÎÊÌ⣬Äã¿ÉÄÜÐèÒª×öÒ»¸öÐ޸ġ£ÕýÈçÉÏÃæËùдµÄÕâ¸ö½Ì³Ì£¬ÆäÖÐÒ»ÐÐAT_BOT
= "<@" + BOT_ID + ">:"£¬ÔÚ¡°@starter¡±(Äã¸øÄã×Ô¼ºµÄÁÄÌì»úÆ÷ÈËÆðµÄÃû×Ö)ºóÐèÒªÒ»¸öðºÅ¡£´Ó
AT_BOT ×Ö·û´®ºóÃæÒÆ³ý:¡£Slack ËÆºõÐèÒªÔÚ@ Ò»¸öÈËÃûºó¼ÓÒ»¸öðºÅ£¬µ«ÕâºÃÏñÊÇÓÐЩ²»Ðµ÷µÄ¡£
½áÊø
ºÃ°É£¬ÄãÏÖÔÚÒѾ»ñµÃÒ»¸ö¼òÒ×µÄÁÄÌì»úÆ÷ÈË£¬Äã¿ÉÒÔÔÚ´úÂëÖÐºÜ¶àµØ·½¼ÓÈëÄãÏëÒª´´½¨µÄÈκÎÌØÐÔ¡£
ÎÒÃÇÄܹ»Ê¹Óà Slack RTM API ºÍ Python Íê³ÉºÜ¶à¹¦ÄÜ¡£¿´¿´Í¨¹ýÕâЩÎÄÕÂÄ㻹¿ÉÒÔѧϰµ½Ê²Ã´£º
¸½¼ÓÒ»¸ö³Ö¾ÃµÄ¹ØÏµÊý¾Ý¿â »òÕß NoSQL ºó¶Ë ±ÈÈç PostgreSQL¡¢MySQL
»òÕß SQLite £¬À´±£´æºÍ¼ìË÷Óû§Êý¾Ý
Ìí¼ÓÁíÍâÒ»¸öÓëÁÄÌì»úÆ÷ÈË»¥¶¯µÄͨµÀ£¬±ÈÈç ¶ÌÐÅ »òÕߵ绰ºô½Ð
¼¯³ÉÆäËüµÄ web API£¬±ÈÈç GitHub¡¢Twilio »òÕß
api.ai
|