Skip to content

Commit

Permalink
close #25 以合并转发应对短时消息或删除消息(谷歌翻译另起)
Browse files Browse the repository at this point in the history
  • Loading branch information
SlieFamily committed Aug 6, 2023
1 parent 7a76f48 commit d83e821
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 45 deletions.
1 change: 0 additions & 1 deletion baidu_translate.json

This file was deleted.

Binary file modified db/anas.db
Binary file not shown.
Binary file modified db/rss.db
Binary file not shown.
80 changes: 53 additions & 27 deletions src/plugins/rss_helper/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
from nonebot.permission import SUPERUSER
from nonebot.adapters.onebot.v11 import Bot,Message,GroupMessageEvent,bot,FriendRequestEvent,GroupRequestEvent,GroupDecreaseNoticeEvent
from nonebot_plugin_guild_patch import GuildMessageEvent
from nonebot_plugin_saa import MessageFactory, PlatformTarget, AggregatedMessageFactory
from nonebot_plugin_saa import TargetQQGroup, enable_auto_select_bot, Image, Text
from nonebot import require
from nonebot.log import logger
from . import rss_tool
Expand All @@ -21,6 +23,8 @@
import nonebot
import threading

enable_auto_select_bot() #为ssa插件自动获取bot

RSS.Init2db() #数据库初始化

index = 0 #用于轮流刷新
Expand All @@ -29,7 +33,7 @@
scheduler = require('nonebot_plugin_apscheduler').scheduler

# 创建定时任务:推送订阅信息/每5min查询一次
@scheduler.scheduled_job('interval',minutes = 1,id = 'update')
@scheduler.scheduled_job('interval',minutes = 1,id = 'update') #minutes = 1
async def update():

if RSS.Empty():
Expand All @@ -43,45 +47,67 @@ async def update():
msg_id = users[index][2]
url = users[index][3]
logger.info(f'[!]查询 {name} 动态……')
new_msg_id,data = await rss_tool.get_latest_msg(url)
new_msg_id,datas = await rss_tool.get_latest_datas(url)
if new_msg_id == '' or new_msg_id == msg_id:
index += 1
return #最新 msg_id 和上次收录的一致(说明并未更新) 或 获取信息失败

logger.info(f'[!]检测到 {name} 已更新')
RSS.UpdateMsg(user_id, new_msg_id) #更新数据库的最新 msg_id
is_translate = False
msg,imgs = await rss_tool.get_Qmsg(name,data) #读取信息详情

media = ''
for item in imgs:
media += MessageSegment.image(item)+'\n'
msgs = await rss_tool.get_Qmsg(name,datas,msg_id) #读取信息详情

cards = RSS.GetALLCard(user_id) #card: [group_id(s), is_translate(s)]

schedBot = nonebot.get_bot()
for card in cards:
if card[1] == '1':#需要翻译
await schedBot.call_api('send_msg',**{
'message':msg+"-----[翻译]-----\n"+baidu_translate(msg)+media,
'group_id':card[0]

if len(msgs) > 1: # 消息大于1条时,采用合并转发策略
Qlist = []
text = f'您关注的 {name} 更新了数条消息(或删除了某条消息),TA近期动态已为您合并为聊天消息~'
for msg in msgs:
media = []
for img in msg[1]:
media.append(Image(img))

Qlist.append(
MessageFactory(
[Text(msg[0])]+media+[Text("\n🔔:"+msg[2])]
)
)

for card in cards:
await MessageFactory("text").send_to(TargetQQGroup(group_id=card[0]))
await AggregatedMessageFactory(Qlist).send_to(TargetQQGroup(group_id=card[0]))

else:
media = ''
text = f'您关注的 {name} 更新了:\n\n'
msg = msgs[0]
for img in msg[1]:
media += MessageSegment.image(img)

for card in cards:
if card[1] == '1':#需要翻译
await schedBot.call_api('send_msg',**{
'message':text+msg[0]+"\n\n【翻译】\n"+baidu_translate(msg)+media+"\n🔔:"+msg[2],
'group_id':card[0]
})
else:#不需要翻译
await schedBot.call_api('send_msg',**{
'message':text+msg[0]+media+"\n🔔:"+msg[2],
'group_id':card[0]
})

await schedBot.call_api("send_guild_channel_msg",**{
'guild_id':54880161636523193,
'channel_id':2841279,
'message':text+msg[0]+media+"\n🔔:"+msg[2],
})
else:#不需要翻译
await schedBot.call_api('send_msg',**{
'message':msg+media,
'group_id':card[0]
await schedBot.call_api("send_guild_channel_msg",**{
'guild_id':28505721637064109,
'channel_id':2871978,
'message':text+msg[0]+media+"\n🔔:"+msg[2],
})

await schedBot.call_api("send_guild_channel_msg",**{
'guild_id':54880161636523193,
'channel_id':2841279,
'message':msg+media
})
await schedBot.call_api("send_guild_channel_msg",**{
'guild_id':28505721637064109,
'channel_id':2871978,
'message':msg+media
})
index += 1

# 关注命令(仅允许管理员操作)
Expand Down
Binary file modified src/plugins/rss_helper/__pycache__/__init__.cpython-38.pyc
Binary file not shown.
Binary file modified src/plugins/rss_helper/__pycache__/config.cpython-38.pyc
Binary file not shown.
Binary file modified src/plugins/rss_helper/__pycache__/rss_tool.cpython-38.pyc
Binary file not shown.
5 changes: 1 addition & 4 deletions src/plugins/rss_helper/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,4 @@
appid=data['appid']
if data.get('baidu_token')!=None:
baidu_token=data['baidu_token']
else:
data={'appid':'','baidu_token':''}
with open('baidu_translate.json','w',encoding='utf-8')as fp:
json.dump(data,fp)

40 changes: 27 additions & 13 deletions src/plugins/rss_helper/rss_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import random
import hashlib
import os
import time
from nonebot.log import logger
from typing import Any, Dict, List
import feedparser
Expand All @@ -25,7 +26,7 @@ async def get_user_info(url:str)->str:
try:
msg = rss.entries[0]['author']
except:
msg = rss.feed.title.split(" ")[0] #解决B站动态没有作者信息
msg = rss.feed.title.split(" ")[0] #解决B站动态没有作者信息问题
logger.success('[√]订阅消息获取成功!') #存在因订阅源失效导致xml内容无用的情况,待修复
return msg

Expand All @@ -35,36 +36,49 @@ async def get_user_info(url:str)->str:
return ''


async def get_latest_msg(url:str)->(str,str):
async def get_latest_datas(url:str)->(str,list):
'''
根据订阅信息的url检查更新
返回信息唯一标识 msg_id 和 更新内容 msg
返回信息唯一标识和最新数据
'''
try:
rss = feedparser.parse(url)
msg = rss.entries[0]['summary']
datas = rss.entries
time = datas[0]['published']
logger.success('[√]订阅消息刷新成功!') #存在因订阅源失效导致xml内容无用的情况,待修复
return str_hash(msg),msg
return str_hash(time),datas

except:
logger.error('[!]RSS访问失败,请检查订阅url或代理/网络设置!')
logger.error('[!]获取订阅消息失败!')
return '',''
return '',[]



async def get_Qmsg(name:str, data:str):
async def get_Qmsg(name:str, datas:list, msg_id:str)->list:
'''
将获得的信息转换为QQ可接收的信息(含翻译选项)
返回 文本信息、媒体信息(图片)
返回 文本信息、媒体信息(图片)、时间戳
'''
text = f'您关注的 【{name}】 更新了:\n\n'
trans_msg = ''
html = Pq(data)
msg = handle_html_tag(html)
imgs= [item.attr('src') for item in html('img').items()]
msgs = []
if msg_id == '': #第一次关注则只刷新最新一条
datas = [datas[0]]
for data in datas[:10]:
if str_hash(data['published']) == msg_id: #从最新动态往下更新,直到与上次记录重合
break
else:
html = Pq(data['summary'])
msg = handle_html_tag(html)
imgs= [item.attr('src') for item in html('img').items()]

return text+msg,imgs
# 将 GMT 时间转换为 北京时间
publish_time = data['published_parsed']
publish_time = time.mktime(publish_time)+25200
publish_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(publish_time))
msgs.insert(0,(msg,imgs,publish_time))

return msgs

# 百度翻译
async def baidu_translate(msg):
Expand Down

0 comments on commit d83e821

Please sign in to comment.