import io from redis.exceptions import ConnectionError from requests import get from os import remove from telethon.tl.types import MessageMediaPhoto try: from asyncio.exceptions import TimeoutError except ImportError: from asyncio.TimeoutError from pagermaid import bot, redis, redis_status from pagermaid.listener import listener from pagermaid.utils import obtain_message, alias_command try: import aiohttp, aiofiles pixiv_import = True except ImportError: pixiv_import = False p_headers = { "Referer": 'https://www.pixiv.net', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 ' 'Safari/537.36', } p_original = ['i.pixiv.cat', 'i.pximg.net'] @listener(is_plugin=True, outgoing=True, command=alias_command("duckduckgo"), description="Duckduckgo 搜索", parameters="") async def baidu(context): await context.edit("获取中 . . .") try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/duckduckgo ' + message) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) duckduckgo_text = chat_response.text await context.edit(duckduckgo_text) @listener(is_plugin=True, outgoing=True, command=alias_command("baidu"), description="百度搜索", parameters="") async def baidu(context): await context.edit("获取中 . . .") try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/baidu ' + message) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) baidu_text = chat_response.text await context.edit(baidu_text) @listener(is_plugin=True, outgoing=True, command=alias_command("weather"), description="使用彩云天气 api 查询国内实时天气。", parameters="<位置>") async def weather(context): await context.edit("获取中 . . .") try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/weather_api ' + message) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) weather_text = chat_response.text await context.edit(weather_text) @listener(is_plugin=True, outgoing=True, command=alias_command("weather_pic"), description="使用彩云天气 api 查询国内实时天气。", parameters="<位置>") async def weather_pic(context): await context.edit("获取中 . . .") reply = await context.get_reply_message() try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/weather ' + message) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) if reply: await context.respond(chat_response, reply_to=reply) else: await context.respond(chat_response) await context.delete() @listener(is_plugin=True, outgoing=True, command=alias_command("weather_he"), description="使用和风天气 api 查询国内省市实时天气。", parameters="<位置>") async def weather_he(context): await context.edit("获取中 . . .") reply = await context.get_reply_message() try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/weather_he ' + message) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) if reply: await context.respond(chat_response, reply_to=reply) else: await context.respond(chat_response) await context.delete() @listener(is_plugin=True, outgoing=True, command=alias_command("pixiv"), description="查询插画信息 (或者回复一条消息)。使用 set [num] 更改镜像源,序号 2 为官方源, 3 为凯露自建源。异步下载需要依赖库 " "aiohttp[speedups] 、 aiofiles", parameters="[<图片链接>] <图片序号>") async def pixiv(context): await context.edit("获取中 . . .") if len(context.parameter) == 2: if context.parameter[0] == 'set': if not redis_status(): await context.edit('redis 数据库离线 无法更改镜像源。') return else: try: num = int(context.parameter[1]) except ValueError: await context.edit('镜像源序号错误。') return if 0 < num < 4: try: redis.set("pixiv_num", num) except ConnectionError: await context.edit('redis 数据库离线 无法更改镜像源。') return await context.edit('镜像源已更改。') return else: await context.edit('镜像源序号错误。') return else: pass if not redis_status(): num = 3 else: try: num = int(redis.get("pixiv_num").decode()) except AttributeError: num = 3 except ConnectionError: num = 3 try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/pixiv_api ' + message) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) pixiv_text = chat_response.text pixiv_text = pixiv_text.replace('i.pixiv.cat', p_original[num - 1]) pixiv_list = pixiv_text.split('|||||') if len(pixiv_list) == 2: pixiv_albums = pixiv_list[1].split('|||') pixiv_album = [] if pixiv_import: await context.edit("调用异步下载图片中 . . .") else: await context.edit("下载图片中 . . .") if len(pixiv_albums) > 8: await context.edit('获取的图片数大于 8 ,将只发送前8张图片,下载图片中 . . .') for i in range(0, min(len(pixiv_albums), 8)): if not pixiv_import: r = get(pixiv_albums[i], headers=p_headers) with open("pixiv." + str(i) + ".jpg", "wb") as code: code.write(r.content) else: async with aiohttp.ClientSession(headers=p_headers) as session: response = await session.get(pixiv_albums[i]) content = await response.read() async with aiofiles.open("pixiv." + str(i) + ".jpg", mode='wb') as code: await code.write(content) await code.close() pixiv_album.extend(["pixiv." + str(i) + ".jpg"]) await context.client.send_file(context.chat_id, pixiv_album, caption=pixiv_list[0]) await context.delete() for i in pixiv_album: try: remove(i) except: pass else: await context.edit(pixiv_text) @listener(is_plugin=True, outgoing=True, command=alias_command("whatanime"), description="通过图片查找相似动漫。(需要回复图片)") async def whatanime(context): reply = await context.get_reply_message() if reply is not None: if reply.media: if not isinstance(reply.media, MessageMediaPhoto): await context.edit("宁需要回复一张图片") return else: await context.edit("宁需要回复一张图片") return else: await context.edit("宁需要回复一张图片") return await context.edit("获取中。。。") async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message(message='/whatanime_api', file=reply.photo) chat_response = await conversation.get_response() await bot.send_read_acknowledge(conversation.chat_id) whatanime_text = chat_response.text whatanime_list = whatanime_text.split('|||') if len(whatanime_list) == 1: await context.edit(whatanime_text) return link = whatanime_list[0] name = whatanime_list[1] native = whatanime_list[2] episode = whatanime_list[3] alias = whatanime_list[4] r18 = whatanime_list[5] percent = whatanime_list[6] img = whatanime_list[7] video = whatanime_list[8] text = f'[{name}]({link}) (`{native}`)\n' if bool(episode): text += f'\n**集数:** `{episode}`' if bool(alias): text += f'\n**别名:** `{alias}`' if bool(r18): text += f'\n**R-18**' text += f'\n**相似度:** `{percent}`' r = get(img) photo = io.BytesIO(r.content) photo.name = f'{name}.png' msg = await context.client.send_file(context.chat_id, file=photo, caption=text, reply_to=reply.id) if not video == '': video_list = video.split('||') video = video_list[0] title = video_list[1] start = video_list[2] end = video_list[3] text = f'`{title}`\n\n`{start}` - `{end}`' await context.client.send_file(context.chat_id, video, caption=text, reply_to=msg.id) await context.delete() @listener(is_plugin=True, outgoing=True, command=alias_command("tts_nan"), description="通过 Azure 文本到语音 基于字符串生成 简体男声 语音消息。", parameters="<字符串>") async def az_tts_nan(context): await az_tts(context, "") @listener(is_plugin=True, outgoing=True, command=alias_command("tts_nv"), description="通过 Azure 文本到语音 基于字符串生成 简体女声 语音消息。", parameters="<字符串>") async def az_tts_nv(context): await az_tts(context, "nv") @listener(is_plugin=True, outgoing=True, command=alias_command("tts_tw"), description="通过 Azure 文本到语音 基于字符串生成 繁体男声 语音消息。", parameters="<字符串>") async def az_tts_tw(context): await az_tts(context, "tw") @listener(is_plugin=True, outgoing=True, command=alias_command("tts_ne"), description="通过 Azure 文本到语音 基于字符串生成 简体新闻男声 语音消息。", parameters="<字符串>") async def az_tts_ne(context): await az_tts(context, "ne") @listener(is_plugin=True, outgoing=True, command=alias_command("tts_en"), description="通过 Azure 文本到语音 基于字符串生成 英文男声 语音消息。", parameters="<字符串>") async def az_tts_en(context): await az_tts(context, "en") async def az_tts(context, mode): await context.edit("获取中 . . .") reply = await context.get_reply_message() try: message = await obtain_message(context) except ValueError: await context.edit("出错了呜呜呜 ~ 无效的参数。") return async with bot.conversation('PagerMaid_Modify_bot') as conversation: await conversation.send_message('/tts ' + message + mode) try: chat_response = await conversation.get_response() except TimeoutError: return await context.edit("未收到服务器回应。") await bot.send_read_acknowledge(conversation.chat_id) if reply: await context.respond(chat_response, reply_to=reply) else: await context.respond(chat_response) await context.delete()