【上班摸鱼】聊天机器人定时发送微博实时热搜新闻
序言
办公室总有一些人工作做的好,资讯掌握也不少,且总能第一时间获取最新资讯,某房地产公司基金快爆雷了,某男星劈腿女星出轨。
作为搬砖能手的我们,也想实时关注国家大事,但又不想下载各种app以及打开某个页面。有没有一款功能能定时推送微博各种资讯以及各种新闻呢,且还能各种扩展,最主要是能独立修改配置。终于屌丝的我在周末不断尝试后,终于使用爬虫+ci定时触发的方式搞定了,用起来还不错。有兴趣同学可以尝试下
效果如下:
接下来给大家讲讲如何实现。
实现框架
该功能根据功能拆分,分为三个步骤,分别为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 点赞数
剩下的就可以通过该方式获取微博数据,具体的代码实现如下:
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脚本。具体的脚本参考如下:
def deal_message_to_markdown(self,hotmessages=None):
'''
处理各种途径消息
:param messages:
:return:
'''
message='### 实时热搜
<font color="comment">时间:%s</font>
'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
for hotmessage in hotmessages:
message+='> [%s.%s](%s) <font color="warning">%s</font>
'%(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仓库
- 进入持续集成平台,创建ci job
- 复制pipline脚本到构建任务
- 设置定时构建