前言
使用阿里云服务器也有一段时间了,续费几次之后再续费就变的非常贵了,我们需要重新换服务器时,可能会需要把宝塔面板的计划任务也得重新再来一遍,虽然有插件不过需要付费,像我这样的白嫖党让我付费是不可能滴,但是手动一个一个实在太慢了,尤其对于那些计划任务较多的人来说,浪费时间不说还痛苦😣。。。
下面的爬虫程序可以将未过期的服务器的计划任务保存下来,并自动添加到新的服务器中。
我的是将远程服务器计划任务备份到本地服务器(windows Linux 子系统ubuntu)中,之后买新的服务器可以将本地备份到远程实现计划任务的备份与恢复
说明
-
首先打开你的服务器的计划任务界面(一切一切的前提是你的服务器已经安装了宝塔面板),如http://39.106.6.19:8888/crontab ,右键检查找到network,找到如下图请求链接,(点击headers,我这里为了让大家看到计划任务的json格式并没有打开headers),在上面找参数,将代码里面的headers1中填写找到的参数
-
headers1是源服务器,headers2是目标服务器
代码
import requests
headers1 = {
'Cookie':'pro_end=-1; ltd_end=-1; serverType=nginx; order=1839; bt_userC%22data%22%3A%7B%22username%22%3A%22155****1063%22%7D%7D; csrftoken=qmXjPjWQ2XoUC1TEkZhq8P8uSYKDrZ9lNMd6Vw9vgYmzI39oc3rZd2V3lEb7UNRp; sites_path=/www/wwwroot; distribution=crch=undefined; softType=-1; load_type=-1; rank=list; vcodesum=11; Path=/python; SESSIONID=6dfa8e80-8531-4d58-a4dd-fb20b361f7a2.iHDuK5NGDsMEj3Y43_uOMNHM-W8; request_token=0hiUL3VESBhbMXm5bE9MmewZJiCGeiHHXAb8RvGt5pAma0tV',
'Host':'39.106.56.4:8888',
'Origin':'http://39.106.56.4:8888',
'Pragma':'no-cache',
'Referer':'http://39.106.56.4:8888/crontab',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'x-cookie-token':'0hiUL3VESBE9MmewZJiCGeiHHXAb8RvGt5pAma0tV',
'x-http-token':'H9F6oXNti3LR3iQCtRy9WMOjpOQcyIDc1qvRf7TcvK',
'X-Requested-With':'XMLHttpRequest'
}
headers2 = {
'Cookie':'csrftoken=S2Nkx7rAODwac1jWCs02NritjLhjb6ZAZtKFt4ZMVkkMe; SESSIONID=f8fb934f7c-b650-a8f3d7ef6075.CiO28-HdcAdUADJhB_MSbAyTA6s; request_token=ZM8SgVEDfSTrZk9GveGzKhFkVBS9uAYEKqicM4VEL944kQ7G; pro_end=-1; ltd_end=-1; serverType=nginx; order=id%20desc; memSize=12168; bt_user_info=%7B%22status%22%3Atrue%2C%22msg%22%3A%22%u83B7%u53D6%u6210%u5222data%22%3A%7B%22username%22%3A%22155****1063%22%7D%7D; rank=list; Path=/',
'Host':'127.0.0.1:9999',
'Origin':'http://127.0.0.1:9999',
'Pragma':'no-cache',
'Referer':'http://127.0.0.1:9999/crontab',
'sec-ch-ua':'"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
'sec-ch-ua-mobile':'?0',
'Sec-Fetch-Dest':'empty',
'Sec-Fetch-Mode':'cors',
'Sec-Fetch-Site':'same-origin',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'x-cookie-token':'ZM8SgVk9GveGzKhFkVBS9uAYEKqicM4VEL944kQ7G',
'x-http-token':'R5vjDeW8RxYs5r6UPzC3zNvkFAyQxvOR9goIqPzTrU',
'X-Requested-With':'XMLHttpRequest'
}
# 初始化源服务器和待备份的目标服务器
def init(server1,server2):
global url_server1
global url_server2
global getID
getID = True
url_server1 = {"url":f"http://{server1}/crontab?action=GetCrontab","add":f"http://{server1}/crontab?action=AddCrontab","del":f"http://{server1}/crontab?action=DelCrontab","stop":f"http://{server1}/crontab?action=set_cron_status","headers":headers1}
url_server2 = {"url":f"http://{server2}/crontab?action=GetCrontab","add":f"http://{server2}/crontab?action=AddCrontab","del":f"http://{server2}/crontab?action=DelCrontab","stop":f"http://{server2}/crontab?action=set_cron_status","headers":headers2}
def convert(s):
if "每月" in s:
return "months"
elif "每周" in s:
return "week"
elif "每" in s and "天" in s:
if len(s)>2:
return "day-n"
return "day"
elif "每" in s and "小时" in s:
if "每小时" in s:
return "hour"
return "hour-n"
elif "每" in s and "分钟" in s:
return "minute-n"
else:
return ""
# 增加计划任务
def add_crontab():
# 使用网站请求的计划任务
r = requests.post(url_server1.get("url"),headers = url_server1.get("headers")).text
global cons
cons = eval(r)
# 使用本地存储的计划任务
# f = open('crontab.txt','r',encoding='utf-8')
# r = str(f.readlines())
# global cons
# cons = eval(eval(r)[0])
for con in cons[::-1]:
data = {
'name':con['name'],
'type':convert(con['type']),
'where1':con['where1'],
'hour':con['where_hour'],
'minute':con['where_minute'],
'week':con['where1'],
'sType':con['sType'],
'sBody':con['sBody'],
'sName':con['sName'],
'backupTo':con['backupTo'],
'save':con['save'],
'sBody':con['sBody'],
'status':con['status'],
'urladdress':con['urladdress'],
'save_local':con['save_local'],
'notice':con['notice'],
'notice_channel':con['notice_channel']
}
# print(data)
r = requests.post(url_server2.get("add"),headers=url_server2.get("headers"),data=data)
print(r.text)
id = r.json()['id']
if con.get("status") == 0:
data2 = {"id":id}
print(data2)
r1 = requests.post(url_server2.get("stop"),headers=url_server2.get("headers"),data=data2)
print(r1.text)
id = id+1
print("*"*30)
def whichserver(server):
if server in url_server1.get("url"):
headers = url_server1.get("headers")
else:
headers = url_server2.get("headers")
return headers
# 删除server服务器的id从J到K的计划任务
def del_crontab(j,k,server):
if server in url_server1.get("del"):
url = url_server1.get("del")
else:
url = url_server2.get("del")
headers = whichserver(server)
for i in range(j,k+1):
r = requests.post(url,headers=headers,data={"id":i})
print(r.text)
# 保存server服务器的计划任务
def save_crontab(server):
if server in url_server1.get("url"):
url = url_server1.get("url")
else:
url = url_server2.get("url")
headers = whichserver(server)
r = requests.post(url,headers = headers).text
cons = eval(r)
f = open('crontab.txt','w',encoding='utf-8')
f.write(str(cons))
f.close()
print("保存成功,请到当前目录crontab.txt查看")
def display(server):
if server in url_server1.get("url"):
url = url_server1.get("url")
else:
url = url_server2.get("url")
headers = whichserver(server)
r = requests.post(url,headers = headers)
for i in r.json():
print(i)
if __name__ == '__main__':
# 初始化源服务器地址和目的服务器地址
init("39.106.56.4:8888","127.0.0.1:9999")
# 展示计划任务,可获取ID
# display("127.0.0.1:9999")
# 开始备份计划任务
add_crontab()
# 删除服务器ID从i 到 j的计划任务
# del_crontab(1,500,"127.0.0.1:9999")
# display("127.0.0.1:9999")