|

±¾ÏîÄ¿ÊÇרÃÅΪSlackÁÄÌì»úÆ÷È˶¨ÖƵÄÄ£°å·þÎñÆ÷¡£
ÍêÕûµÄÔ´´úÂëÏÂÔØÔÚGithub https://github.com/PerfectServers/SlackBot
ÔÚ±¾ÏîĿģ°åÖУ¬Ò»¸öÁÄÌì»úÆ÷ÈË¿ÉÒÔ¼ÓÈëÊÚȨƵµÀ£¬¶ÁȡƵµÀÄÚËùÓÐÓû§·¢Ë͵ġ°ÇúÆæ¡±²¢¼Ç¼ÔÚ°¸£¬¶øÇÒ¿ÉÒÔÖ±½Ó´ð¸´Óû§µÄÓйØÇúÆæ±ý¸ÉµÄÎÊÌâ¡£
Ô¤±¸ÖªÊ¶
ÔÚÄú¾ö¶¨±àÒë¡¢²âÊÔ»òÕß²¿ÊðÄú×Ô¼ºµÄ»ùÓÚPerfectÈí¼þ¿ò¼ÜÌåϵµÄÁÄÌì»úÆ÷ÈË֮ǰ£¬ÒÔÏ»ù´¡ÖªÊ¶²»¿É»òȱ£º
Perfect »ù´¡
Slack API ÔÚÏߺ¯Êý½Ó¿Ú²Î¿¼
Ìáǰ׼±¸ºÃ¾ßÓÐÓÐЧÓòÃû£¨FQDN£©²¢ÓÉÈÏÖ¤»ú¹¹°ä·¢Ö¤ÊéµÄ·þÎñÆ÷
Perfect Èí¼þÖúÊÖ ¿ÉÒÔÓÃÀ´±àÒëºÍ²âÊÔ¡£ÕâÊÇ¿ÉÑ¡µÄ£¬µ«ÊÇÈç¹ûÄúûÓа²×°ÖúÊÖ£¬Ôò½¨ÒéÄú×ÔÐÐÔÚ±¾µØ¼ÆËã»úÉÏ×¼±¸Ò»¸öUbuntu
16.04 LTS ÐéÄâ·þÎñÆ÷»òÕßDocker¾µÏñ²¢×ÔÐа²×°ºÃSwift 3.0ÒÔÉϰ汾¡£
¿ìËÙÉÏÊÖ
µÚÒ»²½£º¸´ÖƱ¾ÏîÄ¿
ÇëʹÓÃÏÂÁÐÃüÁî¸´ÖÆ±¾ÏîÄ¿£º
$ git clone https://github.com/PerfectServers/SlackBot.git |
±¾¹¤³Ì¸ùĿ¼֮ÏÂÓÐÒ»¸ö config.json.sample Îļþ£¬ËùÓÐÄÚÈݶ¼ÊDZØÐëÌîдµÄÅäÖÃÏ
{ "token": "xoxb-ÄúµÄSlackÓ¦ÓóÌÐòͨÐÐÖ¤-TOKENXXXXXXXXXXXXXXXXX", "bot" : "ÁÄÌì»úÆ÷ÈËÃû³Æ", "bot_id": "ÁÄÌì»úÆ÷È˱àºÅ", "client_id": "XXXXXXXX.YYYYYYYYYYÄúµÄÓ¦ÓóÌÐò±àºÅ", "client_secret": "Ó¦ÓóÌÐòÃÜÂë", "verify_token": "·´ÏòÑé֤ͨÐÐÖ¤£¬¼´SlackÔÚ·ÃÎÊÄúµÄ·þÎñÆ÷ÊÇÑé֤һϾ¿¾¹ÊDz»ÊÇSlack·¢À´µÄÇëÇó", "oauth_uri": "/v1/oauth½Ó¿Úº¯ÊýµØÖ·", "message_uri": "/v1/msg½Ó¿Úº¯ÊýµØÖ·", "confirm_uri": "/v1/confirm½Ó¿Úº¯ÊýµØÖ·", "serverName": "yourhost.yourcompany.domainÄúµÄ·þÎñÆ÷ÍêÕûÓòÃû", "cerPath": "/opt/certificates/yourcertificate.crtÄúµÄ×Ôǩ֤ÊéºÍµÚÈý·½ÈÏÖ¤Ö¤ÊéµÄºÏ²¢Îļþ", "keyPath": "/opt/certificates/yourcertificate.keyÄúµÄÖ¤Êé˽ÓÐÔ¿³×Îļþ", "dbPath": "/var/opt/yoursqlite.dbÊý¾Ý¿âÎļþ", "runAs": "yourUserNameÄúµÄ·þÎñÆ÷ÆÕͨÓû§Ãû", "port": 443, "channels": { "channel1_id": "channel1_nameÐèÒª¼àÌýµÄƵµÀ", "channel2_id": "channel2_nameÐèÒª¼àÌýµÄƵµÀ" } } |
ÉÏÊöÎļþµÄËùÓÐÏêϸ±àд˵Ã÷Çë²Î¿¼±¾ÎĺóÐøÄÚÈÝ¡£
µÚ¶þ²½£ºµ½ÄúµÄSlackÍŶÓÉÏ×ÔÐÐ×¢²áÒ»¸öÓ¦ÓóÌÐò
ÔÚÄúµÄ Slack API ÍøÒ³ÉÏ£¬Ñ¡Ôñ ¡°Your Apps¡±´´½¨ÐµÄÓ¦ÓóÌÐò
ÁÄÌì»úÆ÷ÈËÓû§£ºÎªÄúµÄ»úÆ÷ÈËÆðÃû×Ö²¢Ó¦Óõ½ÅäÖãº

Ôö¼ÓȨÏÞ¡£ÔÚ±¾°¸ÀýÖУ¬È¨ÏÞÖÁÉÙ°üÀ¨¡±bot user¡±£¨ÁÄÌì»úÆ÷ÈË£©¡¢¡±channels:history¡±£¨¹«¹²ÆµµÀÀúÊ·£©¡¢¡±channels.read¡±£¨¹«¹²ÆµµÀ¿É¶Á£©¡¢¡±channels.write¡±£¨¹«¹²ÆµµÀ¿Éд£©ºÍ
¡°chart:write:bot¡± £¨»úÆ÷ÈË¿ÉÒÔ·¢ËÍÁÄÌìÐÅÏ¢£©¡£

¶©ÔÄʼþ£º±¾°¸ÀýÐèÒªÖÁÉÙÒÔÏÂʼþÔÚSlackÓ¦ÓóÌÐò¿ØÖÆÌ¨ÖнøÐж©ÔIJÙ×÷£º(1) message.channels£¨¼àÌýƵµÀÏûÏ¢£©;
(2) message.im£¨ÊµÏÖ¼´Ê±Í¨ÐÅ£©; (3) reaction_added£¨Ôö¼Ó±íÇ飩; (4)
reaction_removed£¨É¾³ý±íÇ飩¡£

ͨ¹ýÉèÖÃÇëÇóURL¼¤»îÉÏÊöʼþ¶©ÔÄ¡£±ÈÈçÄúµÄÁÄÌì»úÆ÷ÈËËùÔÚÖ÷»úÓòÃûΪmyhost.com£¬¶øÇÒ½Ó¿Ú³ÌÐòÈë¿Úµã
message_uri ÅäÖÃΪ /v1/msg£¬ÄÇôÇ뽫¸ÃurlÉèÖÃΪhttps://myhost.com/v1/msg¡£??×¢Òâ??ĿǰSlack½öÖ§³ÖHTTPS¼´443¶Ë¿Ú¡£
½«ÄúµÄÓ¦ÓóÌÐò°²×°µ½ÄúµÄÍŶÓÖÐÈ¥¡£

Èç¹ûËùÓй¤×÷Íê³É£¬Ç뽫ÉÏÊöÅäÖÃÐÅÏ¢ÖðÒ»ÊäÈëµ½ÄúµÄconfig.jsonÎļþ£¬ÆäÖÐ tokenÖ¸µÄÊÇ Bot
User OAuth Access Token£¨ÁÄÌì»úÆ÷ÈËÊÚȨ·ÃÎÊͨÐÐÖ¤£©
µÚÈý²½£º»ñÈ¡ÁÄÌì»úÆ÷È˱àºÅ£¨¸ÅÄîÓÐÄѶȣ¬²Ù×÷Ðë½÷É÷£©
Slack ÁÄÌì»úÆ÷ÈËÐèÒªÔÚ±à³ÌʱʹÓÃ×Ô¼ºµÄ±àºÅ£¨²»ÊÇÆÁÄ»ÉÏÏÔʾµÄÃû³Æ£©¡£Òª»ñµÃ¸Ã±àºÅÐèÒªÒ»¶¨¼¼ÇÉ£¬Çë×ÐϸÔĶÁÒÔÏÂ˵Ã÷£º
´ò¿ªä¯ÀÀÆ÷µ¼º½ÖÁ users.list Slack API page

ΪÄúµÄÓ¦ÓóÌÐòÑ¡ÔñÊʺϵÄͨÐÐÖ¤²¢µã»÷ÔÚÏß²âÊÔ Test Method
Èç¹û³É¹¦£¬Ôòµã»÷´ò¿ªÔʼÏìÓ¦Á´½Ó(open raw response)£¬¿ÉÒÔ¿´µ½Ò»¸öJSONÊý¾Ý½á¹¹
ÔÚJSON×Ö·û´®ÖÐËÑË÷ÄúµÄÁÄÌì»úÆ÷ÈËÃû³Æ
½«ÕÒµ½µÄÁÄÌì»úÆ÷È˱àºÅ¿½±´µ½Ç°ÎÄÅäÖÃÖÐ

µÚËIJ½£ºÑ¡Ôñ´ý¼à¿ØÆµµÀ£¨¸ÅÄîÓÐÄѶȣ¬²Ù×÷Ðë½÷É÷£©
¸Ã²Ù×÷ʱ¿ÉÑ¡Ïµ«ÊdzöÓÚ°²È«½Ç¶ÈÀ´Ëµ£¬»¹ÊÇÍÆ¼öÍê³ÉµÄ¡£
ËäÈ»ÏàÐÅÐí¶àÁÄÌì»úÆ÷ÈË¿ª·¢É̶¼Ï£ÍûÆä»úÆ÷È˲úÆ·Äܹ»¼ÓÈëµÄƵµÀ»òÕß˽ÁÄȺԽ¶àÔ½ºÃ£¬µ«ÊÇÄú¿ÉÄÜÏ£Íû½«ÁÄÌì»úÆ÷ÈËÏØÖÎÔÚij¼¸¸öÌØ¶¨µÄƵµÀ»òÕßȺÁÄÖС£
ΪÁËʵÏÖÕâ¸öÄ¿±ê£¬Çë²ÉÓÃÏÂÁвÙ×÷£º
´ò¿ªä¯ÀÀÆ÷²¢µ¼º½ÖÁ channels.list Slack API page
Ñ¡ÔñÍŶӿª·¢Í¨ÐÐÖ¤²¢µã»÷²âÊÔ·½·¨ Test Method

Èç¹û²éѯ³É¹¦£¬Çëµã»÷ÔʼÏìÓ¦Êý¾Ý (open raw response) ²é¿´·µ»ØµÄJSONÊý¾Ý¡£
Ñ¡ÔñÐèÒª¼à¿ØµÄƵµÀ²¢¼Ç¼´ý¼à¿ØÆµµÀµÄÃû³ÆºÍ´úÂ루id / name£©£¬²¢½«ÆäÌîдµ½ÄúµÄconfig.json
ÎļþÖС£
×¢Òâ Èç¹ûÄúÏ£ÍûÄúµÄÁÄÌì»úÆ÷ÈËÄܹ»·ÃÎÊËùÓÐÆµµÀ£¬ÔòÖ±½Ó½«ÏÂÁдúÂëÕ³Ìùµ½ÄúµÄÔ´³ÌÐòÄÚ¼´¿É£º
Curl("https://slack.com/api/channels.list?token=\(token)") { ret in do { guard let b = ret, let info = try b.jsonDecode() as? [String:Any], let ok = info["ok"] as? Bool, let channels = info["channels"] as? [Any] else { Print("channel parse::ok(fault)") return nil }//end guard guard ok, channels.count > 0 else { Print("channel parse::ok(\(ok))") return nil }//end channels.forEach { channel in let ch = channel as? [String: Any] ?? [:] guard let id = ch["id"] as? String, let name = ch["name"] as? String else { return }//end guard
// CAUTION: Append all channels into the cache
global.channels[id] = name
}//next
}catch(let err) {
Print("parseChannels::\(err)")
return nil
}// end do
}//end curl |
µÚÎå²½£º±àÒëºÍ²¿ÊðÁÄÌì»úÆ÷ÈË·þÎñÆ÷
ÔÚ´ËÍÆ¼öʹÓà Perfect Assistant Èí¼þÖúÊÖÍê³ÉËùÓбàÒëºÍ²¿ÊðµÄ×Ô¶¯»¯²Ù×÷¡£
µ«ÊÇ£¬Èç¹ûÄúʹÓõIJ»ÊÇÑÇÂíÑ·AWSµ¯ÐÔ¼ÆËãEC2»òÕ߹ȸèÔÆ£¬ÄÇôÄúÐèÒªÏêϸÁ˽âÕû¸ö°²×°²¿ÊðµÄÏêϸ²½Öè¡£¹¤³Ì¸ùĿ¼ÏÂÓÐÒ»¸ö°²×°½Å±¾¿É¹©²Î¿¼install.sh.sample£º
(1) ÔÚÄú±¾µØµÄ Ubuntu 16.04£¬±ÈÈçÐéÄâ»ú»òÕßDockerÉÏ£¬±àÒë·þÎñÆ÷£¬ÃüÁîÐÐΪ$ swift
build -c release ±àÒëΪÕýʽ·¢Ðа汾
(2) ÓÃscpÃüÁ¶þ½øÖÆ¿ÉÖ´Ðеķ¢ÐÐÎļþÉÏ´«µ½·þÎñÆ÷£¨¿ÉÒÔºÍSwiftÔËÐк¯Êý¿âÒ»Æð´ò°üÉÏ´«£©
(3) ½«ÅäÖÃºÃµÄ config.service ºÍ config.json ÎļþÉÏ´«µ½·þÎñÆ÷¡£ÆäÖÐ config.serviceÄ£°åÎļþ¿É²Î¿¼±¾¹¤³Ì¸ùĿ¼Ïµķ¶Àý¡£
(4) ½«ÄúËùÓеÄÖ¤ÊéÎļþ·ÅÖõ½·þÎñÆ÷°²È«¡¢ºÏÀíµÄ·¾¶Ï£¬²¢ÎªÔËÐÐÌṩ×ã¹»µ«°²È«µÄȨÏÞ¡£
(5) ÔÚ·þÎñÆ÷ÉÏÐÞ¸Äconfig.jsonÎļþ²¢±£Ö¤ÆäÖÐËùÓеıäÁ¿£¬Ìرðʱ¸÷¸ö·¾¶£¬±ÈÈçÖ¤Êé·¾¶ºÍÊý¾Ý¿â¶¼ÍêÈ«·ûºÏʵ¼Ê²¿Êð¡£
(6) ͬÑùÈçÓбØÒª£¬ÔÚ·þÎñÆ÷ÉÏÒ²ÐÞ¸Ä config.serviceÒÔÆ¥ÅäËùÓз¾¶¡£
(7) ʹÓÃÃüÁî $ sudo systemctl enable config.service ½«ÄúµÄÐÂÓ¦ÓóÌÐò×¢²áΪLinuxϵͳ·þÎñ£¬ÕâÑù·þÎñÆ÷ÔÚÖØÆôºó¾ÍÄÜ×Ô¶¯ÒÔ¹ÜÀíÔ±·½Ê½Æô¶¯¡£
(8) Æô¶¯·þÎñÆ÷£¬Äú¿ÉÒÔÑ¡ÔñÖØÆôÕû¸ö·þÎñÆ÷£¬»òÕßÔËÐÐ $ sudo
systemctl restart slackbotÃüÁîÐе¥¶ÀÆô¶¯Ä¿±ê·þÎñ³ÌÐò£¨¼ÙÉè±àÒëºóµÄ·þÎñÃüÁîÐÐΪ
slackbot£©
Èç¹ûûÓÐPerfectÈí¼þÖúÊÖ£¬ÔòÉÏÊöËùÓв½ÖèÒ»ÑùÊÇÓÐһЩÄѶȵģ¬Òò´Ë²Ù×÷ʱÐèÒªÌØ±ðСÐÄ¡£Çë×ÐϸÔĶÁÏÂÁÐÑù±¾Îļþ·¶Àý£º
Config.service ·þÎñ×¢²áÎļþ²Î¿¼·¶Àý
[Unit] Description=ÄúµÄÁÄÌì»úÆ÷ÈË
[Service]
Type=simple
WorkingDirectory=/var/opt
ExecStart=/path/to/yourApp/PerfectTemplate
Restart=always
PIDFile=/var/run/yourSlackBotApp.pid
Environment="LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/local/lib/swift"
[Install]
WantedBy=multi-user.target |
°²×°½Å±¾·¶Àý
# °²×°²¿Êð½Å±¾·¶Àý # ¼ÙÉèÄúµÄ·þÎñÆ÷Ó¦ÓóÌÐòÃûΪ`slackbot` # Çë±£Ö¤ÄúµÄ·þÎñÆ÷ÉÏÒѾÌáǰ°²×°ÁËSwiftÔËÐл·¾³£¬±ÈÈç # LD_LIBRARY_PATH="/usr/lib/yourSwiftInstalationPath" # ±äÁ¿¶¨ÒåÈçÏ£º RPO=slackbot TGZ=/tmp/$RPO.tgz SVC=$RPO.service CFG=$RPO.json APP=/tmp/app.tgz SERVER=yoursshLoginUserName@yourhost.yourdomain LOCALVM=your.local.ubuntu.virtual.machine
# Ê×ÏȰÑÔ´´úÂë´ò°ü²¢´«Êäµ½ÐéÄâ»úÉÏ
tar czvf $TGZ Package.swift Sources
scp $TGZ $LOCALVM:/tmp
# ͨ¹ýÐéÄâ»ú½øÐбàÒë
ssh $LOCALVM "cd /tmp;rm -rf $RPO;mkdir $RPO;
cd $RPO; tar xzvf $TGZ;swift build -c release;cd
.build/release;tar czvf $APP PerfectTemplate *.so"
# È»ºóÔÙ´ÓÐéÄâ»úÉÏÈ¡»Ø±àÒëºÃµÄ¶þ½øÖÆÎļþ²¢ÉÏ´«ÖÁÉú²ú·þÎñÆ÷
scp $LOCALVM:$APP $APP
scp $APP $SERVER:$APP
scp $SVC $SERVER:/tmp/$SVC
scp $CFG $SERVER:/tmp/$CFG
# ÔÚÉú²ú·þÎñÆ÷ÉÏÖ´Ðа²×°²¢½«Ð±àÓ¦ÓóÌÐò×¢²áΪLinux²Ù×÷ϵͳ·þÎñ
ssh $SERVER "cd /opt;sudo -S rm -rf $RPO;sudo
-S mkdir $RPO;cd $RPO;sudo -S tar xzvf $APP;sudo
-S cp /tmp/$SVC .;sudo -S cp /tmp/$CFG .;sudo
-S systemctl disable $RPO;sudo -S systemctl enable
/opt/$RPO/$SVC;sudo -S systemctl start $RPO;sudo
-S systemctl status $RPO" |
µÚÁù²½£º·µ»Øµ½SlackÓ¦ÓóÌÐò¿ØÖÆÌ¨
Ò»µ©ÖØÆô·þÎñÆ÷ºó£¬Çë»Øµ½SlackÓ¦ÓóÌÐòµÄ¿ØÖÆÌ¨ÍøÒ³È·ÈÏÉÏÊö·þÎñÆ÷²¢¼¤»îËùÓй¦ÄÜ£¬ÌرðʱOAuthÅäÖÃÈÏÖ¤Ò³Ãæ£º
Ñé֤ʼþ¶©ÔÄÇëÇó½Ó¿ÚRequest URL

ÏÖÔÚ´ò¿ªSlackÓ¦Ó㬽øÈëÄúµÄÄ¿±êƵµÀ£¬²¢½«»úÆ÷ÈËÑûÇ뵽ƵµÀ¡£×¢Ò⣺ѡÔñÔö¼ÓÒ»¸ö²âÊÔÆµµÀרÃÅÓÃÓÚµ÷ÊÔÁÄÌì»úÆ÷ÈËÊÇÒ»¸öºÃÖ÷Òâ
²âÊÔÁÄÌì»úÆ÷ÈË£¬¿ÉÒÔÖ±½Ó¶ÔËü·¢Æð»á»°ÁÄÌì |