当前位置: 首页 > article >正文

go语言 爬虫 钉钉群机器人

第一步:钉钉新建一个群机器人
钉钉创建群机器人文档:https://open.dingtalk.com/document/orgapp/custom-robot-access
安全设置选择签名
签名设置文档:https://open.dingtalk.com/document/robots/customize-robot-security-settings

第二步 代码:
参考了两个
爬虫部分:http://liuqh.icu/2021/07/15/go/package/26-colly/
钉钉群机器人发消息部分:https://www.cnblogs.com/xll970105/p/13176253.html

例子代码:

package main

import (
	"bytes"
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
	"time"

	"github.com/gocolly/colly/v2"
)

func main() {
	DouBanBook()
}

// 豆瓣书榜单
func DouBanBook() error {

	// 获取钉钉群消息机器人url
	url := Sign()

	// 创建 Collector 对象
	collector := colly.NewCollector()
	// 在请求之前调用
	collector.OnRequest(func(request *colly.Request) {
		fmt.Println("回调函数OnRequest: 在请求之前调用")
	})
	// 请求期间发生错误,则调用
	collector.OnError(func(response *colly.Response, err error) {
		fmt.Println("回调函数OnError: 请求错误", err)
	})
	// 收到响应后调用
	collector.OnResponse(func(response *colly.Response) {
		fmt.Println("回调函数OnResponse: 收到响应后调用")
	})
	//OnResponse如果收到的内容是HTML ,则在之后调用
	collector.OnHTML("ul[class='subject-list']", func(element *colly.HTMLElement) {
		// 遍历li
		element.ForEach("li", func(i int, el *colly.HTMLElement) {
			// 获取封面图片
			coverImg := el.ChildAttr("div[class='pic'] > a[class='nbg'] > img", "src")
			// 获取书名
			bookName := el.ChildText("div[class='info'] > h2")
			// 获取发版信息,并从中解析出作者名称
			authorInfo := el.ChildText("div[class='info'] > div[class='pub']")
			split := strings.Split(authorInfo, "/")
			author := split[0]
			fmt.Printf("封面: %v 书名:%v 作者:%v\n", coverImg, trimSpace(bookName), author)

			ddtext := fmt.Sprintf("![%s](%s)<br/> 书名:%s,  作者:%s <br/>", trimSpace(bookName), coverImg, trimSpace(bookName), author)
			fmt.Println(ddtext)

			// 发送消息
			dingToInfo(bookName, ddtext, url)
		})
	})
	// 发起请求
	return collector.Visit("https://book.douban.com/tag/小说")
}

// 删除字符串中的空格信息
func trimSpace(str string) string {
	// 替换所有的空格
	str = strings.ReplaceAll(str, " ", "")
	// 替换所有的换行
	return strings.ReplaceAll(str, "\n", "")
}

// 签名生成算法
func hmacSha256(stringToSign string, secret string) string {
	h := hmac.New(sha256.New, []byte(secret))
	h.Write([]byte(stringToSign))
	return base64.StdEncoding.EncodeToString(h.Sum(nil))
}

// Sign 加密生成钉钉签名
func Sign() string {
	secret := "钉钉群机器人secret"
	webhook := "钉钉群机器人webhook"
	timestamp := time.Now().UnixNano() / 1e6
	stringToSign := fmt.Sprintf("%d\n%s", timestamp, secret)
	sign := hmacSha256(stringToSign, secret)
	url := fmt.Sprintf("%s&timestamp=%d&sign=%s", webhook, timestamp, sign)
	return url
}

// 钉钉初始化
func dingToInfo(t, s, url string) bool {
	content, data := make(map[string]string), make(map[string]interface{})
	content["title"] = t
	content["text"] = s
	data["msgtype"] = "markdown"
	data["markdown"] = content
	b, _ := json.Marshal(data)

	resp, err := http.Post(url,
		"application/json",
		bytes.NewBuffer(b))
	if err != nil {
		fmt.Println(err)
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
	return true
}


http://www.kler.cn/a/446977.html

相关文章:

  • 常用的JVM启动参数有哪些?
  • 防火墙技术与网络安全
  • 谷歌建筑下载
  • 猫头虎分享:读孙凝晖院士《人工智能与智能计算的发展》有感
  • 多协议视频监控汇聚/视频安防系统Liveweb搭建智慧园区视频管理平台
  • Hive解决数据倾斜
  • 玩游戏没有flash插件的解决方案(No Flash)
  • 【RAII | 设计模式】C++智能指针,内存管理与设计模式
  • 音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现
  • python学习笔记—9—复习
  • 详细介绍如何使用rapidjson读取json文件
  • 《向量数据库指南》——RAG破局,大模型新纪元!
  • EasyGBS国标GB28181平台P2P远程访问故障排查指南:客户端角度的排查思路
  • 半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列
  • MyBatis写法汇总
  • 写给Pythoner的前端进阶指南(六):网络编程
  • 华为OD --- 敏感字段加密
  • C++ 面向对象编程:友元、
  • JMeter HTTP Cookie管理器(HTTP Cookie Manager)
  • D100【python 接口自动化学习】- pytest进阶之fixture用法
  • Java开发经验——数据库开发经验
  • clickhouse优化记录
  • 华为DHCP高级配置学习笔记
  • 数据结构_赫夫曼树(基于例题)
  • 【杂谈】虚拟机与EasyConnect运行巧设:Reqable助力指定应用流量专属化
  • 软件需求分析常见误区(三),瀑布模型中需求分析遇到的问题