引子
今年的4月,对于美剧以及漫威迷来说简直不要太爽。《权游》最后一季迎来史诗之战,漫威的《复联》也是EndGame。前两天蹲着0点场看了《复联4》的首映,3个小时,觉得很值。Tony是个遗憾,作为一枚小小程序猿,Tony这种科学天才真的是终极偶像,而Friday最为他得力的助手也是战绩斐然。有时候不免憧憬,什么时候我才能有自己的Friday呢?心动不如行动,那就从现在开始从零打造吧。
权游每周一更新一集,有时候事情多难免忘记,一不小心被剧透那简直就是内心一万头草泥马奔腾而过,所以,我的Friday就从一个简单的《权游》更新提示功能开启。
团队现在主推钉钉办公,里面的机器人接口也较为成熟,在没有考虑过多的情况下,选择了钉钉自定义机器人(webhook)的方式进行了我的聊天机器人开发之路。然而后来事实证明,在开始之前,对基础载体的调研还是得足够充分。
需求
本次功能需求简单明确:
- 固定时间检查网站是否有更新
- 有更新则主动在群里推送并@所有人
- 推送信息包括更新到第几集,海报以及link地址
设计
这次功能需求比较简单,且相对来说较为定制化,所以设计上比较简单粗暴。不管怎么说,先干起来,后来有了新的想法,可以再重构。
- 从某电影网站获取到《权游》剧集的更新信息,并找出更新到n集。找了一圈,发现电影天堂的比较简单,毕竟网页信息爬取不是我的特长 - -!
- 本地存放上次更新的集数m,当n!=m则代表有更新
- 有更新则在聊天群进行推送,并保存新的集数到本地
- 写个脚本每天定时运行上面的程序,实现定时检查更新并推送
主要代码
'''
@Author: 公小虽
@LastEditors: 公小虽
@Description: 定制化推送,这里以《权利的游戏》为例
@Date: 2019-04-25 15:43:50
@LastEditTime: 2019-04-26 10:15:08
'''
import os
import requests
from dingtalkchatbot.chatbot import DingtalkChatbot
from lxml import etree
import settings # 自定义模块,存放了webhook
url = r'https://www.dy2018.com/i/100723.html'
path = settings.BASE_DIR
filename = path + '/temp_data.txt'
def get_old_data(filename):
'''
@description: 根据filename获取老的集数并返回
@param {filename} 本地存放集数的文件
@return: old_data 老的集数
'''
old_data = ''
if os.path.exists(filename):
with open(filename, encoding='utf-8') as fn:
old_data = fn.read()
return old_data
def get_new_data(url):
'''
@description: 根据URL获取最新的集数并返回
@param {url}
@return: 新的集数
'''
html = requests.get(url)
html.encoding = 'gbk'
text = etree.HTML(html.text)
new_data = text.xpath('//*[@id="Zoom"]/div/ul/li[1]/a/text()')[0]
return new_data
def teleplay_update():
'''
@description: 分别获取新的和老的数据,进行比较,一致则不提示,不一致则提示有更新
@param {}
@return:
'''
new_data = get_new_data(url)
old_data = get_old_data(filename)
print(new_data)
print(old_data)
if new_data != old_data:
webhook = settings.WEBHOOK # settings.WEBHOOK中存放你机器人的专属webhook
w_robot = DingtalkChatbot(webhook=webhook) # 建立机器人
# 发送markdown格式信息
w_robot.send_markdown(title='权利的游戏', text='### <权利的游戏>第八季\n'
'更新至'+new_data+'\n\n'
'![剧照](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1556196549485&di=6e39be30911dc075748e6da63b820a2a&imgtype=0&src=http%3A%2F%2Fwx1.sinaimg.cn%2Flarge%2F69bbca83gy1fxy76tgtvpj20hs0a03z5.jpg)\n'
'[观看地址]('+url+')\n', is_at_all=True)
# 新的剧集数更新存放到本地
with open(filename, 'w', encoding='utf-8') as fn:
fn.write(new_data)