From 621ffca6b5b5146eccc3e858a9181b2d9b29dd60 Mon Sep 17 00:00:00 2001 From: Xtao_dada Date: Thu, 20 Jan 2022 16:27:20 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20#166=20=20(#168)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🐛 Fix #166 Aiohttp 访问超时 --- config.gen.yml | 4 - pagermaid/__init__.py | 3 +- pagermaid/assets/config.gen.yml | 7 +- pagermaid/modules/message.py | 6 +- pagermaid/modules/plugin.py | 14 ++-- pagermaid/modules/status.py | 4 +- pagermaid/modules/sticker.py | 8 +- pagermaid/utils.py | 131 ++++---------------------------- requirements.txt | 2 +- 9 files changed, 35 insertions(+), 144 deletions(-) diff --git a/config.gen.yml b/config.gen.yml index c878593..7b3fe81 100644 --- a/config.gen.yml +++ b/config.gen.yml @@ -62,14 +62,10 @@ mtp_secret: "" # Apt Git source git_source: "https://raw.githubusercontent.com/Xtao-Labs/PagerMaid_Plugins/master/" -git_api: "https://api.github.com/repos/Xtao-Labs/PagerMaid-Modify/commits/master" git_ssh: "https://github.com/Xtao-Labs/PagerMaid-Modify.git" # Update Notice update_check: "True" -update_time: "86400" -update_username: "PagerMaid_Modify_bot" -update_delete: "True" # ipv6 ipv6: "False" diff --git a/pagermaid/__init__.py b/pagermaid/__init__.py index 0b0fb9d..0b36b85 100644 --- a/pagermaid/__init__.py +++ b/pagermaid/__init__.py @@ -34,7 +34,6 @@ from requests.exceptions import ChunkedEncodingError from requests.exceptions import ConnectionError as ConnectedError from asyncio import CancelledError as CancelError from asyncio import TimeoutError as AsyncTimeoutError -from aiohttp.client_exceptions import ServerDisconnectedError from sqlite3 import OperationalError from http.client import RemoteDisconnected from urllib.error import URLError @@ -282,7 +281,7 @@ def before_send(event, hint): OSError, AuthKeyDuplicatedError, ResponseError, SlowModeWaitError, PeerFloodError, MessageEditTimeExpiredError, PeerIdInvalidError, AuthKeyUnregisteredError, UserBannedInChannelError, AuthKeyError, - CancelError, AsyncTimeoutError, ServerDisconnectedError)): + CancelError, AsyncTimeoutError)): return elif exc_info and isinstance(exc_info[1], UserDeactivatedBanError): # The user has been deleted/deactivated diff --git a/pagermaid/assets/config.gen.yml b/pagermaid/assets/config.gen.yml index 6ab3089..7b3fe81 100644 --- a/pagermaid/assets/config.gen.yml +++ b/pagermaid/assets/config.gen.yml @@ -62,14 +62,10 @@ mtp_secret: "" # Apt Git source git_source: "https://raw.githubusercontent.com/Xtao-Labs/PagerMaid_Plugins/master/" -git_api: "https://api.github.com/repos/Xtao-Labs/PagerMaid-Modify/commits/master" git_ssh: "https://github.com/Xtao-Labs/PagerMaid-Modify.git" # Update Notice update_check: "True" -update_time: "86400" -update_username: "PagerMaid_Modify_bot" -update_delete: "True" # ipv6 ipv6: "False" @@ -91,3 +87,6 @@ start_form: "%m/%d %H:%M" bot_admins: - example1 - example2 + +# Silent to reduce editing times +silent: "True" diff --git a/pagermaid/modules/message.py b/pagermaid/modules/message.py index cf4e731..7747a9d 100644 --- a/pagermaid/modules/message.py +++ b/pagermaid/modules/message.py @@ -10,7 +10,7 @@ from telethon.tl.types import ChannelForbidden from pagermaid import bot, log, config from pagermaid.listener import listener -from pagermaid.utils import lang, alias_command, get +from pagermaid.utils import lang, alias_command, client def isfloat(value): @@ -247,12 +247,12 @@ async def hitokoto(context): hitokoto_while = 1 hitokoto_json = None try: - hitokoto_json = (await get("https://v1.hitokoto.cn/?charset=utf-8")).json() + hitokoto_json = (await client.get("https://v1.hitokoto.cn/?charset=utf-8")).json() except ValueError: while hitokoto_while < 10: hitokoto_while += 1 try: - hitokoto_json = (await get("https://v1.hitokoto.cn/?charset=utf-8")).json() + hitokoto_json = (await client.get("https://v1.hitokoto.cn/?charset=utf-8")).json() break except: continue diff --git a/pagermaid/modules/plugin.py b/pagermaid/modules/plugin.py index fe589a8..f801a68 100644 --- a/pagermaid/modules/plugin.py +++ b/pagermaid/modules/plugin.py @@ -8,7 +8,7 @@ from shutil import copyfile, move from glob import glob from pagermaid import log, working_dir, config from pagermaid.listener import listener -from pagermaid.utils import upload_attachment, lang, alias_command, get +from pagermaid.utils import upload_attachment, lang, alias_command, client from pagermaid.modules import plugin_list as active_plugins, __list_plugins @@ -31,7 +31,7 @@ def remove_plugin(name): async def download(name): - html = await get(f'{git_source}{name}.py') + html = await client.get(f'{git_source}{name}.py') with open(f'plugins/{name}.py', mode='wb') as f: f.write(html.text.encode('utf-8')) return f'plugins/{name}.py' @@ -94,7 +94,7 @@ async def plugin(context): success_list = [] failed_list = [] noneed_list = [] - plugin_list = await get(f"{git_source}list.json") + plugin_list = await client.get(f"{git_source}list.json") plugin_list = plugin_list.json()['list'] for i in process_list: if exists(f"{plugin_directory}version.json"): @@ -260,7 +260,7 @@ async def plugin(context): return with open(f"{plugin_directory}version.json", 'r', encoding="utf-8") as f: version_json = json.load(f) - plugin_list = await get(f"{git_source}list.json") + plugin_list = await client.get(f"{git_source}list.json") plugin_online = plugin_list.json()['list'] for key, value in version_json.items(): if value == "0.0": @@ -304,7 +304,7 @@ async def plugin(context): elif len(context.parameter) == 2: search_result = [] plugin_name = context.parameter[1] - plugin_list = await get(f"{git_source}list.json") + plugin_list = await client.get(f"{git_source}list.json") plugin_online = plugin_list.json()['list'] for i in plugin_online: if search(plugin_name, i['name'], I): @@ -321,7 +321,7 @@ async def plugin(context): elif len(context.parameter) == 2: search_result = '' plugin_name = context.parameter[1] - plugin_list = await get(f"{git_source}list.json") + plugin_list = await client.get(f"{git_source}list.json") plugin_online = plugin_list.json()['list'] for i in plugin_online: if plugin_name == i['name']: @@ -350,7 +350,7 @@ async def plugin(context): list_plugin = [] with open(f"{plugin_directory}version.json", 'r', encoding="utf-8") as f: version_json = json.load(f) - plugin_list = await get(f"{git_source}list.json") + plugin_list = await client.get(f"{git_source}list.json") plugin_online = plugin_list.json()['list'] for key, value in version_json.items(): if value == "0.0": diff --git a/pagermaid/modules/status.py b/pagermaid/modules/status.py index 57a8040..745a04a 100644 --- a/pagermaid/modules/status.py +++ b/pagermaid/modules/status.py @@ -16,9 +16,9 @@ from re import sub, findall from requests import get from pathlib import Path from pagermaid import log, config, redis_status, start_time, silent -from pagermaid.utils import execute, upload_attachment +from pagermaid.utils import execute, upload_attachment, lang, alias_command from pagermaid.listener import listener -from pagermaid.utils import lang, alias_command + DCs = { 1: "149.154.175.50", diff --git a/pagermaid/modules/sticker.py b/pagermaid/modules/sticker.py index 89836cc..85c2d75 100644 --- a/pagermaid/modules/sticker.py +++ b/pagermaid/modules/sticker.py @@ -12,7 +12,7 @@ from PIL import Image, ImageOps from math import floor from pagermaid import bot, redis, redis_status, silent from pagermaid.listener import listener -from pagermaid.utils import lang, alias_command, get +from pagermaid.utils import lang, alias_command, client from pagermaid import log @@ -337,12 +337,12 @@ async def single_sticker(animated, context, custom_emoji, emoji, message, pic_ro command = '/newanimated' try: - response = await get(f'https://t.me/addstickers/{pack_name}') + response = await client.get(f'https://t.me/addstickers/{pack_name}') except UnicodeEncodeError: pack_name = 's' + hex(context.sender_id)[2:] if animated: pack_name = 's' + hex(context.sender_id)[2:] + '_animated' - response = await get(f'https://t.me/addstickers/{pack_name}') + response = await client.get(f'https://t.me/addstickers/{pack_name}') if not response.status_code == 200: try: await context.edit(lang('sticker_telegram_server_error')) @@ -608,7 +608,7 @@ async def sticker_search(context): await context.edit(lang('google_processing')) query = context.parameter[0] try: - html = (await get("https://combot.org/telegram/stickers?q=" + query)).text + html = (await client.get("https://combot.org/telegram/stickers?q=" + query)).text except: return await context.edit(lang('sticker_telegram_server_error')) xml = BeautifulSoup(html, "lxml") diff --git a/pagermaid/utils.py b/pagermaid/utils.py index 9900b1f..be04c1e 100644 --- a/pagermaid/utils.py +++ b/pagermaid/utils.py @@ -1,5 +1,5 @@ """ Libraries for python modules. """ -import aiohttp +import httpx import subprocess from importlib.util import find_spec @@ -7,13 +7,11 @@ from sys import executable from os import remove from os.path import exists -from typing import Any, Optional +from typing import Optional from emoji import get_emoji_regexp from random import choice from json import load as load_json -from json import loads as loads_json -from json import dumps as dumps_json from re import sub, IGNORECASE from asyncio import create_subprocess_shell from asyncio.subprocess import PIPE @@ -25,25 +23,6 @@ from pagermaid import module_dir, bot, lang_dict, alias_dict, user_bot, config, http_port -class AiohttpResp: - """ - 重写返回类型。 - """ - def __init__(self, text: Any, content: bytes, status_code: int): - """ - Args: - text (Any): 网页内容 - content (bytes): 文件内容 - status_code (int): 网页状态码 - """ - self.text = text - self.content = content - self.status_code = status_code - - def json(self): - return loads_json(self.text) - - def lang(text: str) -> str: """ i18n """ result = lang_dict.get(text, text) @@ -250,97 +229,15 @@ async def admin_check(event): return False -async def request(method: str, - url: str, - params: dict = None, - data: Any = None, - json_body: bool = False, - timeout: int = 10, - **kwargs) -> AiohttpResp: - """ - 原始网络请求封装。 - Args: - method (str) : 请求方法。 - url (str) : 请求 URL。 - params (dict, optional) : 请求参数。 - data (Any, optional) : 请求载荷。 - json_body (bool, optional) : 载荷是否为 JSON - timeout (int, optional) : 超时时间 - Returns: - 返回 aiohttp 请求对象 - """ - method = method.upper() - - # 使用自定义 UA - DEFAULT_HEADERS = { - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" - } - headers = DEFAULT_HEADERS - - if params is None: - params = {} - - # 合并参数 - config_ = { - "method": method, - "url": url, - "params": params, - "data": data, - "headers": headers, - } - # 支持自定义参数 - config_.update(kwargs) - - if json_body: - config_["headers"]["Content-Type"] = "application/json" - config_["data"] = dumps_json(config_["data"]) - # 如果用户提供代理则设置代理 - if not proxy_addr == '' and not proxy_port == '': - config_["proxy"] = f"socks5://{proxy_addr}:{proxy_port}" - elif not http_addr == '' and not http_port == '': - config_["proxy"] = f"http://{http_addr}:{http_port}" - session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=timeout)) - resp = await session.request(**config_) - await session.close() - # 返回请求 - try: - resp_data = await resp.text() - except UnicodeDecodeError: - resp_data = await resp.read() - content = await resp.content.read() - status_code = resp.status - return AiohttpResp(resp_data, content, status_code) - - -async def get(url: str, timeout: int = 10, **kwargs) -> AiohttpResp: - """ - GET 请求封装 - Args: - url (str) : 请求 URL。 - timeout (int, optional) : 超时时间 - Returns: - 返回 aiohttp 请求对象 - :rtype :aiohttp.client_reqrep.ClientResponse - """ - return await request("GET", url, timeout=timeout, **kwargs) - - -async def post(url: str, - params: dict = None, - data: Any = None, - json_body: bool = False, - timeout: int = 10, - **kwargs) -> AiohttpResp: - """ - POST 请求封装 - Args: - url (str) : 请求 URL。 - params (dict, optional) : 请求参数。 - data (Any, optional) : 请求载荷。 - json_body (bool, optional) : 载荷是否为 JSON - timeout (int, optional) : 超时时间 - Returns: - 返回 aiohttp 请求对象 - :rtype :aiohttp.client_reqrep.ClientResponse - """ - return await request("POST", url, params, data, json_body, timeout, **kwargs) +""" Init httpx client """ +# 使用自定义 UA +headers = { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" +} +# 如果用户提供代理则设置代理 +proxies = None +if not proxy_addr == '' and not proxy_port == '': + proxies = f"socks5://{proxy_addr}:{proxy_port}" +elif not http_addr == '' and not http_port == '': + proxies = f"http://{http_addr}:{http_port}" +client = httpx.AsyncClient(proxies=proxies, timeout=10.0, headers=headers) diff --git a/requirements.txt b/requirements.txt index d1d8d0b..e622bc9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ PyYAML>=5.4.1 redis>=3.5.3 coloredlogs>=15.0.1 requests[socks]>=2.25.1 -aiohttp>=3.8.1 +httpx[socks]>=0.21.3 pytz>=2021.1 cowpy>=1.1.0 googletrans>=4.0.0-rc1