欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

监控微博用户发布的最新消息,并将其推送到微信。

最编程 2024-07-08 14:29:51
...

背景

因为想监控微博用户的消息,想在他发微博后,快速的在微信同步微博发送的内容。

问题

  • 怎么获取最新的发布的微博消息?
  • 怎么同步消息到微信?

解决方案

怎么获取最新的发布的微博消息?

首先会想用一些库来爬取微博的内容。但是找了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]中表示选中到微博标签页 image.png
  • 微博列表接口

在列表接口中data.cards[2].mblog.text就是微博的文字内容部分

image.png

  • 图片部分 在data.cards[2].mblog.pics中表示了微博中包含的图片地址

image.png

注意: 其中的图片地址url,由于微博有访问限制是不能够直接访问的。浏览器直接访问会返回403 Forbidden。但是没有禁止用http客户端访问,所以我打算将图片下载下来进行转存到我的图床即可。

  • 微博的发布时间 在data.cards[2].mblog.created_at表示发布时间

image.png

总结: 上面我们获取到了微博的文字和图片以及发布时间。那我们可以定时获取微博的列表接口的第一条,如果第一条的发布时间比我们保存的发布时间要大,就表示博主新发了微博, 我们就可以保存微博文字和图片用于之后的微信转发。

图片转存

我用的是七牛云的对象存储。这里用哪家的都一样。

怎么同步消息到微信?

如何发送消息到微信

  • 类似的有server酱、PushDeer之类的推送工具。个人用是不错的。如果想把消息发送给所有订阅的人还是欠缺一点。
  • 自己建一个公众号,利用官方的sdk进行发送。优点:不用担心被封号。缺点:要注册公众号要花时间。
  • 有没有微信机器人或者模拟登录微信呢?
    • 开源的ItChatopenwechat
    • 但在我尝试后很不幸账号被警告。

image.png

  • 有没有第三方的公众号来代发消息呢?
    • 还好找到了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"]

效果

最后愉快在微信接收最新的微博消息

image.png