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

sxkk20082年前知识分享196

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

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

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

相关文章

Vercel 推出数据库存储服务,助力全栈开发

highlight: monokai-sublimeVercel 是一个流行的 React.js、Next.js 等前端应用部署平台,我们可以一键将 Github 上的应用部署上线,但它缺少一个重要部...

2-3 分钟后会在屏幕上输出宝塔面板的登录地址,宝塔面板会随机生成用户名、密码和端口,我们需要把这些地址保存到本地,以免下次忘记。

接下来我们需要在云服务器上设置安全组或者防火墙,放行自动生成的端口。

腾讯云配置安全组

开通了端口,输入宝塔面板地址,输入用户名和密码就可以登录了 宝塔面板登录

域名解析

腾讯云域名解析

在你的域名服务商后台,将一个域名解析到 这台这台服务器 ip,解析完成后,你就可以使用域名访问了。

安装 PHP+mysql

登录后要先绑定一个宝塔账号,这个大家自行注册就可以了 选择系统推荐的 LNMP 环境 绑定成功后,我们来安装 PHP+mysql,系统会自动弹窗框让我们来选择环境,我这里选择 LNMP

  • 急速安装,安装时间极快(5-10 分钟),版本与稳定性略低于编译安装,适合快速部署测试
  • 编译安装,安装时间长(30 分钟到 2 小时),性能最大化,适合生产环境, 点击一键安装后,宝塔面板就会开始安装环境了

LNMP 环境安装进度 等待 10 分钟后,环境安装完成,当然有经验的同学可以自行安装 PHP+mysql 的环境,但是使用宝塔面板对新手比较友好。

访问IP显示会宝塔404页面 此时访问我们的 IP 就可以看到页面,说明我们的环境已经安装成功了。

安装微擎

微擎官网:https://www.we7.cc/

微擎官方文档:https://www.kancloud.cn/donknap/we7/136557

微擎源码地址:https://gitee.com/we7coreteam/pros

微擎是一款小程序和公众号管理系统,可以实现微信平台(mp.weixin.qq.com)不能实现的功能,例如商城,餐饮,酒店,汽车,门店,同城,各类行业解决方案,营销,推广,吸粉,游戏,物联网和人工智能等功能,这些应用大部分收费,也有免费的应用,大家可以在官网上搜索安装。

点击网站,添加网站,输入你自己的要解析的域名, 宝塔面板添加网站

选择创建数据库,和 FTP,点击提交,此时输入我们的域名可以看到如下页面

宝塔默认创建的页面

说明我们的网站创建成功了。

安装微擎框架

在网站 ftp 目录下上传微擎框架的源码 上传微擎框架源码

上传完成后点击 zip 文件解压

设置网站默认站点

点击默认站点,设置我们刚才创建的网站

输入IP,开始安装微擎 输入 IP 地址,就可以进入微擎的安装页面了。 微擎安装页面检查环境

安装过程中会检查 PHP 环境要求,若检查不成功,我们需要修改相应的 PHP info 文件。

微擎配置数据库和密码

点击继续输入刚才创建的数据库信息,并且设置微擎后台密码

微擎安装完成

点击继续安装完成

《成语小秀才》部署教程

前言相信很多朋友都玩过这款小游戏,叫成语秀才,没体验过的朋友可以点击这里,扫码体验,这款小游戏开发起来还是比较困难的,首先要有一份海量的题库,然后在每道题都有不同的布局,我是一个非常喜欢学习的人,于是...

百度OCR识别:革新人工智能识别技术的领先之选

百度OCR识别:革新人工智能识别技术的领先之选

  随着人工智能的快速发展,OCR(Optical Character Recognition)光学字符识别技术也随之得到了广泛应用。在各种场景下,OCR技术的准确率和实...

智能AI人脸识别——打开未来智慧面孔的大门

智能AI人脸识别——打开未来智慧面孔的大门

  人工智能技术在如今的社会中得到了广泛的应用,其中之一便是人脸识别技术。借助这项技术,我们不仅能够确保个人信息和资产的安全,还能够提供更加个性化和便利的服务。针对此需求,许...

百度语音:开启智能交互新时代

百度语音:开启智能交互新时代

  随着人工智能技术的迅速发展,语音识别技术作为智能交互的重要一环,成为各大科技公司竞相布局的关键领域。作为国内领先的互联网科技公司,百度推出的百度语音平台成为了用户智能交互...

红外AI技术-用得越来越普遍

红外AI技术-用得越来越普遍

  红外AI技术在目前的智能化进程中起着越来越重要的作用。红外传感器寻找到人类体表的温度分布,判断人的存在或活动状态,接着机器学习算法进行人体识别,从而实现对人体的监控识别及...

发表评论    

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