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×tamp=%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
}