首页 > 技术文章 > 【上班摸鱼】聊天机器人定时发送微博热搜

package 2021-09-21 10:30 原文

【上班摸鱼】聊天机器人定时发送微博实时热搜新闻

序言

办公室总有一些人工作做的好,资讯掌握也不少,且总能第一时间获取最新资讯,某房地产公司基金快爆雷了,某男星劈腿女星出轨。
图1
作为搬砖能手的我们,也想实时关注国家大事,但又不想下载各种app以及打开某个页面。有没有一款功能能定时推送微博各种资讯以及各种新闻呢,且还能各种扩展,最主要是能独立修改配置。终于屌丝的我在周末不断尝试后,终于使用爬虫+ci定时触发的方式搞定了,用起来还不错。有兴趣同学可以尝试下
效果如下:
图1
接下来给大家讲讲如何实现。

实现框架

该功能根据功能拆分,分为三个步骤,分别为python微博爬虫以及数据处理、企业微信机器人数据发送,CI定时构建出发

  • 微博爬虫
    1、python获取10条微博最新资讯
    2、bs4包对最新的数据网页进行解析
    3、过滤当前微博推广的热搜
    4、构建适企业微信机器人markdown数据
  • 企业微信机器人
    1、实现根据企业微信机器人接口进行请求方法
  • CI定时触发
    1、使用coding提供的免费ci构建执行python脚本
    2、设置该构建job的定时任务

具体实现

python实现脚本

  • 数据解析以及组装
    根据微博首页地址“https://s.weibo.com/top/summary?cate=realtimehot” ,分析对我们有用的数据字段,我们可以根据标签以及属性的方式找到相关的关键字,同时定义一条微博结构应该包含如下几个部分:
    1、ranking 排行
    2、message 具体的消息内容
    3、url 该条消息的超链接地址
    4、star 点赞数
    剩下的就可以通过该方式获取微博数据,具体的代码实现如下:
    图1
    图1
    def get_hot_message_from_weibo(self,message_num=10):
        '''
        从https://s.weibo.com/top/summary?cate=realtimehot获取热搜,热搜一小时更新一次
        :return: 返回字典类型,{title:标题,girlurl:图片地址
        '''
        self.url = "https://s.weibo.com/top/summary?cate=realtimehot"
        htmltext=self.get(self.url).text
        soup = BeautifulSoup(htmltext,'html.parser')
        hothtmls=soup.findAll(name="tr", attrs={"class" :""})
        hotsum = len(hothtmls)
        #传入长度超过热搜长度,返回为空
        hotmessages = []
        if message_num > hotsum:
            return dict()
        for hothtml in hothtmls:
            if hothtml.find(name='td',attrs={"class" :"td-01"}).text.strip()=='' or not hothtml.find(name='td',attrs={"class" :"td-01"}).text.strip().isdigit():
                continue
            hotmessage = dict()
            hotmessage['ranking'] = hothtml.find(name='td', attrs={"class": "td-01"}).text
            hotmessage['message'] = hothtml.find(name='a').text
            hotmessage['url'] = 'https://s.weibo.com/'+hothtml.find(name='a').attrs['href']
            hotmessage['star'] = hothtml.find(name='span').text
            hotmessages.append(hotmessage)
            #热点消息支持10条
            message_num-=1
            if message_num <1:
                break
        return hotmessages
  • 数据转markdown格式
    我先尝试在微信机器人修改好markdown的格式,该部分需要大家自由发挥格式,再把相应的格式转换为python脚本。具体的脚本参考如下:
    图1
    def deal_message_to_markdown(self,hotmessages=None):

        '''
        处理各种途径消息
        :param messages:
        :return:
        '''
        message='### 实时热搜\r\n\
<font color="comment">时间:%s</font>\r\n'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        for hotmessage in hotmessages:
            message+='> [%s.%s](%s) <font color=\"warning\">%s</font>\r\n'%(hotmessage['ranking'],
                                             hotmessage['message'],
                                             hotmessage['url'],
                                             hotmessage['star'])
        return message

企业微信发送

内容比较简单,直接参考代码

    def send_wechart(self,wechart_url,msg=None):
        '''
        企业微信发送图片资源消息
        :param wechart_url: 企业微信机器人地址
        :param msg: 发送资源消息
        :return:
        '''
        header = {
            'Content-Type': 'application/json'
        }
        data = {
            "msgtype": "markdown",
            "markdown": {
                "content": msg
            }
        }
        respone = requests.post(url=wechart_url, headers=header, json=data)
        return respone

定时执行脚本CI

  • 进入coding平台(https://coding.net/) ,创建项目
  • 上传代码到git仓库
    图4
  • 进入持续集成平台,创建ci job
    图5
  • 复制pipline脚本到构建任务
    图6
  • 设置定时构建
    图6

效果如下:

图6

推荐阅读