
現(xiàn)在很多企業(yè)在使用企業(yè)微信或釘釘進(jìn)行工作交流,我們可以在群里添加一個(gè)自定義群機(jī)器人,定時(shí)發(fā)送一些提醒或咨詢信息,它可以作為一個(gè)小組手,也為工作增加一點(diǎn)樂趣。
群機(jī)器人
下面是企業(yè)微信和釘釘?shù)娜簷C(jī)器人文檔:
它們的功能和用法基本是一致的,本文將以企業(yè)微信為例進(jìn)行講解。
我們?cè)谌豪锾砑右粋€(gè)機(jī)器人后,可以獲取到這個(gè)機(jī)器人的 Webhook:

通過向這個(gè)地址發(fā)起 POST 請(qǐng)求,就可以實(shí)現(xiàn)機(jī)器人在群里發(fā)送消息。
群機(jī)器人是要在群里才能添加的,但這里有個(gè)小技巧,我們可以先拉一個(gè)群然后把別人都踢掉,這樣就變成自己一個(gè)人的群了。這樣方便我們測(cè)試,也可以創(chuàng)建一個(gè)私人的小組手。
Hello World
萬物源于 Hello World,群機(jī)器人也不例外。其實(shí)就是發(fā)起一個(gè) POST 請(qǐng)求而已,用什么開發(fā)語(yǔ)言看個(gè)人愛好了。
我這里以 node.js 為例,添加了請(qǐng)求庫(kù) axios 的依賴,代碼如下:
const axios = require('axios')
axios.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx', {
"msgtype": "text",
"text": {
"content": "Hello World"
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.log(error)
})
不出意外的話,運(yùn)行這段代碼,就能在群里看到機(jī)器人發(fā)的消息了:

知乎日?qǐng)?bào)
確定可以發(fā)送成功之后,我們就可以開發(fā)更多的玩法了。比如通過調(diào)用一些開放接口,獲取到數(shù)據(jù)后轉(zhuǎn)發(fā)到群里。
這里以知乎日?qǐng)?bào)為例,代碼如下:
const axios = require('axios')
postZhiHu()
function postZhiHu() {
axios.get('https://news-at.zhihu.com/api/4/news/latest')
.then(response => {
var stories = response.data.stories
postMessage(stories)
})
.catch(error => {
console.log(error);
})
}
function postMessage(stories) {
var articles = []
stories.forEach(story => {
articles.push({
"title": story.title,
"url": story.url,
"picurl": story.images[0]
})
})
axios.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx', {
"msgtype": "news",
"news": {
"articles": articles
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.log(error);
})
}
運(yùn)行上面代碼,就能收到機(jī)器人發(fā)的知乎日?qǐng)?bào)了:

機(jī)器人可以發(fā)多種樣式的消息,這里的知乎日?qǐng)?bào)是圖文類型的,具體有哪些類型大家可以看官方文檔。
定時(shí)任務(wù)
我們自然是希望機(jī)器人可以自動(dòng)發(fā)消息的,這時(shí)候就要用到定時(shí)任務(wù)了。
在 node.js 上可以用 schedule 實(shí)現(xiàn)定時(shí)任務(wù):
const schedule = require('node-schedule')
schedule.scheduleJob({hour: 9, minute: 30}, function(){
postZhiHu()
})
上面代碼可以讓機(jī)器人在每天上午九點(diǎn)半的時(shí)候,發(fā)送一條知乎日?qǐng)?bào)的消息。
但為了保證每天都能收到消息,就需要計(jì)算機(jī)一直運(yùn)行這個(gè)定時(shí)任務(wù),關(guān)機(jī)或待機(jī)的時(shí)候就收不到消息了。你可以把任務(wù)運(yùn)行在服務(wù)器上,或者是用下面教大家的方法。
云函數(shù)
騰訊云提供的云函數(shù)服務(wù),可以讓我們?cè)谥付l件下運(yùn)行代碼,特別適合我們的群機(jī)器人使用,提供的免費(fèi)額度對(duì)群機(jī)器人來說是綽綽有余的。云函數(shù)的具體使用方法,大家可以看官方文檔:
下面給大家簡(jiǎn)單講一下用云函數(shù)實(shí)現(xiàn)群機(jī)器人。
依賴配置
我們依舊使用 node.js 作為運(yùn)行環(huán)境。我們可以使用模板創(chuàng)建云函數(shù),但如果是添加了第三方依賴,在新建云函數(shù)時(shí)需要把 node_modules 文件夾一起打包上傳。
在新建云函數(shù)的時(shí)候,提交方法選擇「本地上傳zip包」:

然后把 index.js 文件和 node_modules 文件夾打包成 zip 上傳:

這樣就能愉快的在云函數(shù)里使用第三方依賴了。
函數(shù)代碼
main_handler 是云函數(shù)的執(zhí)行入口,我們對(duì)上面知乎日?qǐng)?bào)的代碼做一點(diǎn)小小的改造,把下面代碼添加到云函數(shù)的 index.js 中:
const axios = require('axios')
exports.main_handler = (event, context, callback) => {
axios.get('https://news-at.zhihu.com/api/4/news/latest')
.then(response => {
stories = response.data.stories
postMessage(stories)
})
.catch(error => {
console.log(error);
})
}
function postMessage(stories) {
var articles = []
stories.forEach(story => {
articles.push({
"title": story.title,
"url": story.url,
"picurl": story.images[0]
})
})
axios.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx', {
"msgtype": "news",
"news": {
"articles": articles
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.log(error);
})
}
點(diǎn)擊下面的保存后,再點(diǎn)擊測(cè)試,就能看機(jī)器人的知乎日?qǐng)?bào)消息了,跟在本地執(zhí)行是一樣的效果。
觸發(fā)方式
在云函數(shù)里添加觸發(fā)方式,可以讓云函數(shù)在指定條件下自動(dòng)執(zhí)行。
我們添加一個(gè)觸發(fā)方式,使用定時(shí)觸發(fā)。比如我想在周一到周五每天的上午九點(diǎn)半發(fā)送消息,就可以這樣設(shè)置:

關(guān)于 Cron 表達(dá)式,具體用法大家可以參考文檔:
更多玩法?
到這里,我們基本就可以玩轉(zhuǎn)企業(yè)微信和釘釘?shù)娜簷C(jī)器人功能了。除了上面說的知乎日?qǐng)?bào),我們還可以給機(jī)器人添加天氣、新聞、吃飯?zhí)嵝?、?huì)議提醒等消息。
不知道大家還能想到什么有趣的功能,歡迎留言討論。
