修改BUG:http请求过多导致服务器防火墙拒绝连接

This commit is contained in:
Qiea
2024-12-22 21:32:17 +08:00
parent f73b40a979
commit b8abc176da
4 changed files with 54 additions and 33 deletions

View File

@@ -1,6 +1,11 @@
import pymysql, threading, time import pymysql, threading, time
from queue import Queue from queue import Queue
from Tools import config, download_image, Hash, remove_image, compare, Image, imagehash, os, logging, clean_image
import requests
from concurrent.futures import ThreadPoolExecutor
from Tools import config, Hash, Image, imagehash, os, logging, download_image, remove_image, clean_image, compare
class MySQLConnectionPool: class MySQLConnectionPool:
def __init__(self): def __init__(self):
@@ -56,11 +61,14 @@ class UploadThread(threading.Thread):
def run(self): def run(self):
logging.debug(f'我是上传线程{self.uploadqqnumber}') logging.debug(f'我是上传线程{self.uploadqqnumber}')
if download_image(self.uploadqqnumber): with ThreadPoolExecutor() as executor:
Hash(self.conn).tomysql(self.uploadqqnumber) future = executor.submit(download_image, f'{self.uploadqqnumber}')
logging.info(f'上传成功: {self.uploadqqnumber}') res = future.result() # 等待结果并获取返回值
remove_image(self.uploadqqnumber) if res:
self.pool.release_connection(self.conn) Hash(self.conn).tomysql(self.uploadqqnumber)
logging.info(f'上传成功: {self.uploadqqnumber}')
remove_image(self.uploadqqnumber)
self.pool.release_connection(self.conn)
class FindThread(threading.Thread): class FindThread(threading.Thread):
@@ -78,7 +86,6 @@ class FindThread(threading.Thread):
self.pool.release_connection(self.conn) self.pool.release_connection(self.conn)
class ByNetFindThread(threading.Thread): class ByNetFindThread(threading.Thread):
def __init__(self, TargetImageHash, findqqnumber): def __init__(self, TargetImageHash, findqqnumber):
super().__init__() super().__init__()
@@ -86,19 +93,23 @@ class ByNetFindThread(threading.Thread):
self.findqqnumber = findqqnumber self.findqqnumber = findqqnumber
def run(self): def run(self):
logging.debug(f'查找的QQ号是: {self.findqqnumber}')
if download_image(self.findqqnumber): with ThreadPoolExecutor() as executor:
FindImage = Image.open(str(f'./img/{self.findqqnumber}.jpg')) future = executor.submit(download_image, f'{self.findqqnumber}')
if FindImage.mode == 'P' and 'transparency' in FindImage.info: res = future.result() # 等待结果并获取返回值
FindImage = FindImage.convert('RGBA') logging.debug(f'查找的QQ号是: {self.findqqnumber}, res: {res}')
FindImageHash = bytes.fromhex(str(imagehash.average_hash(FindImage))) if res:
res = compare(self.TargetImageHash, FindImageHash) FindImage = Image.open(str(f'./img/{self.findqqnumber}.jpg'))
if res-99.9 >= 0 : if FindImage.mode == 'P' and 'transparency' in FindImage.info:
logging.info(f'找到QQ号了:{self.findqqnumber}') FindImage = FindImage.convert('RGBA')
if os.path.exists(f'./img/congratulations_{self.findqqnumber}.jpg'): FindImageHash = bytes.fromhex(str(imagehash.average_hash(FindImage)))
os.remove(f'./img/congratulations_{self.findqqnumber}.jpg') res = compare(self.TargetImageHash, FindImageHash)
os.rename(f'./img/{self.findqqnumber}.jpg',f'./img/congratulations_{self.findqqnumber}.jpg') if res-99.9 >= 0 :
clean_image() logging.info(f'找到QQ号了:{self.findqqnumber}')
os._exit(0) if os.path.exists(f'./img/congratulations_{self.findqqnumber}.jpg'):
logging.info(f'[{self.findqqnumber}]的相似度是:{res}%') os.remove(f'./img/congratulations_{self.findqqnumber}.jpg')
remove_image(self.findqqnumber) os.rename(f'./img/{self.findqqnumber}.jpg',f'./img/congratulations_{self.findqqnumber}.jpg')
clean_image()
os._exit(0)
logging.info(f'[{self.findqqnumber}]的相似度是:{res}%')
remove_image(self.findqqnumber)

View File

@@ -1,5 +1,8 @@
import imagehash, configparser, requests, os, logging, re import imagehash, configparser, os, logging, re
from PIL import Image from PIL import Image
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read('config.cfg') config.read('config.cfg')
@@ -105,6 +108,7 @@ def download_image(_qqnumber):
:param _qqnumber: QQ号 :param _qqnumber: QQ号
:return: 成功1 失败0 :return: 成功1 失败0
""" """
logging.debug(f'下载的QQ号是: {_qqnumber}')
if not os.path.exists('img'): if not os.path.exists('img'):
os.makedirs('img') os.makedirs('img')
@@ -112,8 +116,19 @@ def download_image(_qqnumber):
image_url = f'https://q1.qlogo.cn/g?b=qq&nk={_qqnumber}&s=0' image_url = f'https://q1.qlogo.cn/g?b=qq&nk={_qqnumber}&s=0'
image_name = os.path.join('img', f'{_qqnumber}.jpg') image_name = os.path.join('img', f'{_qqnumber}.jpg')
# 发送请求获取图片 # 创建一个会进行重试的适配器
response = requests.get(image_url) session = requests.Session()
retry = Retry(
total=5, # 最多重试3次
backoff_factor=1, # 每次重试的等待时间增加
status_forcelist=[500, 502, 503, 504], # 针对这些HTTP状态码才重试
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)
session.mount('http://', adapter)
# 使用session发送请求
response = session.get(image_url, timeout=10) # 设置超时时间为10秒
if response.status_code == 200: if response.status_code == 200:
# 保存图片 # 保存图片

View File

@@ -1,6 +1,6 @@
[settings] [settings]
type = 2 type = 2
TargetRange = 2787080000, 2787083000 TargetRange = 2787080000, 2787085000
TargetImage = ./img/target4.jpg TargetImage = ./img/target4.jpg
[mysql] [mysql]
@@ -14,7 +14,7 @@ hash_column_name = hash
pool_size = 100 pool_size = 100
[logging] [logging]
level = 10 level = 20
;CRITICAL = 50 ;CRITICAL = 50
;FATAL = CRITICAL ;FATAL = CRITICAL

View File

@@ -17,16 +17,12 @@ if __name__ == '__main__':
pool = MySQLConnectionPool() pool = MySQLConnectionPool()
Thread = FindThread(TargetImageHash, pool) Thread = FindThread(TargetImageHash, pool)
Thread.start() Thread.start()
os._exit(0)
elif type == 2: elif type == 2:
while baseArr <= TargetRange[1]: while baseArr <= TargetRange[1]:
Thread = ByNetFindThread(TargetImageHash, baseArr) Thread = ByNetFindThread(TargetImageHash, baseArr)
Thread.start() Thread.start()
baseArr += 1 baseArr += 1
sleep(1)
os._exit(0)
elif type == 3: elif type == 3:
pool = MySQLConnectionPool() pool = MySQLConnectionPool()
@@ -34,4 +30,3 @@ if __name__ == '__main__':
Thread = UploadThread(baseArr, pool) Thread = UploadThread(baseArr, pool)
Thread.start() Thread.start()
baseArr += 1 baseArr += 1
os._exit(0)