Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÈçºÎÔËÓÃPython½¨Á¢ÄãµÄµÚÒ»¸öSlackÁÄÌì»úÆ÷ÈË
 
×÷ÕߣºMatt Makai À´Ô´£ºLinuxÖйú ·¢²¼ÓÚ£º 2016-10-28
 

ÁÄÌì»úÆ÷ÈË(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 starterbot

¼¤»î virtualenv£º

source starterbot/bin/activate

ÄãµÄÌáʾ·ûÏÖÔÚÓ¦¸Ã¿´ÆðÀ´Èç½ØÍ¼£º

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

pip install 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 µÄ½Å±¾ÎÒÃǽöÐèÒªÔËÐÐÒ»´Î¡£

python print_bot_id.py

µ±ËüÔËÐÐΪÎÒÃÇÌṩÁËÁÄÌì»úÆ÷È赀 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

 

 

   
´Îä¯ÀÀ       
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì