summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyomotoi <[email protected]>2022-06-18 00:26:50 +0800
committerKyomotoi <[email protected]>2022-06-18 00:26:50 +0800
commit654ec7e009c4dde07af1359238660440d38825cc (patch)
tree8b26da57e0c2de8e4a489fa9f7b7c7ddefaad481
parent12757bc2ef4c353a578387a8c7646376df15dd93 (diff)
downloadATRI-654ec7e009c4dde07af1359238660440d38825cc.tar.gz
ATRI-654ec7e009c4dde07af1359238660440d38825cc.tar.bz2
ATRI-654ec7e009c4dde07af1359238660440d38825cc.zip
🚚♿️💩 移动插件自检位置, 提升用户体验, 优化代码
-rw-r--r--ATRI/plugins/twitter/__init__.py53
-rw-r--r--ATRI/plugins/twitter/api.py60
-rw-r--r--ATRI/plugins/twitter/data_source.py59
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)