Skip to content

Commit 2e186f0

Browse files
committed
更新v1.8
1 parent 0b80b67 commit 2e186f0

File tree

4 files changed

+71
-98
lines changed

4 files changed

+71
-98
lines changed

README.md

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
# 2022-03-04 本插件已整合进 [uma_plugin](https://github.com/azmiao/uma_plugin) ,虽然目前后续更新两个仓库都会同步更新,但强烈建议直接使用整合版,有更多功能
2-
3-
## 注意
4-
5-
有什么其他功能需求欢迎提交issue
6-
7-
虽然不一定经常更新,但要不点个star支持一下?
1+
# 2022-03-04 本插件已整合进 [uma_plugin](https://github.com/azmiao/uma_plugin) ,虽然目前后续更新两个仓库都会同步更新,但强烈建议直接使用整合版,有更多功能,另外整合版的新闻插件和本插件代码仍有部分不同。
82

93
## 更新日志
104

5+
22-04-28 v1.8 和整合版部分代码同步,全部更换异步函数,并移除pyyaml的依赖,减少一点响应延迟
6+
117
22-01-11 v1.7 精简翻译功能,去除了每次启动星乃的连接翻译服务器时间,无需安装翻译依赖了,所以可以`pip uninstall translators`
128

139
21-11-09 v1.6 修复部分Html代码的影响,并通过各种预防方法尽量让插件不容易被马娘官网的反爬虫发现
@@ -27,11 +23,7 @@
2723
news_text = news_text.replace('大米洗澡', '米浴')
2824
```
2925

30-
2. v1.5新增了马娘名/其他游戏术语的文本替换,替换内容均在`replace_dict.json`里,后续好兄弟们觉得可以增加可以直接pull request
31-
32-
3. 如果只更新文件`replace_dict.json`的时候可直接热重载,更新完改文件后无需重新启动hoshinobot
33-
34-
4. v1.6开始使用命令反应可能会慢一拍,因为我加了1秒的延迟
26+
2. 马娘名/其他游戏术语的文本替换在`replace_dict.json`里,但无法自动更新,但马娘插件整合版可以自动更新
3527

3628
## umamusume_news
3729

@@ -75,7 +67,6 @@ git clone https://github.com/azmiao/umamusume_news
7567

7668
到HoshinoBot\hoshino\modules\umamusume_news目录下,打开powershell运行
7769
```
78-
pip install pyyaml -i http://mirrors.aliyun.com/pypi/simple
7970
pip install pathos -i http://mirrors.aliyun.com/pypi/simple
8071
```
8172

@@ -89,4 +80,4 @@ pip install pathos -i http://mirrors.aliyun.com/pypi/simple
8980
```
9081
开启 umamusume-news-poller
9182
```
92-
可以通过发消息输入"lssv"查看这个功能前面是不是⚪来确认是否开启成功
83+
可以通过发消息输入"lssv"查看这个功能前面是不是⚪来确认是否开启成功

__init__.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import os
22
import shutil
3-
import hoshino
4-
from hoshino import Service, R, priv
5-
from hoshino.typing import *
6-
from hoshino.util import FreqLimiter, concat_pic, pic2b64, silence
3+
import asyncio
4+
from hoshino import Service, R
5+
from hoshino.util import FreqLimiter
76
from .news_spider import *
87

98
sv_help = '''=====功能=====
@@ -18,14 +17,15 @@
1817
_limtime = 20 # 单个人翻译冷却时间(单位:喵)
1918
_flmt = FreqLimiter(_limtime)
2019

21-
if os.path.exists(R.img('umamusume_news').path):
22-
shutil.rmtree(R.img('umamusume_news').path) #删除目录,包括目录下的所有文件
23-
os.mkdir(R.img('umamusume_news').path)
20+
dir_path = os.path.join(R.img('umamusume').path, 'umamusume_news/')
21+
if os.path.exists(dir_path):
22+
shutil.rmtree(dir_path) #删除目录,包括目录下的所有文件
23+
os.mkdir(dir_path)
2424
else:
25-
os.mkdir(R.img('umamusume_news').path)
25+
os.mkdir(dir_path)
2626

27-
sv = Service('umamusume_news', help_=sv_help, enable_on_default=True, bundle='马娘新闻订阅')
28-
svuma = Service('umamusume-news-poller', enable_on_default=False, help_='马娘新闻播报')
27+
sv = Service('umamusume_news', enable_on_default=True)
28+
svuma = Service('umamusume-news-poller', enable_on_default=False)
2929

3030
# 帮助界面
3131
@sv.on_fullmatch("马娘新闻帮助")
@@ -36,7 +36,7 @@ async def help(bot, ev):
3636
@sv.on_fullmatch(('马娘新闻', '赛马娘新闻'))
3737
async def uma_news(bot, ev):
3838
try:
39-
msg = get_news()
39+
msg = await get_news()
4040
except:
4141
msg = '获取新闻失败,请等5分钟后再次尝试'
4242
await bot.send(ev, msg)
@@ -45,9 +45,10 @@ async def uma_news(bot, ev):
4545
@svuma.scheduled_job('cron', minute='*/5')
4646
async def uma_news_poller():
4747
try:
48-
if (judge() == True):
48+
flag = await judge()
49+
if flag:
4950
svuma.logger.info('检测到马娘新闻更新!')
50-
await svuma.broadcast(news_broadcast(), 'umamusume-news-poller', 0.2)
51+
await svuma.broadcast(await news_broadcast(), 'umamusume-news-poller', 0.2)
5152
else:
5253
svuma.logger.info('暂未检测到马娘新闻更新')
5354
return
@@ -62,7 +63,7 @@ async def select_source(bot, ev):
6263
await bot.send(ev, f'请勿频繁操作,冷却时间为{_limtime}秒!', at_sender=True)
6364
return
6465
try:
65-
news_list = sort_news()
66+
news_list = await sort_news()
6667
except Exception as e:
6768
msg = f'错误!马娘官网连接失败,原因:{e}'
6869
await bot.send(ev, msg)
@@ -86,5 +87,10 @@ async def select_source(bot, ev):
8687
msg = f'马娘新闻《{news.news_title}》翻译内容如下:\n\n'
8788
news_url_tmp = news.news_url
8889
news_id = int(news_url_tmp.replace('▲https://umamusume.jp/news/detail.php?id=', ''))
89-
msg = msg + translate_news(news_id)
90-
await bot.send(ev, msg)
90+
await asyncio.sleep(0.5)
91+
msg += await translate_news(news_id)
92+
try:
93+
await bot.send(ev, msg)
94+
except Exception as err:
95+
if err == '<ActionFailed, retcode=100>':
96+
await bot.send(ev, "翻译内容被风控,发送失败!请稍后尝试!")

news_spider.py

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,30 @@
88
import operator
99
from .translator_lite.apis import youdao
1010
from io import BytesIO
11-
import yaml
1211
import random
13-
import time
12+
import asyncio
1413
from hoshino import R
1514

15+
# 随机挑选一个小可爱作为header
1616
user_agent_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
1717
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
1818
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
1919
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
2020
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
2121
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
2222
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
23-
]
23+
]
2424

25+
# 新闻类
2526
class news_class:
2627
def __init__(self,news_time,news_url,news_title):
2728
self.news_time = news_time
2829
self.news_url = news_url
2930
self.news_title = news_title
3031

31-
def get_item():
32-
time.sleep(1)
32+
# 获取列表
33+
async def get_item():
34+
await asyncio.sleep(0.5)
3335
url = 'https://umamusume.jp/api/ajax/pr_info_index?format=json'
3436
data = {}
3537
data['announce_label'] = 0
@@ -46,13 +48,14 @@ def get_item():
4648
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
4749
'content-type': 'application/json;charset=UTF-8'
4850
}
49-
with requests.post(url=url,data=json.dumps(data),headers=headers, timeout=(5,10), stream = True) as res:
51+
with requests.post(url = url, data = json.dumps(data), headers = headers, timeout=(5,10), stream = True) as res:
5052
res_dict = res.json()
5153
res.close()
5254
return res_dict
5355

54-
def sort_news():
55-
res_dict = get_item()
56+
# 调整新闻列表
57+
async def sort_news():
58+
res_dict = await get_item()
5659
news_list = []
5760
for n in range(0, 5):
5861
if (res_dict['information_list'][n]['update_at'] == None):
@@ -69,26 +72,26 @@ def sort_news():
6972
news_list.sort(key = news_key, reverse = True)
7073
return news_list
7174

72-
def get_news():
73-
news_list = sort_news()
75+
# 获取新闻
76+
async def get_news():
77+
news_list = await sort_news()
7478
msg = '◎◎ 马娘官网新闻 ◎◎\n'
7579
for news in news_list:
7680
time_tmp = datetime.datetime.strptime(news.news_time, '%Y-%m-%d %H:%M:%S')
7781
news_time = time_tmp - timedelta(hours=1)
7882
msg = msg + '\n' + str(news_time) + '\n' + news.news_title + '\n' + news.news_url + '\n'
7983
current_dir = os.path.join(os.path.dirname(__file__), 'prev_time.yml')
8084
prev_time = news_list[0].news_time
81-
file = open(current_dir, 'w', encoding="UTF-8")
82-
file.write(str(prev_time))
83-
file.close()
85+
with open(current_dir, 'w', encoding="UTF-8") as f:
86+
f.write(str(prev_time))
8487
return msg
8588

86-
def news_broadcast():
87-
news_list = sort_news()
89+
# 获取新闻更新
90+
async def news_broadcast():
91+
news_list = await sort_news()
8892
current_dir = os.path.join(os.path.dirname(__file__), 'prev_time.yml')
89-
file = open(current_dir, 'r', encoding="UTF-8")
90-
init_time = str(file.read())
91-
file.close()
93+
with open(current_dir, 'r', encoding="UTF-8") as f:
94+
init_time = str(f.read())
9295
init_time = datetime.datetime.strptime(init_time, '%Y-%m-%d %H:%M:%S')
9396
msg = '◎◎ 马娘官网新闻更新 ◎◎\n'
9497
for news in news_list:
@@ -103,32 +106,27 @@ def news_broadcast():
103106
for news in news_list:
104107
set_time = news.news_time
105108
break
106-
file = open(current_dir, 'w', encoding="UTF-8")
107-
file.write(str(set_time))
108-
file.close()
109+
with open(current_dir, 'w', encoding="UTF-8") as f:
110+
f.write(str(set_time))
109111
return msg
110112

111113
# 判断一下是否有更新,为什么要单独写一个函数呢
112114
# 函数单独写一个是怎么回事呢?函数相信大家都很熟悉,但是函数单独写一个是怎么回事呢,下面就让小编带大家一起了解吧。
113115
# 函数单独写一个,其实就是我想单独写一个函数,大家可能会很惊讶函数怎么会单独写一个呢?但事实就是这样,小编也感到非常惊讶。
114116
# 这就是关于函数单独写一个的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!
115-
def judge() -> bool:
117+
async def judge() -> bool:
116118
current_dir = os.path.join(os.path.dirname(__file__), 'prev_time.yml')
117-
if (os.path.exists(current_dir) == True):
118-
file = open(current_dir, 'r', encoding="UTF-8")
119-
init_time = str(file.read())
120-
file.close()
119+
news_list = await sort_news()
120+
if os.path.exists(current_dir):
121+
with open(current_dir, 'r', encoding="UTF-8") as f:
122+
init_time = str(f.read())
121123
else:
122-
news_list = sort_news()
123124
for news in news_list:
124125
init_time = news.news_time
125126
break
126127
current_dir = os.path.join(os.path.dirname(__file__), 'prev_time.yml')
127-
file = open(current_dir, 'w', encoding="UTF-8")
128-
file.write(str(init_time))
129-
file.close()
130-
131-
news_list = sort_news()
128+
with open(current_dir, 'w', encoding="UTF-8") as f:
129+
f.write(str(init_time))
132130
for news in news_list:
133131
prev_time = news.news_time
134132
break
@@ -139,7 +137,7 @@ def judge() -> bool:
139137
return False
140138

141139
# 替换不必要的文本
142-
def replace_text(text_tmp):
140+
async def replace_text(text_tmp):
143141
# 替换多余的html关键字
144142
text = text_tmp.replace('&nbsp;', ' ')
145143
text = re.sub(r'<div.*?>', '', text)
@@ -157,24 +155,21 @@ def replace_text(text_tmp):
157155
text = re.sub(r'<br>', '\n\n', text)
158156
# 替换赛马娘游戏术语
159157
current_dir = os.path.join(os.path.dirname(__file__), 'replace_dict.json')
160-
file = open(current_dir, 'r', encoding = 'UTF-8')
161-
file_data = file.read()
162-
file.close()
163-
config = yaml.load(file_data, Loader = yaml.FullLoader)
164-
keys_list = list(config.keys())
165-
for key in keys_list:
166-
value = config[key]
158+
with open(current_dir, 'r', encoding = 'UTF-8') as other_file:
159+
other_dict = json.load(other_file)
160+
for key in list(other_dict.keys()):
161+
value = other_dict[key]
167162
text = text.replace(f'{key}', f'{value}')
168163
return text
169164

170165
# 翻译完如果把中文又翻译一遍导致出问题可以在这里,再次替换一下?
171-
def second_replace(news_text):
166+
async def second_replace(news_text):
172167
# news_text = news_text.replace('', '') # 我先注释了
173168
return news_text
174169

175170
# 翻译新闻
176-
def translate_news(news_id):
177-
time.sleep(1)
171+
async def translate_news(news_id):
172+
await asyncio.sleep(0.5)
178173
url = 'https://umamusume.jp/api/ajax/pr_info_detail?format=json'
179174
data = {}
180175
data['announce_id'] = news_id
@@ -195,31 +190,31 @@ def translate_news(news_id):
195190
res_dict = res.json()
196191
res.close()
197192
if res_dict['detail']['title'] == '現在確認している不具合について':
198-
news_msg = res_dict['detail']['message'][:500] + '...'
193+
news_msg = res_dict['detail']['message'][:1000] + '...'
199194
flag = 1
200195
else:
201196
news_msg = res_dict['detail']['message']
202-
news_msg = replace_text(news_msg)
197+
news_msg = await replace_text(news_msg)
203198
except:
204199
news_text = '错误!马娘官网连接失败'
205200
return news_text
206201
try:
207202
news_text = youdao(news_msg, 'ja', 'zh')
208-
news_text = second_replace(news_text)
203+
news_text = await second_replace(news_text)
209204
if flag == 1:
210-
news_text = '(该新闻特别长,因此只显示前500个字符)\n\n' + news_text
205+
news_text = '(该新闻特别长,因此只显示前1000个字符)\n\n' + news_text
211206
if res_dict['detail']['image_big'] != '':
212207
img_url = res_dict['detail']['image_big']
213208
response = requests.get(img_url)
214209
ls_f = base64.b64encode(BytesIO(response.content).read())
215210
imgdata = base64.b64decode(ls_f)
216-
save_dir = R.img('umamusume_news').path
211+
save_dir = os.path.join(R.img('umamusume').path, 'umamusume_news/')
217212
path_dir = os.path.join(save_dir,'news_img.jpg')
218213
file = open(path_dir,'wb')
219214
file.write(imgdata)
220215
file.close()
221216
news_img = ' '.join(map(str, [
222-
R.img(f'umamusume_news/news_img.jpg').cqcode,
217+
R.img(f'umamusume/umamusume_news/news_img.jpg').cqcode,
223218
]))
224219
news_text = f'{news_img}' + news_text
225220
except Exception as e:

translator_lite/test.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)