fix: mult file send

This commit is contained in:
xtaodada 2023-08-07 13:55:43 +08:00
parent d2490de6c1
commit 3c560c934b
Signed by: xtaodada
GPG Key ID: 4CBB3F4FA8C85659
2 changed files with 48 additions and 59 deletions

View File

@ -1,6 +1,6 @@
from httpx import URL, InvalidURL from httpx import URL, InvalidURL, AsyncClient
from init import request from init import headers
def get_host(url: str) -> str: def get_host(url: str) -> str:
@ -15,10 +15,11 @@ async def check_host(host: str) -> bool:
if not host: if not host:
return False return False
try: try:
req = await request.get(f"https://{host}/.well-known/nodeinfo") async with AsyncClient(timeout=60, headers=headers) as request:
req.raise_for_status() req = await request.get(f"https://{host}/.well-known/nodeinfo")
node_url = req.json()["links"][0]["href"] req.raise_for_status()
req = await request.get(node_url) node_url = req.json()["links"][0]["href"]
req = await request.get(node_url)
req.raise_for_status() req.raise_for_status()
data = req.json() data = req.json()
if data["software"]["name"] != "misskey": if data["software"]["name"] != "misskey":

View File

@ -1,13 +1,15 @@
import contextlib import contextlib
import re import re
from asyncio import sleep
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from typing import Optional, List from typing import Optional, List
import aiofiles as aiofiles import aiofiles as aiofiles
from httpx import AsyncClient
from mipac import Note, File from mipac import Note, File
from mipac.models.lite import LiteUser from mipac.models.lite import LiteUser
from pyrogram.enums import ParseMode from pyrogram.enums import ParseMode
from pyrogram.errors import MediaEmpty from pyrogram.errors import MediaEmpty, FloodWait
from pyrogram.types import ( from pyrogram.types import (
InlineKeyboardMarkup, InlineKeyboardMarkup,
InlineKeyboardButton, InlineKeyboardButton,
@ -19,7 +21,7 @@ from pyrogram.types import (
) )
from defs.image import webp_to_png from defs.image import webp_to_png
from init import bot, request from init import bot, logs, headers
from models.services.scheduler import add_delete_file_job, delete_file from models.services.scheduler import add_delete_file_job, delete_file
at_parse = re.compile(r"(?<!\S)@(\S+)\s") at_parse = re.compile(r"(?<!\S)@(\S+)\s")
@ -118,6 +120,18 @@ def get_content(host: str, note: Note) -> str:
点赞: {sum(show_note.reactions.values())} | 回复: {show_note.replies_count} | 转发: {show_note.renote_count}""" 点赞: {sum(show_note.reactions.values())} | 回复: {show_note.replies_count} | 转发: {show_note.renote_count}"""
def retry(func):
async def wrapper(*args, **kwargs):
try:
return await func(*args, **kwargs)
except FloodWait as e:
await sleep(e.value + 1)
return await func(*args, **kwargs)
return wrapper
@retry
async def send_text( async def send_text(
host: str, cid: int, note: Note, reply_to_message_id: int, show_second: bool host: str, cid: int, note: Note, reply_to_message_id: int, show_second: bool
) -> Message: ) -> Message:
@ -149,7 +163,9 @@ async def fetch_document(file: File) -> Optional[str]:
return file_url return file_url
if not file_url: if not file_url:
return file_url return file_url
req = await request.get(file_url) logs.info(f"下载远程文件:{file_url}")
async with AsyncClient(timeout=60.0, headers=headers) as request:
req = await request.get(file_url)
if req.status_code != 200: if req.status_code != 200:
return file_url return file_url
if file_name.lower().endswith(".webp"): if file_name.lower().endswith(".webp"):
@ -163,6 +179,7 @@ async def fetch_document(file: File) -> Optional[str]:
return file_name return file_name
@retry
@deprecated_to_text @deprecated_to_text
async def send_photo( async def send_photo(
host: str, host: str,
@ -185,6 +202,7 @@ async def send_photo(
) )
@retry
@deprecated_to_text @deprecated_to_text
async def send_video( async def send_video(
host: str, host: str,
@ -207,6 +225,7 @@ async def send_video(
) )
@retry
@deprecated_to_text @deprecated_to_text
async def send_audio( async def send_audio(
host: str, host: str,
@ -229,6 +248,7 @@ async def send_audio(
) )
@retry
@deprecated_to_text @deprecated_to_text
async def send_document( async def send_document(
host: str, host: str,
@ -257,7 +277,7 @@ async def send_document(
async def get_media_group(files: list[File]) -> list: async def get_media_group(files: list[File]) -> list:
media_lists = [] media_lists = []
for file_ in files: for file_ in files:
file_url = file_.url file_url = await fetch_document(file_)
if not file_url: if not file_url:
continue continue
file_type = file_.type file_type = file_.type
@ -292,6 +312,20 @@ async def get_media_group(files: list[File]) -> list:
return media_lists return media_lists
@retry
async def send_media_group(cid: int, groups: list):
return await bot.send_media_group(cid, groups)
async def send_group_msg(cid: int, groups: list):
msgs = []
for i in range(0, len(groups), 10):
msg = await send_media_group(cid, groups[i : i + 10])
msgs.extend(msg)
return msgs
@deprecated_to_text
async def send_group( async def send_group(
host: str, host: str,
cid: int, cid: int,
@ -303,7 +337,7 @@ async def send_group(
groups = await get_media_group(files) groups = await get_media_group(files)
if len(groups) == 0: if len(groups) == 0:
return [await send_text(host, cid, note, reply_to_message_id, show_second)] return [await send_text(host, cid, note, reply_to_message_id, show_second)]
photo, video, audio, document, msg = [], [], [], [], None photo, video, audio, document, msg_ids = [], [], [], [], []
for i in groups: for i in groups:
if isinstance(i, InputMediaPhoto): if isinstance(i, InputMediaPhoto):
photo.append(i) photo.append(i)
@ -313,54 +347,8 @@ async def send_group(
audio.append(i) audio.append(i)
elif isinstance(i, InputMediaDocument): elif isinstance(i, InputMediaDocument):
document.append(i) document.append(i)
if video and (audio or document): for i in (photo, video, audio, document):
msg = await bot.send_media_group( msg_ids.extend(await send_group_msg(cid, i))
cid,
video,
reply_to_message_id=reply_to_message_id,
)
if audio:
msg = await bot.send_media_group(
cid,
audio,
reply_to_message_id=reply_to_message_id,
)
elif document:
msg = await bot.send_media_group(
cid,
document,
reply_to_message_id=reply_to_message_id,
)
elif audio and (photo or document):
msg = await bot.send_media_group(
cid,
audio,
reply_to_message_id=reply_to_message_id,
)
if photo:
msg = await bot.send_media_group(
cid,
photo,
reply_to_message_id=reply_to_message_id,
)
elif document:
msg = await bot.send_media_group(
cid,
document,
reply_to_message_id=reply_to_message_id,
)
else:
msg = await bot.send_media_group(
cid,
groups,
reply_to_message_id=reply_to_message_id,
)
if msg and isinstance(msg, list):
msg_ids = msg
elif msg:
msg_ids = [msg]
else:
msg_ids = []
tmsg = await send_text( tmsg = await send_text(
host, cid, note, msg_ids[0].id if msg_ids else None, show_second host, cid, note, msg_ids[0].id if msg_ids else None, show_second
) )