- Published on
用云函数开发掘金钉钉机器人
highlight: vs2015
前言
前段时间看了 B 站 UP 主@人工智能小黄鸭的出的视频,可以利用飞书机器人在线刷题,非常牛逼,行云流水。自从我在稀土掘金社区技术更文以来,每天非常关注文章点赞评论消息,而我常使用的是聊天软件是钉钉,所以我在想,是否可以利用云函数对接掘金,实现一个钉钉机器人,把我的掘金消息自动推送给我。
实现功能
- 自动签到和抽奖
- 掘金消息提醒
申请钉钉机器人
新建一个只有你自己的个人群
点击群助手创建一个自定义的 webhook
安全设置选择自定义关键词,输入掘金消息
复制 webhook
地址,等会在云函数中使用。
免费的云开发平台
云函数我推荐 lafyun,laf 是一个开源云开发平台,可以像写博客一样写函数,随手上线,最重要的是官网体验版现在是免费的,laf 目前只支持 Node.js 运行环境,当前大家可以选择其他云开发平台。
云函数自动签到
在 laf 平台注册后,新建云函数输入以下代码
'use strict'
const axios = require('axios')
// 请求签到、抽奖的接口
const checkInApi = 'https://api.juejin.cn/growth_api/v1/check_in'
const drawApi = 'https://api.juejin.cn/growth_api/v1/lottery/draw'
// 钉钉机器人 Webhook
const dingtalk_robot_url =
'https://oapi.dingtalk.com/robot/send?access_token=a5abc0f85c385aabd922dbe9a2d42741a2f8bd8634b8bc543e7193ae7012120b'
// 请求接口的cookie配置
const cookieInfo = '掘金cookie'
// 请求签到接口
const checkIn = async () => {
let { data } = await axios({
url: checkInApi,
method: 'post',
headers: { Cookie: cookieInfo },
})
return data
}
// 请求抽奖接口
const draw = async () => {
let { data } = await axios({
url: drawApi,
method: 'post',
headers: { Cookie: cookieInfo },
})
return data
}
// 签到完成 发送钉钉
const sendDingDing = async (md) => {
const sendMessage = {
msgtype: 'markdown',
markdown: {
title: '掘金消息',
text: md,
},
at: {
atMobiles: [],
atUserIds: [],
isAtAll: false,
},
}
return await axios.post(dingtalk_robot_url, sendMessage)
}
exports.main = async function (ctx: FunctionContext) {
// body, query 为请求参数, auth 是授权对象
const { auth, body, query } = ctx
const checkInData = await checkIn()
if (checkInData.data) {
sendDingDing(
`掘金签到成功!\n 今日获得${checkInData.data.incr_point}矿石,\n 当前总矿石:${checkInData.data.sum_point}。`
)
} else {
sendDingDing(`掘金签到失败,\n ${JSON.stringify(checkInData)}。\n`)
}
const drawData = await draw()
if (drawData.data) {
sendDingDing(`掘金抽奖成功!\n 获得:${drawData.data.lottery_name}`)
} else {
sendDingDing(`掘金抽奖失败,\n ${JSON.stringify(drawData)}`)
}
console.log('🔥', checkInData, drawData)
return 1
}
替换
cookieInfo
为你自己的 cookie替换
dingtalk_robot_url
为你申请的钉钉机器 Webhook在依赖管理中,添加依赖 axios,用于网络请求
- 点击触发器
新建一个定时器触发器,输出时间间隔 60s * 60m * 24h = 86400s
,也就是每天定时一次。
添加完成后,点击发布函数
就可以在订单消息中收到签到成功的消息了。 需要注意的是:每次点击发布函数都会触发一次定时器执行,所以如果你有多个函数要发布,记得先得把定时器关闭了,不然就会消耗 200 矿石进行抽奖。
掘金消息提醒
用同样的原理,我们新建一个云函数用于消息推送
import axios from 'axios'
import cloud from '@/cloud-sdk'
// 钉钉机器人 Webhook
const dingtalk_robot_url =
'https://oapi.dingtalk.com/robot/send?access_token=a5abc0f85c385aabd922dbe9a2d42741a2f8bd8634b8bc543e7193ae7012120b'
// 请求接口的cookie配置
const cookieInfo = '掘金cookie'
const headers = {
'content-type': 'application/json',
cookie: cookieInfo,
}
async function getCount() {
return axios
.get('https://api.juejin.cn/interact_api/v1/message/count?aid=2608&uuid=6899676175061648910', {
headers,
})
.then((res) => res.data)
}
async function getMessage(message_type) {
const data = { message_type, cursor: '0', limit: 20, aid: 2608 }
return axios
.post(
'https://api.juejin.cn/interact_api/v1/message/get_message?aid=2608&uuid=6899676175061648910',
data,
{
headers,
}
)
.then((res) => res.data)
}
async function sendMessage(message_type) {
const res = await getMessage(message_type)
const message = res.data[0]
let text = '默认消息'
switch (message_type) {
case 3:
text = `**[${message.src_info.name}](https://juejin.cn/user/${message.src_info.item_id})** 评论了您的文章 \n\n [${message.parent_info.name}](https://juejin.cn/post/${message.parent_info.item_id}) \n\n ${message.dst_info.detail} \n`
if (message.message.action_type === 31) {
text = `**[${message.src_info.name}](https://juejin.cn/user/${message.src_info.item_id})** 回复了你在文章 \n\n [${message.parent_info.name}](https://juejin.cn/post/${message.parent_info.item_id}) 下的评论:\n\n ${message.dst_info.detail} \n`
}
break
case 1:
text = `**[${message.src_info.name}](https://juejin.cn/user/${message.src_info.item_id})** 赞了你的文章 \n\n [${message.dst_info.name}](https://juejin.cn/post/${message.dst_info.item_id})`
break
case 2:
text = `**[${message.src_info.name}](https://juejin.cn/user/${message.src_info.item_id})** 关注了你`
break
}
const sendMarkdownMessage = {
msgtype: 'markdown',
markdown: {
title: '掘金消息',
text: text,
},
}
await axios.post(dingtalk_robot_url, sendMarkdownMessage)
}
exports.main = async function (ctx: FunctionContext) {
// body, query 为请求参数, auth 是授权对象
const { auth, body, query } = ctx
const count = await getCount()
if (count.data.total > 0) {
if (count.data.count[1] > 0) {
sendMessage(1)
}
if (count.data.count[2] > 0) {
sendMessage(2)
}
if (count.data.count[3] > 0) {
sendMessage(3)
}
}
return 1
}
上面代码我只取了点赞、评论和关注消息,系统消息 message_type = 4
没有通知, 然后再添加定时器,设置定时器为 60s
一次,这样就可以在钉钉收到掘金消息了!
存在问题
比如我想在钉钉中直接回复消息
但是收到消息 body
中没有回复消息的内容。
发送消息的时候钉钉开放接口也没有返回 messageId
,因此不能实现在钉钉中回复消息的功能。
当然如果有小伙伴常用飞书,则可以加上回复消息的功能。
以上就是本文全部内容,如果对你有帮助,可以随手点个赞,这对我真的很重要,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。