最近在追一些漫画,漫画大多数都是在下午更新,想着要是每天下午拉取一下更新的内容推送到钉钉群里提醒我看,岂不是美哉😂
说着就开始琢磨这一套东西该如何下手,思路决定出路,一定要简单,所以想到了python,下面开始准备工作。
- pycharm python3.x
- 钉钉群机器人文档 open.dingtalk.com/document/gr…
1.首先按照文档使用钉钉群机器人向群里发送消息
import time
import hmac
import hashlib
import base64
import urllib.parse
timestamp = str(round(time.time() * 1000))
secret = 'this is secret' # 这边是钉钉机器人的secret
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
把 timestamp和第一步得到的签名值拼接到URL中。
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX
代码中引入
# 后续所用到的库都在这里
import requests
from bs4 import BeautifulSoup
import json
import base64
import hashlib
import hmac
import time
import urllib.parse
from datetime import datetime
import os
from apscheduler.schedulers.background import BackgroundScheduler
ddUrl= '推送地址'
dd_headers = {
"Content-Type": "application/json",
}
requests.request("POST", ddUrl, headers=dd_headers, data= 需要推送的内容 )
点击运行就可以将内容发送到对应的群里,消息有多种类型,详见文档open.dingtalk.com/document/ro…
2.获取对应网页内的数据
page_link = '' # 目标地址
content_link = '' # 拼接地址
cover_img = '' # 漫画首张封面图
def get_data():
res = requests.request("GET", page_link, headers=headers)
res.encoding = "GBK"
content = BeautifulSoup(res.text, 'html.parser')
news_list = content.find(id="newsList")
news_list = news_list.find_all("li")
content_list = []
global cover_img
cover_img = news_list[0].find("img")["src"]
for i in news_list:
title = i.find('div', class_='hdline').text
classify = i.find('p', class_='news_list_tw_p').text.replace(' ', '')
cover = i.find("img")["src"]
link_url = content_link + i.find('a')['href']
info_content = {
"title": title,
"cover": cover,
"classify": classify,
"link_url": link_url
}
content_list.append(info_content)
# 将爬取的数据写入一个json文件里面,以便后续页面中使用
with open("cartoon.json", "w", encoding='utf-8') as json_file:
json.dump(content_list, json_file, indent=4, ensure_ascii=False)
写入的json内容
将内容搞个页面渲染出来,一定要简单
本地先预览一下
将内容推送到钉钉群里
def handle_send():
get_data()
# config.json 是配置文件,里面存着 secret access_token
fileJson = json.load(open('config.json', "rb"))['project1']
timestamp = str(round(time.time() * 1000))
secret = fileJson["secret"] # 钉钉secret
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
ddUrl = f'https://oapi.dingtalk.com/robot/send?access_token={fileJson["access_token"]}×tamp={timestamp}&sign={sign}'
dd_headers = {
"Content-Type": "application/json",
}
res_data = {
"msgtype": "link",
"link": {
"text": "您订阅的漫画更新了,点击速看",
"title": "漫画更新",
"picUrl": cover_img,
"messageUrl": "自己服务器地址"
}
}
data = json.dumps(res_data)
requests.request("POST", ddUrl, headers=dd_headers, data=data)
定时任务,方便后续在服务器可以自动拉取
if __name__ == '__main__':
scheduler = BackgroundScheduler(timezone='Asia/Shanghai')
scheduler.add_job(handle_send, 'interval', days=1, start_date='开始日期')
scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
try:
# 其他任务是独立的线程执行
while True:
time.sleep(2)
print('sleep!')
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()
最后测试一下是否可以正常使用
部署 这里使用的是阿里云服务器,因为项目比较简单,所以用以下方式生成项目依赖信息
# 本地项目内运行,会生成一个 requirements.txt
pip freeze > requirements.txt
之后,将本地的文件夹,不包含venv文件夹,放到nginx里面的html文件夹里面,为了简单,不做区分了,之后进行安装依赖 pip install -r ./requirements.txt , 会发现报错了,因为服务器上面的python版本是2.x的,我们得去安装python3.x
首先下载新版本
- wget www.python.org/ftp/python/…
- 然后解压缩 tar -zxvf Python-3.7.6.tgz
- 进入解压缩后的目录,安装配置:cd Python-3.7.6/ ./configure
- 配置完成后,就可以编译了:make
- 安装:make install
- 验证是否安装成功:python -V
之后再安装我们的项目依赖,依赖安装完成之后,我们需要将我们的项目给跑起来,进程守护 nohup python3 main.py &,这样可以在我们关毕连接的时候内部定时任务仍然可以执行
所有的准备就绪之后,配置nginx.conf
配置好之后,重启nginx nginx -s reload
所有的都弄好之后就可以在浏览器访问,查看是否可以正常访问
好了,这样每天拉取一下内容推送到群里,我就可以去看我的漫画了,这里的东西也很简单,仅仅是做了一个筛选我需要的漫画的一些信息,主体内容还是在他们的服务器上。