From 514bf213c374499e5b003140c9619fabecb8f6a0 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Wed, 2 Apr 2025 20:06:20 +0800 Subject: [PATCH 01/11] =?UTF-8?q?fix(configs):=20=E6=9B=B4=E6=96=B0jm=5Fco?= =?UTF-8?q?nfig.yml=E4=B8=8B=E8=BD=BD=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/configs/jm_config.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/configs/jm_config.yml b/src/configs/jm_config.yml index 662e77b..508aead 100644 --- a/src/configs/jm_config.yml +++ b/src/configs/jm_config.yml @@ -1,3 +1,12 @@ dir_rule: base_dir: src\resources\image\jm rule: Bd_Pname + +# 下载配置 +download: + cache: true # 如果要下载的文件在磁盘上已存在,不用再下一遍了吧?默认为true + image: + decode: true # JM的原图是混淆过的,要不要还原?默认为true + suffix: .jpg # 把图片都转为.jpg格式,默认为null,表示不转换。 + threading: + photo: 5 From 1830d49d88bc99868395658a9cf5d60e333a0430 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Wed, 2 Apr 2025 19:07:20 +0800 Subject: [PATCH 02/11] =?UTF-8?q?feat(configs):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=B0=B7=E6=AD=8C=E5=92=8CQQ=E9=82=AE=E7=AE=B1=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/configs/api_config_example.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/configs/api_config_example.py b/src/configs/api_config_example.py index be097d8..6f62abc 100644 --- a/src/configs/api_config_example.py +++ b/src/configs/api_config_example.py @@ -1,5 +1,17 @@ app_id="" bot_account= "" +""" +谷歌邮箱配置 +""" +google_smtp_server = "smtp.gmail.com" +google_email ="xxxxxx@gmail.com" +google_password = "1234567891234567" #16位应用码 +""" +qq 邮箱配置 +""" +qq_smtp_server = "smtp.qq.com" +qq_email = "xxxxxxxxxx@qq.com" +qq_password = "123456789123456789" #应用码 """ 图床配置 From 9297f9cab77fb1d5fe944495a171ba4cfbed5efd Mon Sep 17 00:00:00 2001 From: Miyokiss Date: Thu, 3 Apr 2025 05:07:51 +0800 Subject: [PATCH 03/11] =?UTF-8?q?feat(jm=5Fdownload):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81=E4=B8=8B=E8=BD=BD=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 +++- src/clover_jm/disguise_pdf.py | 10 +++-- src/clover_jm/jm_comic.py | 54 +++++++++++++++++++++-- src/configs/api_config_example.py | 13 +++++- src/configs/jm_config.yml | 2 +- src/plugins/jm_download.py | 56 ++++++++++++++++++------ src/providers/cloud_file_api/anonfile.py | 48 ++++++++++++++++++++ 7 files changed, 169 insertions(+), 22 deletions(-) create mode 100644 src/providers/cloud_file_api/anonfile.py diff --git a/.gitignore b/.gitignore index d5938c6..757fcae 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,10 @@ bili.cookie src/clover_lightnovel/wenku8.cookie src/clover_lightnovel/output1.html *.pyc -/src/resources/image/jm/* \ No newline at end of file +/src/resources/image/jm/* + + +Elysia +runtime +/src/configs/tts +bot.pid \ No newline at end of file diff --git a/src/clover_jm/disguise_pdf.py b/src/clover_jm/disguise_pdf.py index 9d5bc0f..65dd1fe 100644 --- a/src/clover_jm/disguise_pdf.py +++ b/src/clover_jm/disguise_pdf.py @@ -4,7 +4,9 @@ import zipfile from pathlib import Path from PIL import Image from natsort import natsorted +from nonebot import logger +__name__ = "cliver_jm | disguise_pdf" async def webp_to_pdf(input_folder, output_pdf): """ @@ -17,7 +19,8 @@ async def webp_to_pdf(input_folder, output_pdf): ) if not webp_files: - print("未找到WebP图片") + logger.error("未找到WebP图片") + return False images = [] for webp_file in webp_files: @@ -31,10 +34,10 @@ async def webp_to_pdf(input_folder, output_pdf): else: images.append(img.convert('RGB')) except Exception as e: - print(f"处理失败 {webp_file}: {e}") + logger.error(f"处理失败 {webp_file}: {e}") if not images: - print("无有效图片") + logger.error("无有效图片") images[0].save( output_pdf, @@ -43,6 +46,7 @@ async def webp_to_pdf(input_folder, output_pdf): optimize=True, quality=80 ) + return True async def batch_convert_subfolders(base_dir,output_dir): """ diff --git a/src/clover_jm/jm_comic.py b/src/clover_jm/jm_comic.py index 13253a1..c833441 100644 --- a/src/clover_jm/jm_comic.py +++ b/src/clover_jm/jm_comic.py @@ -1,16 +1,23 @@ import yaml +import uuid import jmcomic +from nonebot import logger +from datetime import datetime +from src.configs.api_config import qrserver_url,qrserver_size from src.clover_jm.disguise_pdf import * from concurrent.futures import ThreadPoolExecutor from src.configs.path_config import jm_path,jm_config_path +from src.providers.cloud_file_api import anonfile from src.clover_image.delete_file import delete_folder,delete_file from src.clover_email.send_email import send_email_by_google,send_email_by_qq +__name__ = "clover | jm_comic" + # 创建线程池 jm_executor = ThreadPoolExecutor(max_workers=5) jm_executor.submit(lambda: None).result() -async def download_jm(album_id: str| None,receiver_email: str| None): +async def download_jm_Pemail(album_id: str| None,receiver_email: str| None): # 修改配置文件的下载路径 source_path = await get_jm_config(receiver_email) option = jmcomic.JmOption.from_file(jm_config_path) @@ -40,13 +47,54 @@ async def download_jm(album_id: str| None,receiver_email: str| None): await delete_file(zip_path) return "发送邮件失败,请重试!" +async def download_jm_qr(album_id: str| None): + # 修改配置文件的下载路径 + file_name = f"JM-{album_id}-{datetime.now().date()}@{uuid.uuid4().hex}" + source_path = await get_jm_config(file_name) + option = jmcomic.JmOption.from_file(jm_config_path) + # 还原配置文件 + await recover_jm_config(source_path) + #调用JM下载api + album_detail,downloader = await asyncio.get_event_loop().run_in_executor(jm_executor,jmcomic.download_album,album_id,option) + logger.debug(f"JM下载api调用成功,返回————>{album_detail}") + if album_detail.title is None: + return { + "msg":"下载失败,请检查JM ID 是否正确" + } + # 创建变量 + folder_path = f"{jm_path}{album_detail.title}" + pdf_path = f"{jm_path}{file_name}.pdf" + # 转为pdf + pdf_status = await webp_to_pdf(folder_path,pdf_path) + if not pdf_status: + await delete_folder(folder_path) + return { + "msg":"PDF转换失败" + } + # 发送文件 + send_status = await anonfile.upload_file(pdf_path) + if send_status["success"]== "true": + file_code=send_status["code"] + # 删除文件 + await delete_folder(pdf_path) + await delete_folder(folder_path) + return { + "msg":"获取成功~!码上下载!~", + "qr_code": f"{qrserver_url}?size={qrserver_size}&data={file_code}" + } + else: + await delete_folder(pdf_path) + await delete_folder(folder_path) + return { + "msg":"发送失败,请重试!" + } -async def get_jm_config(receiver_email: str): +async def get_jm_config(file_name: str): with open(jm_config_path, 'r', encoding='utf-8') as f: config = yaml.safe_load(f) source_path = config['dir_rule']['base_dir'] - new_base_dir = str(Path(source_path) / receiver_email) + new_base_dir = str(Path(source_path) / file_name) config['dir_rule']['base_dir'] = new_base_dir with open(jm_config_path, 'w', encoding='utf-8') as f: yaml.dump(config, f, sort_keys=False, allow_unicode=True) diff --git a/src/configs/api_config_example.py b/src/configs/api_config_example.py index 6f62abc..17ed27d 100644 --- a/src/configs/api_config_example.py +++ b/src/configs/api_config_example.py @@ -52,4 +52,15 @@ wenku8_password = "" """ 多米HTTP代理api """ -proxy_api = "" \ No newline at end of file +proxy_api = "" + +""" +二维码生成 API 参数 +""" +qrserver_url = "https://api.qrserver.com/v1/create-qr-code/" +qrserver_size= "200x200" + +""" +anonfile API 参数 +""" +anonfile_download_url = "https://anonfile.io/api/download/" \ No newline at end of file diff --git a/src/configs/jm_config.yml b/src/configs/jm_config.yml index 508aead..b13df87 100644 --- a/src/configs/jm_config.yml +++ b/src/configs/jm_config.yml @@ -7,6 +7,6 @@ download: cache: true # 如果要下载的文件在磁盘上已存在,不用再下一遍了吧?默认为true image: decode: true # JM的原图是混淆过的,要不要还原?默认为true - suffix: .jpg # 把图片都转为.jpg格式,默认为null,表示不转换。 + suffix: null # 把图片都转为.jpg格式,默认为null,表示不转换。 threading: photo: 5 diff --git a/src/plugins/jm_download.py b/src/plugins/jm_download.py index 7c580cd..d472080 100644 --- a/src/plugins/jm_download.py +++ b/src/plugins/jm_download.py @@ -1,24 +1,54 @@ import re +from nonebot import logger from nonebot.rule import to_me from nonebot.plugin import on_command -from nonebot.adapters.qq import MessageEvent -from src.clover_jm.jm_comic import download_jm +from nonebot.adapters.qq import MessageEvent, MessageSegment,Message +from src.clover_jm.jm_comic import download_jm_qr, download_jm_Pemail +from nonebot.exception import FinishedException + +__name__ = "JM_Download" + +jm = on_command("jm", rule=to_me(), priority=10, block=False) + +async def handle_email_download(album_id: str, email: str): + """处理邮箱发送逻辑""" + logger.debug(f"开始发送文件到邮箱,ID: {album_id}, 邮箱: {email}") + if not validate_email(email): + await jm.finish("邮箱格式不正确!") + await jm.send("正在发送中,请稍等~") + msg = await download_jm_Pemail(album_id=album_id, receiver_email=email) + await jm.finish(msg) + +async def handle_qrcode_download(album_id: str): + """处理二维码发送载逻辑""" + logger.debug(f"开始二维码逻辑,ID: {album_id}") + await jm.send("正在下载中,请稍等~") + msgs = await download_jm_qr(album_id=album_id) + if "qr_code" not in msgs: + await jm.finish(msgs["msg"]) + msg = Message([ + MessageSegment.text(msgs["msg"]), + MessageSegment.image(msgs["qr_code"]) + ]) + await jm.finish(msg) -jm = on_command("jm", rule=to_me(), priority=10,block=False) @jm.handle() async def handle_function(message: MessageEvent): - values = message.get_plaintext().replace("/jm", "").split(" ") - if 3 > len(values) > 4: - await jm.finish("请输入正确的格式 /jm+id 或 /jm+id+邮箱号") - else: - if not validate_email(values[2]): - await jm.finish("邮箱格式不正确!") - - await jm.send("正在发送中,请稍等~") - msg = await download_jm(album_id = values[1],receiver_email = values[2]) - await jm.finish(msg) + try: + if len(values) == 2: + await handle_qrcode_download(values[1]) + elif len(values) == 3: + await handle_email_download(values[1], values[2]) + else: + logger.debug("输入格式不正确") + await jm.finish("请输入正确的格式 /jm+id 或 /jm+id+邮箱号") + except Exception as e: + if isinstance(e, FinishedException): + return + logger.error(f"处理请求时发生错误: {e}") + await jm.finish("处理请求时发生错误,请稍后重试") def validate_email(email: str) -> bool: """验证邮箱格式是否合法""" diff --git a/src/providers/cloud_file_api/anonfile.py b/src/providers/cloud_file_api/anonfile.py new file mode 100644 index 0000000..1f38880 --- /dev/null +++ b/src/providers/cloud_file_api/anonfile.py @@ -0,0 +1,48 @@ +import requests +from nonebot import logger + +__name__ = 'Anonfile Api' + +async def upload_file(file_path): + """ + ### 上传文件到anonfile并返回 \n + :param file_path: 上传文件路径 + :return: {\n + "success": true,\n + "code": "文件码",\n + "message": "File uploaded successfully",\n + "isProtected": fales\n + } + ### GET获取文件信息: + https://anonfile.io/f/{ 文件码 } + + ### GET下载文件: + https://anonfile.io/api/download/{ 文件码 } + """ + try: + # 创建Data对象并添加文件 + files = {'file': open(file_path, 'rb')} + + upload_settings = { + 'password': '', # 密码 + 'expiryDays': 7, # 过期天数 7、30 + } + + # 如果设置了密码和过期天数,则添加到Data中 + data = {} + if upload_settings['password']: + data['password'] = upload_settings['password'] + data['expiryDays'] = str(upload_settings['expiryDays']) + + # 发送上传请求 + response = requests.post('https://anonfile.io/api/upload', files=files, data=data) + + # 检查响应状态码 + if response.status_code == 200: + return response.json() + else: + logger.error('Upload failed:', response.status_code, response.text) + + except Exception as error: + # 捕获并处理上传过程中的错误 + logger.error('Upload error:', error) \ No newline at end of file From e06e328aafccb5d86fbd6bcf4a78ec2518c36f70 Mon Sep 17 00:00:00 2001 From: Miyokiss Date: Thu, 3 Apr 2025 05:11:35 +0800 Subject: [PATCH 04/11] =?UTF-8?q?feat(jm=5Fcomic):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81=E4=B8=8B=E8=BD=BD=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_jm/jm_comic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clover_jm/jm_comic.py b/src/clover_jm/jm_comic.py index c833441..0dd079c 100644 --- a/src/clover_jm/jm_comic.py +++ b/src/clover_jm/jm_comic.py @@ -3,7 +3,7 @@ import uuid import jmcomic from nonebot import logger from datetime import datetime -from src.configs.api_config import qrserver_url,qrserver_size +from src.configs.api_config import qrserver_url,qrserver_size,anonfile_download_url from src.clover_jm.disguise_pdf import * from concurrent.futures import ThreadPoolExecutor from src.configs.path_config import jm_path,jm_config_path @@ -80,7 +80,7 @@ async def download_jm_qr(album_id: str| None): await delete_folder(folder_path) return { "msg":"获取成功~!码上下载!~", - "qr_code": f"{qrserver_url}?size={qrserver_size}&data={file_code}" + "qr_code": f"{qrserver_url}?size={qrserver_size}&data={anonfile_download_url}{file_code}" } else: await delete_folder(pdf_path) From b4a6e25aaf3dcf3f03d2c172a5060d3ddcb22f3c Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Thu, 3 Apr 2025 09:49:05 +0800 Subject: [PATCH 05/11] =?UTF-8?q?fix(config):=20=E9=99=8D=E4=BD=8E?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=B8=8B=E8=BD=BD=E7=BA=BF=E7=A8=8B=E6=95=B0?= =?UTF-8?q?=E4=BB=8E5=E5=88=B02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_jm/jm_comic.py | 2 +- src/configs/jm_config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clover_jm/jm_comic.py b/src/clover_jm/jm_comic.py index 13253a1..3dcb01c 100644 --- a/src/clover_jm/jm_comic.py +++ b/src/clover_jm/jm_comic.py @@ -7,7 +7,7 @@ from src.clover_image.delete_file import delete_folder,delete_file from src.clover_email.send_email import send_email_by_google,send_email_by_qq # 创建线程池 -jm_executor = ThreadPoolExecutor(max_workers=5) +jm_executor = ThreadPoolExecutor(max_workers=2) jm_executor.submit(lambda: None).result() async def download_jm(album_id: str| None,receiver_email: str| None): diff --git a/src/configs/jm_config.yml b/src/configs/jm_config.yml index 508aead..d3692c2 100644 --- a/src/configs/jm_config.yml +++ b/src/configs/jm_config.yml @@ -9,4 +9,4 @@ download: decode: true # JM的原图是混淆过的,要不要还原?默认为true suffix: .jpg # 把图片都转为.jpg格式,默认为null,表示不转换。 threading: - photo: 5 + photo: 1 From a34c9f0bd2df8836460188810409e8355653f984 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Thu, 3 Apr 2025 14:21:55 +0800 Subject: [PATCH 06/11] =?UTF-8?q?fix(send=5Femail):=20=E6=9B=BF=E6=8D=A2pr?= =?UTF-8?q?int=E4=B8=BAlogger=E8=AE=B0=E5=BD=95=E9=94=99=E8=AF=AF=E6=97=A5?= =?UTF-8?q?=E5=BF=97=20refactor(jm=5Fcomic):=20=E4=BC=98=E5=8C=96=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=A4=84=E7=90=86=E5=B9=B6=E7=A7=BB=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E6=97=A5=E5=BF=97=20refactor(jm=5Fdownload):=20?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E8=BE=93=E5=85=A5=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E7=A7=BB=E9=99=A4=E8=B0=83=E8=AF=95=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_email/send_email.py | 10 +++++----- src/clover_jm/jm_comic.py | 10 +++++----- src/plugins/jm_download.py | 16 ++++++---------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/clover_email/send_email.py b/src/clover_email/send_email.py index badf441..88564ba 100644 --- a/src/clover_email/send_email.py +++ b/src/clover_email/send_email.py @@ -3,6 +3,7 @@ from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from email.mime.text import MIMEText import aiosmtplib +from nonebot import logger from src.configs.api_config import google_smtp_server,google_email,google_password from src.configs.api_config import qq_smtp_server,qq_email,qq_password @@ -123,7 +124,7 @@ async def send_email_by_google(receiver_email: str, file_path: str): try: # 验证文件存在性 if not os.path.isfile(file_path): - print(f"文件不存在:{file_path}") + logger.error(f"文件不存在:{file_path}") return False # 添加单个文件附件 @@ -145,11 +146,10 @@ async def send_email_by_google(receiver_email: str, file_path: str): ) as server: await server.login(google_email, google_password) await server.send_message(msg) - print("文件邮件发送成功!") return True except Exception as e: - print(f"邮件发送失败: {str(e)}") + logger.error(f"邮件发送失败:{e}") return False async def send_email_by_qq(receiver_email: str, file_path: str): @@ -162,7 +162,7 @@ async def send_email_by_qq(receiver_email: str, file_path: str): try: if not os.path.exists(file_path): - print(f"文件不存在:{file_path}") + logger.error(f"文件不存在:{file_path}") return False # 添加附件 @@ -187,5 +187,5 @@ async def send_email_by_qq(receiver_email: str, file_path: str): print("QQ文件邮件发送成功!") return True except Exception as e: - print(f"QQ邮件发送失败: {str(e)}") + logger.error(f"QQ邮件发送失败:{e}") return False diff --git a/src/clover_jm/jm_comic.py b/src/clover_jm/jm_comic.py index 8a03e86..675f48c 100644 --- a/src/clover_jm/jm_comic.py +++ b/src/clover_jm/jm_comic.py @@ -1,7 +1,6 @@ import yaml import uuid import jmcomic -from nonebot import logger from datetime import datetime from src.configs.api_config import qrserver_url,qrserver_size,anonfile_download_url from src.clover_jm.disguise_pdf import * @@ -24,9 +23,11 @@ async def download_jm_Pemail(album_id: str| None,receiver_email: str| None): # 还原配置文件 await recover_jm_config(source_path) #调用JM下载api - album_detail,downloader = await asyncio.get_event_loop().run_in_executor(jm_executor,jmcomic.download_album,album_id,option) - if album_detail.title is None: - return "下载失败,请检查JM ID 是否正确" + try: + album_detail,downloader = await asyncio.get_event_loop().run_in_executor(jm_executor,jmcomic.download_album,album_id,option) + except Exception as e: + logger.error(f"下载失败 :{e}") + return "下载失败,请重试" # 创建变量 folder_path = f"{jm_path}{receiver_email}" zip_path = f"{jm_path}{album_detail.title}.zip" @@ -56,7 +57,6 @@ async def download_jm_qr(album_id: str| None): await recover_jm_config(source_path) #调用JM下载api album_detail,downloader = await asyncio.get_event_loop().run_in_executor(jm_executor,jmcomic.download_album,album_id,option) - logger.debug(f"JM下载api调用成功,返回————>{album_detail}") if album_detail.title is None: return { "msg":"下载失败,请检查JM ID 是否正确" diff --git a/src/plugins/jm_download.py b/src/plugins/jm_download.py index d472080..83bd270 100644 --- a/src/plugins/jm_download.py +++ b/src/plugins/jm_download.py @@ -12,7 +12,6 @@ jm = on_command("jm", rule=to_me(), priority=10, block=False) async def handle_email_download(album_id: str, email: str): """处理邮箱发送逻辑""" - logger.debug(f"开始发送文件到邮箱,ID: {album_id}, 邮箱: {email}") if not validate_email(email): await jm.finish("邮箱格式不正确!") await jm.send("正在发送中,请稍等~") @@ -21,7 +20,6 @@ async def handle_email_download(album_id: str, email: str): async def handle_qrcode_download(album_id: str): """处理二维码发送载逻辑""" - logger.debug(f"开始二维码逻辑,ID: {album_id}") await jm.send("正在下载中,请稍等~") msgs = await download_jm_qr(album_id=album_id) if "qr_code" not in msgs: @@ -34,16 +32,14 @@ async def handle_qrcode_download(album_id: str): @jm.handle() async def handle_function(message: MessageEvent): - values = message.get_plaintext().replace("/jm", "").split(" ") - + values = message.get_plaintext().replace("/jm", "").split() try: - if len(values) == 2: - await handle_qrcode_download(values[1]) - elif len(values) == 3: - await handle_email_download(values[1], values[2]) - else: - logger.debug("输入格式不正确") + if len(values) == 0 or not all(values[1:len(values)]): await jm.finish("请输入正确的格式 /jm+id 或 /jm+id+邮箱号") + elif len(values) == 1: + await handle_qrcode_download(values[0]) + elif len(values) == 2: + await handle_email_download(values[0], values[1]) except Exception as e: if isinstance(e, FinishedException): return From beaae14a0b46a2f634e4c8b316ea11a4b37e6838 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Thu, 3 Apr 2025 16:11:47 +0800 Subject: [PATCH 07/11] =?UTF-8?q?fix(providers):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=90=8D=E7=A7=B0providers=E6=94=B9=E4=B8=BA?= =?UTF-8?q?clover=5Fproviders=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(jm_comic): 更新anonfile模块导入路径 --- src/clover_jm/jm_comic.py | 2 +- src/{providers => clover_providers}/cloud_file_api/anonfile.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/{providers => clover_providers}/cloud_file_api/anonfile.py (100%) diff --git a/src/clover_jm/jm_comic.py b/src/clover_jm/jm_comic.py index 675f48c..9ab2e9c 100644 --- a/src/clover_jm/jm_comic.py +++ b/src/clover_jm/jm_comic.py @@ -6,7 +6,7 @@ from src.configs.api_config import qrserver_url,qrserver_size,anonfile_download_ from src.clover_jm.disguise_pdf import * from concurrent.futures import ThreadPoolExecutor from src.configs.path_config import jm_path,jm_config_path -from src.providers.cloud_file_api import anonfile +from src.clover_providers.cloud_file_api import anonfile from src.clover_image.delete_file import delete_folder,delete_file from src.clover_email.send_email import send_email_by_google,send_email_by_qq diff --git a/src/providers/cloud_file_api/anonfile.py b/src/clover_providers/cloud_file_api/anonfile.py similarity index 100% rename from src/providers/cloud_file_api/anonfile.py rename to src/clover_providers/cloud_file_api/anonfile.py From a7c194a7d4a85ff5359123f89378c52dfb8ae004 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Fri, 4 Apr 2025 18:55:46 +0800 Subject: [PATCH 08/11] =?UTF-8?q?chore(.gitignore):=20=E6=B7=BB=E5=8A=A0jm?= =?UTF-8?q?=5Fconfig.yml=E5=88=B0=E5=BF=BD=E7=95=A5=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 757fcae..4217170 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ bili.cookie *.mp4 /bili.cookie /src/configs/api_config.py +/src/configs/jm_config.yml /src/resources/temp /update_remote_code.py /src/resources/image/report/* From 79293219bc728c4a27247b458743883acdb70876 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Tue, 8 Apr 2025 11:08:25 +0800 Subject: [PATCH 09/11] =?UTF-8?q?fix(jm=5Fcomic):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=B7=A5=E4=BD=9C=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=95=B0=E8=87=B35?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clover_jm/jm_comic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clover_jm/jm_comic.py b/src/clover_jm/jm_comic.py index 9ab2e9c..dd8493f 100644 --- a/src/clover_jm/jm_comic.py +++ b/src/clover_jm/jm_comic.py @@ -13,7 +13,7 @@ from src.clover_email.send_email import send_email_by_google,send_email_by_qq __name__ = "clover | jm_comic" # 创建线程池 -jm_executor = ThreadPoolExecutor(max_workers=2) +jm_executor = ThreadPoolExecutor(max_workers=5) jm_executor.submit(lambda: None).result() async def download_jm_Pemail(album_id: str| None,receiver_email: str| None): From e22bb909d539b14af4fdb2996168ab49951c5678 Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Tue, 8 Apr 2025 16:14:56 +0800 Subject: [PATCH 10/11] =?UTF-8?q?fix(cloud=5Fmusic):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=85=A8=E5=B1=80=E4=BA=8C=E7=BB=B4=E7=A0=81?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E5=AF=BC=E8=87=B4=E7=AC=AC=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E5=8F=8A=E5=85=B6=E4=B9=8B=E5=90=8E=E7=94=9F=E6=88=90=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 增加unikey缓存机制避免频繁生成二维码 2. 优化登录状态检查流程 --- src/clover_music/cloud_music/cloud_music.py | 18 ++--- src/plugins/cloud_music.py | 86 ++++++++++++--------- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/src/clover_music/cloud_music/cloud_music.py b/src/clover_music/cloud_music/cloud_music.py index 1541eba..f941d2e 100644 --- a/src/clover_music/cloud_music/cloud_music.py +++ b/src/clover_music/cloud_music/cloud_music.py @@ -62,7 +62,7 @@ def get_music(id): """ save_path = os.getcwd()+'/src/clover_music/netease_music' os.makedirs(save_path, exist_ok=True) -qrcode_path = os.getcwd()+'/src/clover_music' +qrcode_path = os.getcwd()+'/src/clover_music/' # 判断cookie是否有效 @@ -112,8 +112,6 @@ async def get_qr_key(session): else: return None -# 创建 QRCode 对象 -qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) # 生成二维码 async def create_qr_code(unikey): """ @@ -124,14 +122,12 @@ async def create_qr_code(unikey): Returns: """ - # 添加数据 - png_url = f"http://music.163.com/login?codekey={unikey}" - qr.add_data(png_url) - img = qr.make_image() - a = BytesIO() - img.save(a, 'png') - img.save(os.path.join(qrcode_path, 'qrcode.png')) - return qrcode_path + '/qrcode.png' + qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4) + qr.add_data(f"https://music.163.com/login?codekey={unikey}") + #保存二维码 + img_path = os.path.join(qrcode_path, 'qrcode.png') + qr.make_image().save(img_path) + return img_path # 检查二维码状态是否被扫描 async def check_qr_code(unikey,session): diff --git a/src/plugins/cloud_music.py b/src/plugins/cloud_music.py index c999efc..4a2505a 100644 --- a/src/plugins/cloud_music.py +++ b/src/plugins/cloud_music.py @@ -8,15 +8,18 @@ from nonebot.adapters.qq import MessageSegment,MessageEvent from src.clover_music.cloud_music.cloud_music import * from src.clover_image.delete_file import delete_file +unikey_cache = {'unikey': None, 'expires': 0} + music = on_command("点歌", rule=to_me(), priority=10,block=False) @music.handle() async def handle_function(msg: MessageEvent): + qr_path = "" keyword = msg.get_plaintext().replace("/点歌", "").strip(" ") if keyword == "": await music.finish("\n请输入“/点歌+歌曲名”喔🎶") - #获取登录信息 可以获取更换高音质 + #获取登录信息 session = requests.session() if not os.path.exists('cloud_music_cookies.cookie'): with open('cloud_music_cookies.cookie', 'wb') as f: @@ -26,47 +29,56 @@ async def handle_function(msg: MessageEvent): session, status,user_id = await netease_cloud_music_is_login(session) if not status: await music.send("登录失效,请联系管理员进行登录") - unikey = await get_qr_key(session) - path = await create_qr_code(unikey) - - """是否要发送到QQ上面登录 """ - # await clover_music.send(MessageSegment.file_image(Path(path))) - """是否要发送到QQ上面登录 """ - while True: - code = await check_qr_code(unikey, session) - if '801' in str(code): - print('二维码未失效,请扫码!') - elif '802' in str(code): - print('已扫码,请确认!') - elif '803' in str(code): - print('已确认,登入成功!') - break - else: - break - await asyncio.sleep(2) + current_time = time.time() + # 检查缓存是否有效(二维码有效期5分钟) + if unikey_cache['unikey'] and current_time < unikey_cache['expires']: + unikey = unikey_cache['unikey'] + else: + # 获取新 unikey 并设置过期时间 + unikey = await get_qr_key(session) + unikey_cache.update({ + 'unikey': unikey, + 'expires': current_time + 300 # 大约是5分钟有效期 失效时间会有几秒误差 + }) + qr_path = await create_qr_code(unikey) + """是否要发送到QQ上面登录 """ + # await clover_music.send(MessageSegment.file_image(Path(path))) + """是否要发送到QQ上面登录 """ + while True: + code = await check_qr_code(unikey, session) + if '801' in str(code): + print('二维码未失效,请扫码!') + elif '802' in str(code): + print('已扫码,请确认!') + elif '803' in str(code): + print('已确认,登入成功!') + break + else: + print('二维码失效,请重获取!') + break + await asyncio.sleep(5) with open('cloud_music_cookies.cookie', 'wb') as f: pickle.dump(session.cookies, f) - - #搜索歌曲 - song_id,song_name,singer,song_url = await netease_music_search(keyword,session) - song_name = str(song_name).replace(".", "·").replace("/", "、") - if song_id is None: - await music.finish("\n没有找到歌曲,或检索到的歌曲均为付费喔qwq\n这绝对不是我的错,绝对不是!") else: - await music.send(MessageSegment.text(f" 来源:网易云音乐\n歌曲:{song_name} - {singer}\n请稍等喔🎵")) - #返回转换后的歌曲路径 - output_silk_path = await netease_music_download(song_id, song_name, singer,session) - - if output_silk_path == -1: - await music.send("歌曲音频获取失败:登录信息失效。") - elif output_silk_path is None: - await music.send("歌曲音频获取失败了Σヽ(゚Д ゚; )ノ,请重试。") + #搜索歌曲 + song_id,song_name,singer,song_url = await netease_music_search(keyword,session) + song_name = str(song_name).replace(".", "·").replace("/", "、") + if song_id is None: + await music.finish("\n没有找到歌曲,或检索到的歌曲均为付费喔qwq\n这绝对不是我的错,绝对不是!") else: - await music.send(MessageSegment.file_audio(Path(output_silk_path))) + await music.send(MessageSegment.text(f" 来源:网易云音乐\n歌曲:{song_name} - {singer}\n请稍等喔🎵")) + #返回转换后的歌曲路径 + output_silk_path = await netease_music_download(song_id, song_name, singer,session) - #删除临时文件 - await delete_file(output_silk_path) - await music.finish() + if output_silk_path == -1: + await music.send("歌曲音频获取失败:登录信息失效。") + elif output_silk_path is None: + await music.send("歌曲音频获取失败了Σヽ(゚Д ゚; )ノ,请重试。") + else: + await music.send(MessageSegment.file_audio(Path(output_silk_path))) + #删除临时文件 + await delete_file(output_silk_path) + await music.finish() From b79e19b7a0ac1b643668ecf6d6276510c1bca8db Mon Sep 17 00:00:00 2001 From: SlyAimer <2289782085@qq.com> Date: Tue, 8 Apr 2025 17:10:30 +0800 Subject: [PATCH 11/11] =?UTF-8?q?refactor(cloud=5Fmusic):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BA=8C=E7=BB=B4=E7=A0=81=E7=99=BB=E5=BD=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 用循环替换无限循环,限制最大等待时间 2. 简化了二维码状态检查逻辑,减少了冗余的条件判断 --- src/plugins/cloud_music.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/plugins/cloud_music.py b/src/plugins/cloud_music.py index 4a2505a..385483c 100644 --- a/src/plugins/cloud_music.py +++ b/src/plugins/cloud_music.py @@ -29,32 +29,25 @@ async def handle_function(msg: MessageEvent): session, status,user_id = await netease_cloud_music_is_login(session) if not status: await music.send("登录失效,请联系管理员进行登录") - current_time = time.time() # 检查缓存是否有效(二维码有效期5分钟) - if unikey_cache['unikey'] and current_time < unikey_cache['expires']: + if unikey_cache['unikey'] and time.time() < unikey_cache['expires']: unikey = unikey_cache['unikey'] else: # 获取新 unikey 并设置过期时间 unikey = await get_qr_key(session) unikey_cache.update({ 'unikey': unikey, - 'expires': current_time + 300 # 大约是5分钟有效期 失效时间会有几秒误差 + 'expires': time.time() + 300 # 大约是5分钟有效期 失效时间会有几秒误差 }) qr_path = await create_qr_code(unikey) """是否要发送到QQ上面登录 """ # await clover_music.send(MessageSegment.file_image(Path(path))) """是否要发送到QQ上面登录 """ - while True: + for _ in range(60): # 限制最大等待时间5分钟(300秒/5秒间隔) code = await check_qr_code(unikey, session) - if '801' in str(code): - print('二维码未失效,请扫码!') - elif '802' in str(code): - print('已扫码,请确认!') - elif '803' in str(code): - print('已确认,登入成功!') - break - else: - print('二维码失效,请重获取!') + if code in (803,): break # 成功状态 + if code not in (801, 802): + print('二维码失效' if code == 800 else f'异常状态码:{code}') break await asyncio.sleep(5) with open('cloud_music_cookies.cookie', 'wb') as f: