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

sxkk20082年前知识分享199

highlight: vs2015

前言

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

实现功能

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

申请钉钉机器人

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

钉钉群助手

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

添加机器人

安全设置选择自定义关键词,输入掘金消息 创建机器人

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

免费的云开发平台

lafyun

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

laf 添加 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 中没有回复消息的内容。

收到消息函数返回 body

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

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

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

相关文章

人工智能人像识别技术:智能社会中的发展与应用

人工智能人像识别技术:智能社会中的发展与应用

  人像识别技术是一项基于人工智能的先进技术,通过对人脸图像的分析和识别,实现对人物身份的确认和特征的提取。在当今智能社会中,人像识别技术得到广泛应用,带来了许多便利和机会。...

AI换脸技术:探索其现状与发展前景

AI换脸技术:探索其现状与发展前景

  随着人工智能技术的不断进步,AI换脸技术逐渐走进了人们的视野。AI换脸是指利用人工智能技术将一张人脸照片上的特定部位(如眉毛、眼睛、嘴唇等)替换成另一张照片中对应部位的图...

AI电话机器人—未来通讯市场新宠

AI电话机器人—未来通讯市场新宠

  随着人工智能技术的发展,AI电话机器人的出现引起了业界的广泛关注。作为一种具有自主学习和不断进化能力的通讯工具,它能够为企业和个人提供更加高效和便捷的通信方案,为未来的通...

智能人体传感器:解密未来科技与人的完美结合

智能人体传感器:解密未来科技与人的完美结合

  随着科技的不断发展,人体传感器作为一种创新技术逐渐走入人们的生活。这种智能传感器能够通过感知人体的生理、行为和环境等信息,为我们提供更多便利和舒适度。  人体传感器是一种...

AI人工智能技术的应用与发展

AI人工智能技术的应用与发展

  从大数据到人工智能,信息技术的发展正在影响人类社会的方方面面。AI人工智能技术,特别是大规模学习、深度学习和神经计算等区域,正在实现自主感知、自适应决策和自我学习的目标,...

将 React 应用迁移至 Vite

将 React 应用迁移至 Vite

前言当下,在项目开发的过程中,对于大多数人来说,会使用 create react app 来创建 react 应用,它开箱即用,零配置,但随着项目中代码量的增加,你的项目构建时间也会随之增加,开发服务...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。