起因:
因为之前很多ThinkPHP开发的企业网站容易被注入后修改数据,跳转到不正规网站。但很多这种站点不长久更新,有时候被修改了数据不能及时发现。
就想着搞一个python的定时检测页面md5值,如果md5值发生了变化就给钉钉机器人发推送提醒。
定时任务处理:
方法一: 使用time.sleep()基础函数实现简单定时任务
import time
def simple_task():
print("任务执行时间:", time.ctime())
# 每隔5分钟执行一次任务
while True:
simple_task()
time.sleep(5 * 60)
方法二: 结合系统定时任务(如cron)执行Python脚本
Linux (cron):
在用户家目录下编辑crontab文件:
crontab -e
添加定时任务条目:
0 3 * * * /usr/bin/python3 /path/to/your/script.py
上述cron表达式表示每天凌晨3点执行指定Python脚本。
代码如下:
import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
# 设置谷歌浏览器的请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 - monitor"
}
# 设置手机标头
mobilePhoneUserAgent = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 - monitor"
}
# 2024.5.14 检测正常页面的时间
defaultTime = "2024.5.14"
#需要检测的网址与md5值 (md5值第一次获取后填写)
toBeTestArr = [
{"url": "网站1", "md5": "第一次需要手动填写"},
{"url": "网站2", "md5": "第一次需要手动填写"},
]
#需要手机标头访问的
mobileStation = [
"网站1"
]
#钉钉相关配置
secret = " " #密匙
access_token = " " #链接里面的
def timingDetection():
changeContent = ''
for ix in toBeTestArr:
if ix['url'] in mobileStation:
print(ix['url'])
response = requests.get(ix['url'], headers=mobilePhoneUserAgent)
else:
response = requests.get(ix['url'], headers=headers)
content = response.content.decode('utf8')
soup = str(content)
soup = soup[:1800] # 截取前1800字符
md = hashlib.md5(soup.encode())
mdx = md.hexdigest()
if mdx != ix['md5']:
changeContent += "网站:【" + ix['url'] + "】\n"
print(ix['url'], mdx)
if changeContent:
changeContent += "以上网站页面内容与" + defaultTime + "检测的内容不一致,请手动判断是否被篡改。"
sendMessage(changeContent)
else:
print("检测未发生篡改")
def sendMessage(content):
timestamp = str(round(time.time() * 1000))
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 = "https://oapi.dingtalk.com/robot/send?access_token=" + access_token + "×tamp=" + timestamp + "&sign=" + sign
data = {
'at':
{
'atUserIds': [],
'atMobiles': [],
'isAtAll': True,
},
'text': {
'content': content
},
'msgtype': 'text',
}
headers['Content-Type'] = 'application/json'
r = requests.post(url=ddUrl, data=json.dumps(data), headers=headers)
w = json.loads(r.text)
print(w)
if __name__ == '__main__':
timingDetection()