From b8abc176da2f33c70e9878573bb1ccb6f6d229ab Mon Sep 17 00:00:00 2001 From: Qiea <1310371422@qq.com> Date: Sun, 22 Dec 2024 21:32:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9BUG=EF=BC=9Ahttp=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E8=BF=87=E5=A4=9A=E5=AF=BC=E8=87=B4=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E9=98=B2=E7=81=AB=E5=A2=99=E6=8B=92=E7=BB=9D=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Thread.py | 57 ++++++++++++++++++++++++++++++++---------------------- Tools.py | 21 +++++++++++++++++--- config.cfg | 4 ++-- main.py | 5 ----- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/Thread.py b/Thread.py index 7786909..fc54093 100644 --- a/Thread.py +++ b/Thread.py @@ -1,6 +1,11 @@ import pymysql, threading, time 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: def __init__(self): @@ -56,11 +61,14 @@ class UploadThread(threading.Thread): def run(self): logging.debug(f'我是上传线程{self.uploadqqnumber}') - if download_image(self.uploadqqnumber): - Hash(self.conn).tomysql(self.uploadqqnumber) - logging.info(f'上传成功: {self.uploadqqnumber}') - remove_image(self.uploadqqnumber) - self.pool.release_connection(self.conn) + with ThreadPoolExecutor() as executor: + future = executor.submit(download_image, f'{self.uploadqqnumber}') + res = future.result() # 等待结果并获取返回值 + if res: + 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): @@ -78,7 +86,6 @@ class FindThread(threading.Thread): self.pool.release_connection(self.conn) - class ByNetFindThread(threading.Thread): def __init__(self, TargetImageHash, findqqnumber): super().__init__() @@ -86,19 +93,23 @@ class ByNetFindThread(threading.Thread): self.findqqnumber = findqqnumber def run(self): - logging.debug(f'查找的QQ号是: {self.findqqnumber}') - if download_image(self.findqqnumber): - FindImage = Image.open(str(f'./img/{self.findqqnumber}.jpg')) - if FindImage.mode == 'P' and 'transparency' in FindImage.info: - FindImage = FindImage.convert('RGBA') - FindImageHash = bytes.fromhex(str(imagehash.average_hash(FindImage))) - res = compare(self.TargetImageHash, FindImageHash) - if res-99.9 >= 0 : - logging.info(f'找到QQ号了:{self.findqqnumber}') - if os.path.exists(f'./img/congratulations_{self.findqqnumber}.jpg'): - os.remove(f'./img/congratulations_{self.findqqnumber}.jpg') - 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) + + with ThreadPoolExecutor() as executor: + future = executor.submit(download_image, f'{self.findqqnumber}') + res = future.result() # 等待结果并获取返回值 + logging.debug(f'查找的QQ号是: {self.findqqnumber}, res: {res}') + if res: + FindImage = Image.open(str(f'./img/{self.findqqnumber}.jpg')) + if FindImage.mode == 'P' and 'transparency' in FindImage.info: + FindImage = FindImage.convert('RGBA') + FindImageHash = bytes.fromhex(str(imagehash.average_hash(FindImage))) + res = compare(self.TargetImageHash, FindImageHash) + if res-99.9 >= 0 : + logging.info(f'找到QQ号了:{self.findqqnumber}') + if os.path.exists(f'./img/congratulations_{self.findqqnumber}.jpg'): + os.remove(f'./img/congratulations_{self.findqqnumber}.jpg') + 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) diff --git a/Tools.py b/Tools.py index 8d071e0..4cd44af 100644 --- a/Tools.py +++ b/Tools.py @@ -1,5 +1,8 @@ -import imagehash, configparser, requests, os, logging, re +import imagehash, configparser, os, logging, re from PIL import Image +import requests +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry config = configparser.ConfigParser() config.read('config.cfg') @@ -105,6 +108,7 @@ def download_image(_qqnumber): :param _qqnumber: QQ号 :return: 成功:1 失败:0 """ + logging.debug(f'下载的QQ号是: {_qqnumber}') if not os.path.exists('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_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: # 保存图片 diff --git a/config.cfg b/config.cfg index 3772114..e2589f7 100644 --- a/config.cfg +++ b/config.cfg @@ -1,6 +1,6 @@ [settings] type = 2 -TargetRange = 2787080000, 2787083000 +TargetRange = 2787080000, 2787085000 TargetImage = ./img/target4.jpg [mysql] @@ -14,7 +14,7 @@ hash_column_name = hash pool_size = 100 [logging] -level = 10 +level = 20 ;CRITICAL = 50 ;FATAL = CRITICAL diff --git a/main.py b/main.py index 08f847e..8b36c9f 100644 --- a/main.py +++ b/main.py @@ -17,16 +17,12 @@ if __name__ == '__main__': pool = MySQLConnectionPool() Thread = FindThread(TargetImageHash, pool) Thread.start() - os._exit(0) elif type == 2: while baseArr <= TargetRange[1]: Thread = ByNetFindThread(TargetImageHash, baseArr) Thread.start() baseArr += 1 - sleep(1) - os._exit(0) - elif type == 3: pool = MySQLConnectionPool() @@ -34,4 +30,3 @@ if __name__ == '__main__': Thread = UploadThread(baseArr, pool) Thread.start() baseArr += 1 - os._exit(0)