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

sxkk20082年前知识分享237

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,因此不能实现在钉钉中回复消息的功能。

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

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

相关文章

文字识别插件人工智能技术:提升效率、深挖数据潜能

文字识别插件人工智能技术:提升效率、深挖数据潜能

  文字识别(OCR)插件是一种基于机器学习和人工智能的技术,可将文档、图片中的文字提取出来,实现自动识别和转换。在如今信息爆炸的时代,文字识别插件的应用范围日益广泛,包括但...

语音合成技术:改变人机交互方式的创新

语音合成技术:改变人机交互方式的创新

  语音合成技术是一项用来将文本转化为声音的创新技术。随着科技的不断发展,语音合成技术正被广泛应用于各个领域,改变着人机交互的方式。本文将探讨语音合成技术的应用和前景,并对其...

如果你会 TailwindCSS 我推荐 VSCODE 安装 这个插件tailwind-snippets 可以快速帮我们来发出一个常用的代码片段,大家可以在 https://www.tailwindsnippets.ml/snippets 查看效果,快速实现我们的 html 页面

tailwind-snippets 预览

部署

Vercel

Next.js 开发商 Vercel 获得最近 1.5 亿美元 D 轮融资。Vercel 注册什么的我就不讲了,建议使用GitHub 登录, 点击new project创建一个项目,这个项目可以从自己的 GitHub 库导入或者选择 Vercel 给的模板,Vercel 给的模板(下图)首先也会导入进自己的 GitHub 库,总之要先把内容导入进 GitHub 库才行。

Vercel 支持的框架

Vercel 为个人用户提供了

  1. 自动 HTTPS/SSL
  2. 带宽 100 GB
  3. 并发构建,每天 10 万次调用
  4. Serverless Function

所以 Vercel 不光支持静态网站也支持 nodejs 动态网站,如果想要其他后端语言

可以选择 heroku

heroku

Heroku 是一个支持多种编程语言的云平台,并且提供了 Heroku PostgresHeroku RedisApache Kafka on Heroku

Heroku 支持的语言

Heroku 虽然提供了比较全面的编程语言和数据库支持,免费用户还支持

  1. 使用 Git 和 Docker 部署
  2. 自定义二级域名
  3. 容器编排
  4. 自动操作系统补丁

但 heroku 对国内用户支持不是很友好,第一点访问国内速度比不上 Vercel, 第二点 163 和 QQ 邮箱都不能注册,想要注册得要其他邮箱, 第三没有免费的 ssl。第四项目源代码只能有 500M。

数据库选择

MongoDB

选择 https://cloud.mongodb.com/

mongodb 首页截图

创建 database 的时候选择 free;

选择免费截图 地域可以选择日本或者新加坡。

接着创建一个用户 创建一个用户 密码是自动生成的,要把密码拷贝下来

接着要创建一个允许链接的 IP 地址

在 mongodb.com 设置允许链接的IP

如何白嫖一个动态网站

前言我们知道,想要搭建一个网站往往需要一下几个步骤:域名注册服务器购买数据库购买或部署网站设计网站开发网站备案网站上线在国内上线一个网站,域名还必须得备案,光是域名备案的话还的几个星期,整个流程下来,...

AI绘画与PS绘画:探究两种绘画方式的差异

AI绘画与PS绘画:探究两种绘画方式的差异

  随着人工智能技术的快速发展,越来越多的创意设计工作开始用AI(人工智能)绘画代替PS(Photoshop)绘画。虽然两种方式都可以创建美丽的数字画作,但它们之间还是存在很...

AI技术控:如何应对人工智能的挑战及未来发展趋势

AI技术控:如何应对人工智能的挑战及未来发展趋势

  人工智能(AI)技术近年来快速发展,对各行各业产生了重大影响。然而,随着AI技术的迅猛发展,人们对其未来的发展趋势、产业革命的规模及对劳动力市场的影响仍存在很多疑虑和担忧...

探索人工智能的定义-发展及应用前景

探索人工智能的定义-发展及应用前景

  一、AI的定义  AI这一概念最早可以追溯到1956年,当时人们对AI的理解主要是指,通过模拟人类的思维和行为,使得计算机具有人类智能的能力。随着计算机硬件的迅猛发展以及...

发表评论    

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