python 爬取网页内容推送到钉钉群里

675 阅读3分钟

最近在追一些漫画,漫画大多数都是在下午更新,想着要是每天下午拉取一下更新的内容推送到钉钉群里提醒我看,岂不是美哉😂

说着就开始琢磨这一套东西该如何下手,思路决定出路,一定要简单,所以想到了python,下面开始准备工作。

  1. pycharm python3.x
  2. 钉钉群机器人文档 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&timestamp=XXX&sign=XXX

826A3888-412B-44d2-A66C-9C7838CA2396.png

14204205-C94D-4528-849D-C106A89E487A.png

代码中引入

# 后续所用到的库都在这里

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内容

image.png

将内容搞个页面渲染出来,一定要简单

image.png

本地先预览一下

image.png

将内容推送到钉钉群里

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"]}&timestamp={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()

最后测试一下是否可以正常使用

image.png

部署 这里使用的是阿里云服务器,因为项目比较简单,所以用以下方式生成项目依赖信息

# 本地项目内运行,会生成一个 requirements.txt
pip freeze > requirements.txt

之后,将本地的文件夹,不包含venv文件夹,放到nginx里面的html文件夹里面,为了简单,不做区分了,之后进行安装依赖 pip install -r ./requirements.txt , 会发现报错了,因为服务器上面的python版本是2.x的,我们得去安装python3.x

首先下载新版本

  1. wget www.python.org/ftp/python/… 
  2. 然后解压缩 tar -zxvf Python-3.7.6.tgz
  3. 进入解压缩后的目录,安装配置:cd Python-3.7.6/ ./configure
  4. 配置完成后,就可以编译了:make
  5. 安装:make install
  6. 验证是否安装成功:python -V

之后再安装我们的项目依赖,依赖安装完成之后,我们需要将我们的项目给跑起来,进程守护 nohup python3 main.py &,这样可以在我们关毕连接的时候内部定时任务仍然可以执行

所有的准备就绪之后,配置nginx.conf

image.png

配置好之后,重启nginx nginx -s reload

所有的都弄好之后就可以在浏览器访问,查看是否可以正常访问

image.png

好了,这样每天拉取一下内容推送到群里,我就可以去看我的漫画了,这里的东西也很简单,仅仅是做了一个筛选我需要的漫画的一些信息,主体内容还是在他们的服务器上。