前言

前段时间看了 B 站 UP 主@​​人工智能小黄鸭​​的出的视频,可以利用飞书机器人在线刷题,非常牛逼,行云流水。自从我在稀土掘金社区技术更文以来,每天非常关注文章点赞评论消息,而我常使用的是聊天软件是钉钉,所以我在想,是否可以利用云函数对接掘金,实现一个钉钉机器人,把我的掘金消息自动推送给我。

实现功能

  • 自动签到和抽奖
  • 掘金消息提醒

申请钉钉机器人

新建一个只有你自己的个人群

用云函数开发掘金钉钉机器人_JavaScript

点击群助手创建一个自定义的 ​​webhook​

用云函数开发掘金钉钉机器人_bc_02

安全设置选择自定义关键词,输入掘金消息

用云函数开发掘金钉钉机器人_JavaScript_03

复制 ​​webhook​​ 地址,等会在云函数中使用。

免费的云开发平台

用云函数开发掘金钉钉机器人_Serverless_04

云函数我推荐 ​​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,用于网络请求

用云函数开发掘金钉钉机器人_Serverless_05

  • 点击触发器

新建一个定时器触发器,输出时间间隔 ​​60s * 60m * 24h = 86400s​​,也就是每天定时一次。

用云函数开发掘金钉钉机器人_bc_06

添加完成后,点击​​发布函数​​就可以在订单消息中收到签到成功的消息了。 需要注意的是:每次点击发布函数都会触发一次定时器执行,所以如果你有多个函数要发布,记得先得把定时器关闭了,不然就会消耗 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​​ 一次,这样就可以在钉钉收到掘金消息了!

存在问题

比如我想在​​钉钉中直接回复消息​​

用云函数开发掘金钉钉机器人_2d_07

但是收到消息 ​​body​​ 中没有回复消息的内容。

用云函数开发掘金钉钉机器人_2d_08

发送消息的时候钉钉开放接口也没有返回 ​​messageId​​,因此不能实现在钉钉中回复消息的功能。

当然如果有小伙伴常用飞书,则可以加上回复消息的功能。

以上就是本文全部内容,如果对你有帮助,可以随手点个赞,这对我真的很重要,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。