diff options
author | Kyomotoi <[email protected]> | 2022-06-18 00:26:50 +0800 |
---|---|---|
committer | Kyomotoi <[email protected]> | 2022-06-18 00:26:50 +0800 |
commit | 654ec7e009c4dde07af1359238660440d38825cc (patch) | |
tree | 8b26da57e0c2de8e4a489fa9f7b7c7ddefaad481 | |
parent | 12757bc2ef4c353a578387a8c7646376df15dd93 (diff) | |
download | ATRI-654ec7e009c4dde07af1359238660440d38825cc.tar.gz ATRI-654ec7e009c4dde07af1359238660440d38825cc.tar.bz2 ATRI-654ec7e009c4dde07af1359238660440d38825cc.zip |
🚚♿️💩 移动插件自检位置, 提升用户体验, 优化代码
-rw-r--r-- | ATRI/plugins/twitter/__init__.py | 53 | ||||
-rw-r--r-- | ATRI/plugins/twitter/api.py | 60 | ||||
-rw-r--r-- | ATRI/plugins/twitter/data_source.py | 59 |
3 files changed, 107 insertions, 65 deletions
diff --git a/ATRI/plugins/twitter/__init__.py b/ATRI/plugins/twitter/__init__.py index de92788..5d75e18 100644 --- a/ATRI/plugins/twitter/__init__.py +++ b/ATRI/plugins/twitter/__init__.py @@ -1,3 +1,4 @@ +import re import pytz import asyncio from tabulate import tabulate @@ -9,9 +10,9 @@ from apscheduler.triggers.interval import IntervalTrigger from nonebot import get_bot from nonebot.matcher import Matcher -from nonebot.permission import Permission from nonebot.params import CommandArg, ArgPlainText -from nonebot.adapters.onebot.v11 import Message, GroupMessageEvent +from nonebot.permission import Permission, SUPERUSER +from nonebot.adapters.onebot.v11 import Message, MessageSegment, GroupMessageEvent from ATRI.log import logger as log from ATRI.utils.apscheduler import scheduler @@ -20,6 +21,9 @@ from ATRI.database import TwitterSubscription from .data_source import TwitterDynamicSubscriptor +_CONTENT_LIMIT: int = 0 + + add_sub = TwitterDynamicSubscriptor().cmd_as_group("add", "添加推主订阅") @@ -99,7 +103,7 @@ get_sub_list = TwitterDynamicSubscriptor().cmd_as_group( @get_sub_list.handle() -async def _get_sub_list(event: GroupMessageEvent): +async def _td_get_sub_list(event: GroupMessageEvent): group_id = event.group_id sub = TwitterDynamicSubscriptor() @@ -118,6 +122,31 @@ async def _get_sub_list(event: GroupMessageEvent): await get_sub_list.finish(output) +limit_content = TwitterDynamicSubscriptor().cmd_as_group( + "limit", "设置订阅内容字数限制", permission=SUPERUSER +) + + +@limit_content.handle() +async def _td_get_limit(matcher: Matcher, args: Message = CommandArg()): + msg = args.extract_plain_text() + if msg: + matcher.set_arg("td_limit_int", args) + + +@limit_content.got("td_limit_int", "要限制内容在多少字以内呢?(默认200,0=不限制)") +async def _td_deal_limit( + event: GroupMessageEvent, _limit: str = ArgPlainText("td_limit_int") +): + patt = r"^\d+$" + if not re.match(patt, _limit): + await limit_content.reject("请键入阿拉伯数字:") + + global _CONTENT_LIMIT + _CONTENT_LIMIT = int(_limit) + await limit_content.finish(f"成功!订阅内容展示将限制在 {_CONTENT_LIMIT} 以内!") + + tq = asyncio.Queue() @@ -167,20 +196,24 @@ async def _check_td(): raw_media = info["status"]["entities"].get("media", dict()) if raw_media: - pic = raw_media[0]["media_url"] - url = raw_media[0]["url"] + _pic = raw_media[0]["media_url"] else: - pic = str() - url = str() + _pic = str() data = { "name": info["name"], "content": info["status"]["text"], - "pic": pic, - "to_url": url, } - content = sub.gen_output(data) + content = sub.gen_output(data, _CONTENT_LIMIT) + pic = Message(MessageSegment.image(_pic)) bot = get_bot() await bot.send_group_msg(group_id=m.group_id, message=content) + if pic: + try: + await bot.send_group_msg(group_id=m.group_id, message=pic) + except Exception: + repo = "图片发送失败了..." + await bot.send_group_msg(group_id=m.group_id, message=repo) + await sub.update_sub(tid, m.group_id, {"last_update": raw_t}) diff --git a/ATRI/plugins/twitter/api.py b/ATRI/plugins/twitter/api.py index 2fefbb2..9023478 100644 --- a/ATRI/plugins/twitter/api.py +++ b/ATRI/plugins/twitter/api.py @@ -1,12 +1,7 @@ import re -from time import sleep -from ATRI import driver -from ATRI.log import logger as log from ATRI.utils import request -from ATRI.service import ServiceTools from ATRI.exceptions import RequestError -from ATRI.utils.apscheduler import scheduler _GUEST_TOKEN: str = str() @@ -47,7 +42,7 @@ class API: url = "https://api.twitter.com/1.1/guest/activate.json" try: resp = await request.post(url, headers=headers) - except RequestError: + except Exception: raise RequestError("Request failed!") data: dict = resp.json() @@ -63,7 +58,7 @@ class API: url = "https://twitter.com/explore" try: resp = await request.get(url, headers=headers) - except RequestError: + except Exception: raise RequestError("Request failed!") data = str(resp.headers) @@ -94,7 +89,7 @@ class API: headers = self._gen_headers() try: resp = await request.get(url, params=params, headers=headers) - except RequestError: + except Exception: raise RequestError("Request failed!") return resp.json() @@ -114,8 +109,23 @@ class API: return dict() return data[0] + async def get_user_info(self, tid: int) -> dict: + """通过提供的信息获取对应用户信息 + + Args: + tid (int): 用户ID + + Returns: + dict: 用户信息. + """ + url = f"https://api.twitter.com/2/users/{tid}" + data = await self._request(url) + if not data: + return dict() + return data + async def get_conversation(self, tweet_id: int) -> dict: - """通过传入的值获取推文信息(无法工作) + """通过传入的值获取推文信息 Args: tweet_id (int): 推文id @@ -125,37 +135,9 @@ class API: """ url = f"https://twitter.com/i/api/2/timeline/conversation/{tweet_id}.json" params = { - "simple_quoted_tweet": "true", + "simple_quoted_tweet": True, "tweet_mode": "extended", - "trim_user": "true", + "trim_user": True, } data = await self._request(url, params) return data - - -async def _regot_token(): - api = API() - await api.get_token() - # await api.get_cookie() - - -async def _check_status(): - headers = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" - } - try: - await request.get("https://twitter.com/", headers=headers) - log.success("已成功连接: Twitter") - except RequestError: - data = ServiceTools.load_service("推特动态订阅") - data["enabled"] = False - ServiceTools.save_service(data, "推特动态订阅") - log.warning("无法连接至 Twitter,这将导致相关插件无法工作. 已自动禁用. 3s后继续...") - sleep(3) - - -scheduler.add_job(_regot_token, "interval", name="刷新推特凭据", minutes=30, misfire_grace_time=10) # type: ignore - - -driver().on_startup(_regot_token) -driver().on_startup(_check_status) diff --git a/ATRI/plugins/twitter/data_source.py b/ATRI/plugins/twitter/data_source.py index 0ea7231..8d36b18 100644 --- a/ATRI/plugins/twitter/data_source.py +++ b/ATRI/plugins/twitter/data_source.py @@ -1,9 +1,12 @@ from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import MessageSegment from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN -from ATRI.service import Service +from ATRI import driver +from ATRI.service import Service, ServiceTools from ATRI.rule import is_in_service +from ATRI.log import logger as log +from ATRI.utils import request +from ATRI.utils.apscheduler import scheduler from ATRI.exceptions import TwitterDynamicError from .db import DB @@ -12,10 +15,7 @@ from .api import API _DYNAMIC_OUTPUT_FORMAT = """ {t_nickname} 的推更新了! -(限制 {limit_content} 字) {t_dy_content} -{t_dy_media} -链接: {t_dy_link} """.strip() @@ -34,21 +34,21 @@ class TwitterDynamicSubscriptor(Service): try: async with DB() as db: await db.add_sub(tid, group_id) - except TwitterDynamicError: + except Exception: raise TwitterDynamicError("添加订阅失败") async def update_sub(self, tid: int, group_id: int, update_map: dict): try: async with DB() as db: await db.update_sub(tid, group_id, update_map) - except TwitterDynamicError: + except Exception: raise TwitterDynamicError("更新订阅失败") async def del_sub(self, screen_name: str, group_id: int): try: async with DB() as db: await db.del_sub({"screen_name": screen_name, "group_id": group_id}) - except TwitterDynamicError: + except Exception: raise TwitterDynamicError("删除订阅失败") async def get_sub_list(self, tid: int = int(), group_id: int = int()) -> list: @@ -60,14 +60,14 @@ class TwitterDynamicSubscriptor(Service): try: async with DB() as db: return await db.get_sub_list(query_map) - except TwitterDynamicError: + except Exception: raise TwitterDynamicError("获取订阅列表失败") async def get_all_subs(self) -> list: try: async with DB() as db: return await db.get_all_subs() - except TwitterDynamicError: + except Exception: raise TwitterDynamicError("获取全部订阅列表失败") async def get_twitter_user_info(self, name: str) -> dict: @@ -81,24 +81,26 @@ class TwitterDynamicSubscriptor(Service): screen_name = data.get("screen_name", None) return _name, screen_name - def gen_output(self, data: dict, limit_content: int = 100) -> str: + def gen_output(self, data: dict, content_limit) -> str: """生成动态信息 Args: data (dict): dict形式的动态数据. - limit_content (int, optional): 内容字数限制. 默认 100. + limit_content (int, optional): 内容字数限制. Returns: str: 动态信息 """ + if not content_limit: + content = data["content"] + else: + content = data["content"][:content_limit] + return _DYNAMIC_OUTPUT_FORMAT.format( t_nickname=data["name"], - limit_content=limit_content, - t_dy_content=str(data["content"][:limit_content]) + t_dy_content=str(content) .replace("https://", str()) .replace("http://", str()), - t_dy_media=MessageSegment.image(data["pic"]) if data.get("pic") else str(), - t_dy_link=str(data["to_url"]).replace("https://", str()), ) @@ -106,3 +108,28 @@ class TwitterDynamicSubscriptor(Service): # class TwitterHelper(Service): # def __init__(self): # Service.__init__(self, "推特助手", "推特小助手", rule=is_in_service("推特助手")) + + +async def _regot_in_need(): + api = API() + await api.get_token() + # await api.get_cookie() + + +async def _check_status(): + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" + } + try: + await request.get("https://twitter.com/", headers=headers) + log.success("已成功连接: Twitter") + await _regot_in_need() + scheduler.add_job(_regot_in_need, "interval", name="刷新推特凭据", minutes=30, misfire_grace_time=10) # type: ignore + except Exception: + data = ServiceTools.load_service("推特动态订阅") + data["enabled"] = False + ServiceTools.save_service(data, "推特动态订阅") + log.warning("无法连接至 Twitter,这将导致相关插件无法工作. 已自动禁用.") + + +driver().on_startup(_check_status) |