diff --git a/config.py b/config.py index b61747ac..64aa4d94 100644 --- a/config.py +++ b/config.py @@ -21,6 +21,18 @@ # 图片压缩大小 kb * 1024 = MB ZIP_SIZE = 3 * 1024 +blockquote = True #是否显示转发的内容,默认打开 +showlottery = True #是否显示互动抽奖信息,默认打开 + +#使用百度翻译API 可选,填的话两个都要填,不填默认使用谷歌翻译(需墙外?) +# Baidu Translate API +UseBaidu = False +BaiduID = '' +BaiduKEY = '' +#百度翻译接口appid和secretKey,前往http://api.fanyi.baidu.com/获取 +#一般来说申请标准版免费就够了,想要好一点可以认证上高级版,有月限额,rss用也足够了 + + # 解决pixiv.cat无法访问问题 CLOSE_PIXIV_CAT = False # 是否关闭使用 pixiv.cat,关闭后必须启用代理 # 以下两项在关闭使用 pixiv.cat时有效,如果你有自己反代pixiv,填上你自己的反代服务器地址即可,没有不要填 @@ -37,4 +49,4 @@ # MYELF博客地址 https://myelf.club # 出现问题请在 GitHub 上提 issues # 项目地址 https://github.com/Quan666/ELF_RSS -# v1.3.5 +# v1.3.7 diff --git a/include/plugins/RSSHub/RSS_class.py b/include/plugins/RSSHub/RSS_class.py index dad96b75..6e2b7622 100644 --- a/include/plugins/RSSHub/RSS_class.py +++ b/include/plugins/RSSHub/RSS_class.py @@ -11,8 +11,9 @@ class rss: time=5 #更新频率 分钟/次 translation=False # 翻译 only_title=False #仅标题 + only_pic=False #仅图片 # 定义构造方法 - def __init__(self,name:str, url:str, user_id:str, group_id:str,time=5,img_proxy=False,notrsshub=False,translation=False,only_title=False): + def __init__(self,name:str, url:str, user_id:str, group_id:str,time=5,img_proxy=False,notrsshub=False,translation=False,only_title=False,only_pic=False): self.name = name self.url = url if user_id!='-1' : @@ -24,6 +25,7 @@ def __init__(self,name:str, url:str, user_id:str, group_id:str,time=5,img_proxy= self.img_proxy=img_proxy self.translation=translation self.only_title=only_title + self.only_pic=only_pic def geturl(self)->str: if self.notrsshub : diff --git a/include/plugins/RSSHub/rss_baidutrans.py b/include/plugins/RSSHub/rss_baidutrans.py new file mode 100644 index 00000000..8f180a10 --- /dev/null +++ b/include/plugins/RSSHub/rss_baidutrans.py @@ -0,0 +1,63 @@ +# coding: utf8 +''' + @Author: LCY + @Contact: lchuanyong@126.com + @blog: http://http://blog.csdn.net/lcyong_ + @Date: 2018-01-15 + @Time: 19:19 + 说明: appid和secretKey为百度翻译文档中自带的,需要切换为自己的 + python2和python3部分库名称更改对应如下: + httplib ----> http.client + md5 ----> hashlib.md5 + urllib.quote ----> urllib.parse.quote + 官方链接: + http://api.fanyi.baidu.com/api/trans/product/index + +''' + +import http.client +import hashlib +import json +import urllib +import random +import config + + +def baidu_translate(content): + appid = config.BaiduID + secretKey = config.BaiduKEY + httpClient = None + myurl = '/api/trans/vip/translate' + q = content + fromLang = 'jp' # 源语言 + toLang = 'zh' # 翻译后的语言 + salt = random.randint(32768, 65536) + sign = appid + q + str(salt) + secretKey + sign = hashlib.md5(sign.encode()).hexdigest() + myurl = myurl + '?appid=' + appid + '&q=' + urllib.parse.quote( + q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str( + salt) + '&sign=' + sign + + try: + httpClient = http.client.HTTPConnection('api.fanyi.baidu.com') + httpClient.request('GET', myurl) + # response是HTTPResponse对象 + response = httpClient.getresponse() + jsonResponse = response.read().decode("utf-8") # 获得返回的结果,结果为json格式 + js = json.loads(jsonResponse) # 将json格式的结果转换字典结构 + dst = str(js["trans_result"][0]["dst"]) # 取得翻译后的文本结果 + return dst # 打印结果 + except Exception as e: + print(e) + finally: + if httpClient: + httpClient.close() + + +if __name__ == '__main__': + while True: + print("请输入要翻译的内容,如果退出输入q") + content = input() + if (content == 'q'): + break + baidu_translate(content) \ No newline at end of file diff --git a/include/plugins/RSSHub/rsshub.py b/include/plugins/RSSHub/rsshub.py index 208fdab8..0e174997 100644 --- a/include/plugins/RSSHub/rsshub.py +++ b/include/plugins/RSSHub/rsshub.py @@ -1,6 +1,6 @@ # -*- coding: UTF-8 -*- from io import BytesIO - +import unicodedata import feedparser import json import codecs @@ -23,6 +23,7 @@ from googletrans import Translator import emoji import socket +from retrying import retry # 存储目录 file_path = './data/' #代理 @@ -34,6 +35,7 @@ status_code=[200,301,302] # 去掉烦人的 returning true from eof_received() has no effect when using ssl httpx 警告 asyncio.log.logger.setLevel(40) +@retry async def getRSS(rss:RSS_class.rss)->list:# 链接,订阅名 #设置全局超时 以解决 feedparser.parse 遇到 bad url 时卡住 #socket.setdefaulttimeout(5000) @@ -53,8 +55,6 @@ async def getRSS(rss:RSS_class.rss)->list:# 链接,订阅名 r = await client.get(rss.geturl(),timeout=30) #print(rss.name+":"+str(r.status_code)+' 长度:'+str(len(r.content))) d = feedparser.parse(r.content) - #if(len(r.content)<3000): - # print(r.content) except BaseException as e: logger.error(e) if not rss.notrsshub and config.RSSHUB_backup: @@ -87,7 +87,7 @@ async def getRSS(rss:RSS_class.rss)->list:# 链接,订阅名 # print(Similarity.quick_ratio()) if Similarity.quick_ratio() <= 0.1: # 标题正文相似度 msg = msg + '标题:' + item['title'] + '\n' - msg = msg + '内容:' + await checkstr(item['summary'], rss.img_proxy, rss.translation) + '\n' + msg = msg + '内容:' + await checkstr(item['summary'], rss.img_proxy, rss.translation, rss.only_pic) + '\n' else: msg = msg + '标题:' + item['title'] + '\n' str_link = re.sub('member_illust.php\?mode=medium&illust_id=', 'i/', item['link']) @@ -145,6 +145,7 @@ async def sendMsg(rss,msg,bot): logger.info('发生错误 消息发送失败 E:'+str(e)) # 下载图片 +@retry async def dowimg(url:str,img_proxy:bool)->str: try: img_path = file_path + 'imgs' + os.sep @@ -236,8 +237,9 @@ async def zipPic(content,name): im.save(img_path + name + '.png', 'png') return name + '.png' + #处理正文 -async def checkstr(rss_str:str,img_proxy:bool,translation:bool)->str: +async def checkstr(rss_str:str,img_proxy:bool,translation:bool,only_pic:bool)->str: # 去掉换行 rss_str = re.sub('\n', '', rss_str) @@ -245,14 +247,22 @@ async def checkstr(rss_str:str,img_proxy:bool,translation:bool)->str: doc_rss = pq(rss_str) rss_str = str(doc_rss) + if config.showlottery == False: + if "互动抽奖" in rss_str: + logger.info("内容有互动抽奖,pass") + return + # 处理一些标签 + if config.blockquote == True: + rss_str = re.sub('
|
', '', rss_str) + else: + rss_str = re.sub('', '', rss_str) rss_str = re.sub('

|

|
|
', '\n', rss_str) rss_str = re.sub('||', '', rss_str) rss_str = re.sub('|', '', rss_str) rss_str = re.sub('

||

|||', '', rss_str) rss_str = re.sub('
||
', '', rss_str) rss_str = re.sub('
||
', '', rss_str) - rss_str = re.sub('
|
', '', rss_str) rss_str = re.sub('', '', rss_str) rss_str = re.sub('||', '', rss_str) rss_str = re.sub('||
    |
', '', rss_str) @@ -277,6 +287,9 @@ async def checkstr(rss_str:str,img_proxy:bool,translation:bool)->str: # 处理图片 doc_img = doc_rss('img') + if not doc_img and only_pic: + print("没有图片,pass") + return for img in doc_img.items(): rss_str_tl = re.sub(re.escape(str(img)), '', rss_str_tl) img_path = await dowimg(img.attr("src"), img_proxy) @@ -317,15 +330,24 @@ async def checkstr(rss_str:str,img_proxy:bool,translation:bool)->str: translator = Translator() # rss_str_tl = re.sub(r'\n', ' ', rss_str_tl) try: - text=emoji.demojize(rss_str_tl) + text = emoji.demojize(rss_str_tl) text = re.sub(r':[A-Za-z_]*:', ' ', text) - text = '\n翻译:\n' + translator.translate(re.escape(text), dest='zh-CN').text + if config.UseBaidu: + from . import rss_baidutrans + rss_str_tl = re.sub(r'\n', '百度翻译 ', rss_str_tl) + rss_str_tl = unicodedata.normalize('NFC', rss_str_tl) + text = emoji.demojize(rss_str_tl) + text = re.sub(r':[A-Za-z_]*:', ' ', text) + text = '\n翻译(BaiduAPI):\n' + rss_baidutrans.baidu_translate(re.escape(text)) + else: + text = '\n翻译:\n' + translator.translate(re.escape(text), dest='zh-CN').text text = re.sub(r'\\', '', text) + text = re.sub(r'百度翻译', '\n', text) except Exception as e: text = '\n翻译失败!'+str(e)+'\n' - print() - print(rss_str+text) - print() + #print() + #print("rss_str+text-----"+rss_str+text) + #print() return rss_str+text diff --git a/include/plugins/add_dy.py b/include/plugins/add_dy.py index 51794140..139d576b 100644 --- a/include/plugins/add_dy.py +++ b/include/plugins/add_dy.py @@ -15,7 +15,7 @@ @on_command('add', aliases=('订阅', 'dy', 'DY')) async def add(session: CommandSession): # 从会话状态(session.state)中获取订阅信息链接(link),如果当前不存在,则询问用户 - rss_dy_link = session.get('add', prompt='要订阅的信息不能为空呢,请重新输入\n输入样例:\ntest /twitter/user/xx 11,11 -1 5 1 0 \n订阅名 订阅地址 qq(,分隔,为空-1) 群号(,分隔,为空-1) 更新时间(分钟,可选) 1/0(代理,可选) 1/0(第三方订阅链接,可选) 1/0(翻译,可选) 1/0(仅标题,可选)') + rss_dy_link = session.get('add', prompt='要订阅的信息不能为空呢,请重新输入\n输入样例:\ntest /twitter/user/xx 11,11 -1 5 1 0 \n订阅名 订阅地址 qq(,分隔,为空-1) 群号(,分隔,为空-1) 更新时间(分钟,可选) 1/0(代理,可选) 1/0(第三方订阅链接,可选) 1/0(翻译,可选) 1/0(仅标题,可选) 1/0(仅图片,可选)') # 权限判断 user_id = session.ctx['user_id'] if user_id in config.ROOTUSER: @@ -51,7 +51,11 @@ async def add(session: CommandSession): only_title = bool(int(dy[8])) else: only_title = False - rss = RSS_class.rss(name, url, user_id, group_id, times, proxy, notrsshub,translation,only_title) + if len(dy) > 9: + only_pic = bool(int(dy[9])) + else: + only_pic = False + rss = RSS_class.rss(name, url, user_id, group_id, times, proxy, notrsshub,translation,only_title,only_pic) # 写入订阅配置文件 # 先读看是否重复再写 flag = 0 bot = nonebot.get_bot() diff --git a/include/plugins/change_dy.py b/include/plugins/change_dy.py index 370f956e..8ac1201b 100644 --- a/include/plugins/change_dy.py +++ b/include/plugins/change_dy.py @@ -15,7 +15,7 @@ @on_command('change') async def change(session: CommandSession): change_info = session.get('change', - prompt='输入要修改的订阅的 \n订阅名 修改项=,属性 \n如:\n 订阅 dyqq=,xx dsf=0\n对应参数: 订阅地址-url,订阅QQ-dyqq,订阅群-dyqun,更新频率-uptime,代理-proxy,第三方-dsf,翻译-tl,仅title-ot\n\n注:\n代理、第三方、翻译、仅title属性值为1/0\nqq、群号前加英文逗号表示追加') + prompt='输入要修改的订阅的 \n订阅名 修改项=,属性 \n如:\n 订阅 dyqq=,xx dsf=0\n对应参数: 订阅地址-url,订阅QQ-dyqq,订阅群-dyqun,更新频率-uptime,代理-proxy,第三方-dsf,翻译-tl,仅title-ot,仅图片-op\n\n注:\n代理、第三方、翻译、仅title、仅图片属性值为1/0\nqq、群号前加英文逗号表示追加') # 权限判断 user_id = session.ctx['user_id'] # print(type(user_id),type(config.ROOTUSER)) @@ -73,6 +73,8 @@ async def change(session: CommandSession): rss_tmp.translation = bool(int(info_this[1])) if info_this[0] == 'ot': rss_tmp.only_title = bool(int(info_this[1])) + if info_this[0] == 'op': + rss_tmp.only_pic = bool(int(info_this[1])) list_rss.remove(rss_a) list_rss.append(rss_tmp) RWlist.writeRss(list_rss) diff --git a/include/plugins/show_dy.py b/include/plugins/show_dy.py index bf1b0c28..6cc47275 100644 --- a/include/plugins/show_dy.py +++ b/include/plugins/show_dy.py @@ -30,7 +30,7 @@ async def show(session: CommandSession): await session.send( '名称:' + rss_.name + '\n订阅地址:' + rss_.url + '\n订阅QQ:' + str(rss_.user_id) + '\n订阅群:' + str( rss_.group_id) + '\n更新频率:' + str(rss_.time) + '分钟/次\n代理:' + str(rss_.img_proxy) + '\n第三方:' + str(rss_.notrsshub) - + '\n翻译:' + str(rss_.translation) + '\n仅标题:' + str(rss_.only_title)) + + '\n翻译:' + str(rss_.translation) + '\n仅标题:' + str(rss_.only_title) + '\n仅图片:' + str(rss_.only_pic)) flag = flag + 1 if flag <= 0: await session.send('没有找到 ' + rss_name + ' 的订阅哟!') diff --git a/requirements.txt b/requirements.txt index d5cd4a59..9b1d0b1e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,10 @@ +googletrans==2.4.0 +httpx==0.12.1 emoji==0.5.4 nonebot==1.5.0 -googletrans==2.4.0 requests==2.21.0 -httpx==0.12.1 feedparser==5.2.1 apscheduler==3.6.3 Pillow==7.2.0 pyquery==1.4.1 +retrying==1.3.3