背景
因为想监控微博用户的消息,想在他发微博后,快速的在微信同步微博发送的内容。
问题
- 怎么获取最新的发布的微博消息?
- 怎么同步消息到微信?
解决方案
怎么获取最新的发布的微博消息?
首先会想用一些库来爬取微博的内容。但是找了gayhub后发现要用这些库有点复杂,实在不好操作。所以先看下微博的前端结构是怎么样的再做决定。
获取监控地址
- 首先我在浏览器中打开了微博的手机版页面:微博 (weibo.cn) 。注意: 一定是m.weibo.cn 因为手机版页面解析起来不那么麻烦,也不需要登录微博。
- 之后搜索到要监控的微博用户。我这里用中国天气的微博举例
- 浏览器上的链接也就是我们要监控的地址
https://m.weibo.cn/u/1498396803?t=&luicode=10000011&lfid=100103type%3D3%26q%3D%E5%A4%A9%E6%B0%94%26t%3D
其中 m.weibo.cn/u/149839680… 的 1498396803 就是微博用户的id
分析微博消息接口的结构
- 微博tabs接口
在接口中tabsInfo[1]中表示选中到微博标签页
- 微博列表接口
在列表接口中data.cards[2].mblog.text就是微博的文字内容部分
- 图片部分
在data.cards[2].mblog.pics中表示了微博中包含的图片地址
注意: 其中的图片地址url,由于微博有访问限制是不能够直接访问的。浏览器直接访问会返回403 Forbidden。但是没有禁止用http客户端访问,所以我打算将图片下载下来进行转存到我的图床即可。
- 微博的发布时间
在data.cards[2].mblog.created_at表示发布时间
总结:
上面我们获取到了微博的文字和图片以及发布时间。那我们可以定时获取微博的列表接口的第一条,如果第一条的发布时间比我们保存的发布时间要大,就表示博主新发了微博, 我们就可以保存微博文字和图片用于之后的微信转发。
图片转存
我用的是七牛云的对象存储。这里用哪家的都一样。
怎么同步消息到微信?
如何发送消息到微信
- 类似的有server酱、PushDeer之类的推送工具。个人用是不错的。如果想把消息发送给所有订阅的人还是欠缺一点。
- 自己建一个公众号,利用官方的sdk进行发送。优点:不用担心被封号。缺点:要注册公众号要花时间。
- 有没有微信机器人或者模拟登录微信呢?
- 开源的ItChat、openwechat
- 但在我尝试后很不幸账号被警告。
- 有没有第三方的公众号来代发消息呢?
- 还好找到了wxpusher.zjiecode.com/
- wxpusher是一个三方的公众号,负责消息发送微信。根据文档通过http接口可以轻松的接入,并推送给所有订阅了我们这个频道的用户。
编码
因为我最近在使用golang,所以用golang做这些处理比较方便。其他语言也一致。
先看主要逻辑
func main() {
// 获取wxPusher所有订阅的用户id列表
getAllUid()
// 获取微博url中的用户id
parseWeiboUserUrl()
// 获取当前第一条微博的发布时间作为最新发布时间
alwaysGetWeiboUserInfo()
// 定时检测是否有新微博
go cornCheckNewWeibo()
// 启动http服务
httpServer()
}
定时检测
// cornCheckNewWeibo 定时检测新微博并发送到微信
func cornCheckNewWeibo() {
ticker := time.NewTicker(1 * time.Minute)
defer ticker.Stop()
for range ticker.C {
if isNewWeibo, weibo := checkHasNewWeibo(); isNewWeibo {
fmt.Printf("时间:%s,有新微博:%s\n", datetime.GetNowDateTime(), weibo.Weibo)
// 发送消息: 有新微博更新
sendWeibo2WeiXin(weibo.WxData, UidS)
// 更新最新微博时间
createTime = weibo.SendTime
}
}
}
检测逻辑
if firstWeiboCreatAt.After(createTime) {
// 有新微博
cardsData := gjson.Get(string(weiboRes), "data.cards")
// 解析微博文字
weiboTxt := weiboParseText(cardsData)
// 解析微博图片
qiNiuImgUrls := weiboParseImg(cardsData, weiboTxt)
// 解析微博是否是转发微博
isRetweet := weiboParseRetweet(cardsData)
// 处理为html消息 用于发送微信通知
wxData := weiboParseWeXinMsg(weiboTxt, qiNiuImgUrls, isRetweet)
return true, &Weibo{
Weibo: weiboTxt,
SendTime: firstWeiboCreatAt,
IsRetweet: isRetweet,
Image: slice2Str(qiNiuImgUrls),
WxData: wxData,
}
}
这里用到gjson库,非常方便操作json字符串。
图片转存
httpclient获取图片内容后上传到图床后,将访问地址拼接到文字内容后即可
// weiboParseImg 解析微博中的图片
func weiboParseImg(cardsData gjson.Result, newWeibo string) []string {
var qiNiuImgUrls []string
newWeiboPicNum := gjson.Get(cardsData.Array()[0].Raw, "mblog.pic_num").Int()
if newWeiboPicNum > 0 {
// 微博中有图片
qiNiuImgUrls = weiboImgHandler(cardsData)
newWeibo = newWeibo + fmt.Sprintf("<br /><br />")
for _, qiNiuImgUrl := range qiNiuImgUrls {
// 微博消息后添加图片地址
imgTag := fmt.Sprintf(`<img src=%s />`, qiNiuImgUrl)
newWeibo = newWeibo + imgTag
}
}
return qiNiuImgUrls
}
上面我们做了最新微博判断、最新微博文字和图片获取、图片转存、微信消息的发送。最后做成镜像到云服务器运行即可。
# 打包依赖阶段使用golang作为基础镜像
FROM golang:1.20-rc-alpine as builder
# 启用go module
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct
WORKDIR /app
COPY . .
# CGO_ENABLED禁用cgo 然后指定OS等,并go build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o weibo_monitor .
# 运行阶段指定scratch作为基础镜像
FROM scratch
WORKDIR /app
# 将上一个阶段publish文件夹下的所有文件复制进来
COPY --from=builder /app/weibo_monitor .
EXPOSE 8080
ENTRYPOINT ["./weibo_monitor"]
效果
最后愉快在微信接收最新的微博消息
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END