mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-04 11:20:01 +08:00
update 0.0.6.2
This commit is contained in:
Regular → Executable
Regular → Executable
+26
-33
@@ -1,11 +1,11 @@
|
||||
import aiohttp
|
||||
from bs4 import BeautifulSoup
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
from .config import DRAW_PATH
|
||||
from pathlib import Path
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from services.log import logger
|
||||
from utils.http_utils import AsyncHttpx
|
||||
import re
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
@@ -66,16 +66,14 @@ class PrtsAnnouncement:
|
||||
self.game_name = '明日方舟'
|
||||
|
||||
async def _get_announcement_text(self):
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(prts_url, timeout=7) as res:
|
||||
soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
ol = soup.find('ol', {'class': 'articleList active', 'data-category-key': 'LATEST'})
|
||||
for li in ol:
|
||||
itype = li.find('span', {'class': 'articleItemCate'}).text
|
||||
if itype == '活动':
|
||||
a = li.find('a')['href']
|
||||
async with session.get(f'https://ak.hypergryph.com{a}', headers=headers, timeout=7) as res:
|
||||
return await res.text()
|
||||
text = (await AsyncHttpx.get(prts_url)).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
ol = soup.find('ol', {'class': 'articleList active', 'data-category-key': 'LATEST'})
|
||||
for li in ol:
|
||||
itype = li.find('span', {'class': 'articleItemCate'}).text
|
||||
if itype == '活动':
|
||||
a = li.find('a')['href']
|
||||
return (await AsyncHttpx.get(f'https://ak.hypergryph.com{a}')).text
|
||||
|
||||
async def update_up_char(self):
|
||||
prts_up_char.parent.mkdir(parents=True, exist_ok=True)
|
||||
@@ -147,9 +145,7 @@ class GenshinAnnouncement:
|
||||
self.game_name = '原神'
|
||||
|
||||
async def _get_announcement_text(self):
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(genshin_url, timeout=7) as res:
|
||||
return await res.text()
|
||||
return (await AsyncHttpx.get(genshin_url)).text
|
||||
|
||||
async def update_up_char(self):
|
||||
genshin_up_char.parent.mkdir(exist_ok=True, parents=True)
|
||||
@@ -218,21 +214,20 @@ class PrettyAnnouncement:
|
||||
self.game_name = '赛马娘'
|
||||
|
||||
async def _get_announcement_text(self):
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(pretty_url, timeout=7) as res:
|
||||
soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
divs = soup.find('div', {'id': 'mw-content-text'}).find('div').find_all('div')
|
||||
for div in divs:
|
||||
a = div.find('a')
|
||||
try:
|
||||
title = a['title']
|
||||
except (KeyError, TypeError):
|
||||
continue
|
||||
if title.find('新角色追加') != -1:
|
||||
url = a['href']
|
||||
break
|
||||
async with session.get(f'https://wiki.biligame.com/{url}', timeout=7) as res:
|
||||
return await res.text(), title[:-2]
|
||||
text = (await AsyncHttpx.get(pretty_url)).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
divs = soup.find('div', {'id': 'mw-content-text'}).find('div').find_all('div')
|
||||
title = " "
|
||||
for div in divs:
|
||||
a = div.find('a')
|
||||
try:
|
||||
title = a['title']
|
||||
except (KeyError, TypeError):
|
||||
continue
|
||||
if title.find('新角色追加') != -1:
|
||||
url = a['href']
|
||||
break
|
||||
return (await AsyncHttpx.get(f'https://wiki.biligame.com/{url}')).text, title[:-2]
|
||||
|
||||
async def update_up_char(self):
|
||||
pretty_up_char.parent.mkdir(exist_ok=True, parents=True)
|
||||
@@ -343,9 +338,7 @@ class GuardianAnnouncement:
|
||||
self.game_name = '坎公骑冠剑'
|
||||
|
||||
async def _get_announcement_text(self):
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(guardian_url, timeout=7) as res:
|
||||
return await res.text()
|
||||
return (await AsyncHttpx.get(guardian_url)).text
|
||||
|
||||
async def update_up_char(self):
|
||||
data = {
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+39
-11
@@ -2,6 +2,7 @@ from typing import Any
|
||||
from .config import DATA_PATH
|
||||
from utils.utils import is_number
|
||||
from pathlib import Path
|
||||
from services.log import logger
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
@@ -27,8 +28,11 @@ def init_game_pool(game: str, data: dict, Operator: Any):
|
||||
limited = True
|
||||
if key.find('阿米娅') != -1:
|
||||
continue
|
||||
tmp_lst.append(Operator(name=key, star=int(data[key]['星级']),
|
||||
limited=limited, recruit_only=recruit_only, event_only=event_only))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=key, star=int(data[key]['星级']),
|
||||
limited=limited, recruit_only=recruit_only, event_only=event_only))
|
||||
except Exception as e:
|
||||
logger.warning(f"明日方舟导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
if game == 'genshin':
|
||||
for key in data.keys():
|
||||
if key.find('旅行者') != -1:
|
||||
@@ -36,17 +40,26 @@ def init_game_pool(game: str, data: dict, Operator: Any):
|
||||
limited = False
|
||||
if data[key]['常驻/限定'] == '限定UP':
|
||||
limited = True
|
||||
tmp_lst.append(Operator(name=key, star=int(data[key]['稀有度'][:1]), limited=limited))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=key, star=int(data[key]['稀有度'][:1]), limited=limited))
|
||||
except Exception as e:
|
||||
logger.warning(f"原神导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
if game == 'genshin_arms':
|
||||
for key in data.keys():
|
||||
if data[key]['获取途径'].find('祈愿') != -1:
|
||||
limited = False
|
||||
if data[key]['获取途径'].find('限定祈愿') != -1:
|
||||
limited = True
|
||||
tmp_lst.append(Operator(name=key, star=int(data[key]['稀有度'][:1]), limited=limited))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=key, star=int(data[key]['稀有度'][:1]), limited=limited))
|
||||
except Exception as e:
|
||||
logger.warning(f"原神导入武器 {key} 数据错误:{type(e)}:{e}")
|
||||
if game == 'pretty':
|
||||
for key in data.keys():
|
||||
tmp_lst.append(Operator(name=key, star=data[key]['初始星级'], limited=False))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=key, star=data[key]['初始星级'], limited=False))
|
||||
except Exception as e:
|
||||
logger.warning(f"赛马娘导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
if game == 'pretty_card':
|
||||
for key in data.keys():
|
||||
limited = False
|
||||
@@ -54,7 +67,10 @@ def init_game_pool(game: str, data: dict, Operator: Any):
|
||||
limited = True
|
||||
if not data[key]['获取方式']:
|
||||
limited = False
|
||||
tmp_lst.append(Operator(name=data[key]['中文名'], star=len(data[key]['稀有度']), limited=limited))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=data[key]['中文名'], star=len(data[key]['稀有度']), limited=limited))
|
||||
except Exception as e:
|
||||
logger.warning(f"赛马娘导入卡片 {key} 数据错误:{type(e)}:{e}")
|
||||
if game in ['guardian', 'guardian_arms']:
|
||||
for key in data.keys():
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']), limited=False))
|
||||
@@ -63,15 +79,21 @@ def init_game_pool(game: str, data: dict, Operator: Any):
|
||||
limited = False
|
||||
if key.find('(') != -1:
|
||||
limited = True
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']), limited=limited))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']), limited=limited))
|
||||
except Exception as e:
|
||||
logger.warning(f"公主连接导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
if game == 'azur':
|
||||
for key in data.keys():
|
||||
if is_number(data[key]['星级']):
|
||||
limited = False
|
||||
if '可以建造' not in data[key]['获取途径']:
|
||||
limited = True
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']),
|
||||
limited=limited, itype=data[key]['类型']))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']),
|
||||
limited=limited, itype=data[key]['类型']))
|
||||
except Exception as e:
|
||||
logger.warning(f"碧蓝航线导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
if game in ['fgo', 'fgo_card']:
|
||||
for key in data.keys():
|
||||
limited = False
|
||||
@@ -80,14 +102,20 @@ def init_game_pool(game: str, data: dict, Operator: Any):
|
||||
limited = True
|
||||
except KeyError:
|
||||
pass
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']), limited=limited))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=int(data[key]['星级']), limited=limited))
|
||||
except Exception as e:
|
||||
logger.warning(f"FGO导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
if game == 'onmyoji':
|
||||
for key in data.keys():
|
||||
limited = False
|
||||
if key in ['奴良陆生', '卖药郎', '鬼灯', '阿香', '蜜桃&芥子', '犬夜叉', '杀生丸', '桔梗', '朽木露琪亚', '黑崎一护',
|
||||
'灶门祢豆子', '灶门炭治郎']:
|
||||
limited = True
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=data[key]['星级'], limited=limited))
|
||||
try:
|
||||
tmp_lst.append(Operator(name=data[key]['名称'], star=data[key]['星级'], limited=limited))
|
||||
except Exception as e:
|
||||
logger.warning(f"阴阳师导入角色 {key} 数据错误:{type(e)}:{e}")
|
||||
# print(tmp_lst)
|
||||
char_name_lst = [x.name for x in tmp_lst]
|
||||
up_char_file = Path(f'{DATA_PATH}/draw_card/draw_card_up/{game.split("_")[0]}_up_char.json')
|
||||
|
||||
Regular → Executable
-1
@@ -6,7 +6,6 @@ from .util import generate_img, init_star_rst, BaseData, set_list, get_star, max
|
||||
from .config import ONMYOJI_SR, ONMYOJI_SSR, ONMYOJI_SP, ONMYOJI_R, DRAW_PATH, ONMYOJI_FLAG
|
||||
from dataclasses import dataclass
|
||||
from .init_card_pool import init_game_pool
|
||||
import nonebot
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
|
||||
Regular → Executable
-3
@@ -1,7 +1,5 @@
|
||||
import ujson as json
|
||||
import os
|
||||
from nonebot.adapters.cqhttp import MessageSegment
|
||||
import nonebot
|
||||
import random
|
||||
from .update_game_info import update_info
|
||||
from .update_game_simple_info import update_simple_info
|
||||
@@ -10,7 +8,6 @@ from .config import PCR_TWO_P, PCR_THREE_P, PCR_ONE_P, DRAW_PATH, PCR_FLAG, PCR_
|
||||
from dataclasses import dataclass
|
||||
from .init_card_pool import init_game_pool
|
||||
|
||||
driver: nonebot.Driver = nonebot.get_driver()
|
||||
|
||||
ALL_CHAR = []
|
||||
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+57
-60
@@ -1,13 +1,11 @@
|
||||
#coding:utf-8
|
||||
import aiohttp
|
||||
from .config import DRAW_PATH
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from bs4 import BeautifulSoup
|
||||
import asyncio
|
||||
from .util import download_img
|
||||
from urllib.parse import unquote
|
||||
from services.log import logger
|
||||
from .util import remove_prohibited_str
|
||||
from utils.http_utils import AsyncHttpx
|
||||
import bs4
|
||||
import re
|
||||
try:
|
||||
@@ -26,40 +24,39 @@ async def update_info(url: str, game_name: str, info_list: list = None) -> 'dict
|
||||
except (ValueError, FileNotFoundError):
|
||||
data = {}
|
||||
try:
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(url, timeout=7) as response:
|
||||
soup = BeautifulSoup(await response.text(), 'lxml')
|
||||
_tbody = get_tbody(soup, game_name, url)
|
||||
trs = _tbody.find_all('tr')
|
||||
att_dict, start_index, index = init_attr(game_name)
|
||||
if game_name == 'guardian':
|
||||
start_index = 1
|
||||
if game_name == 'azur':
|
||||
start_index = 0
|
||||
for th in trs[0].find_all('th')[start_index:]:
|
||||
text = th.text
|
||||
if text[-1] == '\n':
|
||||
text = text[:-1]
|
||||
att_dict[text] = index
|
||||
index += 1
|
||||
for tr in trs[1:]:
|
||||
member_dict = {}
|
||||
tds = tr.find_all('td')
|
||||
if not info_list:
|
||||
info_list = att_dict.keys()
|
||||
for key in info_list:
|
||||
key, attr = parse_key(key, game_name)
|
||||
td = tds[att_dict[key]]
|
||||
last_tag = unquote(_find_last_tag(td, attr, game_name), 'utf-8')
|
||||
member_dict[key] = last_tag
|
||||
member_dict = intermediate_check(member_dict, key, game_name, td)
|
||||
avatar_img = await _modify_avatar_url(session, game_name, member_dict["名称"])
|
||||
member_dict['头像'] = avatar_img if avatar_img else member_dict['头像']
|
||||
member_dict, name = replace_update_name(member_dict, game_name)
|
||||
await download_img(member_dict['头像'], game_name, name)
|
||||
data[name] = member_dict
|
||||
logger.info(f'{name} is update...')
|
||||
data = await _last_check(data, game_name, session)
|
||||
text = (await AsyncHttpx.get(url)).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
_tbody = get_tbody(soup, game_name, url)
|
||||
trs = _tbody.find_all('tr')
|
||||
att_dict, start_index, index = init_attr(game_name)
|
||||
if game_name == 'guardian':
|
||||
start_index = 1
|
||||
if game_name == 'azur':
|
||||
start_index = 0
|
||||
for th in trs[0].find_all('th')[start_index:]:
|
||||
text = th.text
|
||||
if text[-1] == '\n':
|
||||
text = text[:-1]
|
||||
att_dict[text] = index
|
||||
index += 1
|
||||
for tr in trs[1:]:
|
||||
member_dict = {}
|
||||
tds = tr.find_all('td')
|
||||
if not info_list:
|
||||
info_list = att_dict.keys()
|
||||
for key in info_list:
|
||||
key, attr = parse_key(key, game_name)
|
||||
td = tds[att_dict[key]]
|
||||
last_tag = unquote(_find_last_tag(td, attr, game_name), 'utf-8')
|
||||
member_dict[key] = last_tag
|
||||
member_dict = intermediate_check(member_dict, key, game_name, td)
|
||||
avatar_img = await _modify_avatar_url(game_name, member_dict["名称"])
|
||||
member_dict['头像'] = avatar_img if avatar_img else member_dict['头像']
|
||||
member_dict, name = replace_update_name(member_dict, game_name)
|
||||
await download_img(member_dict['头像'], game_name, name)
|
||||
data[name] = member_dict
|
||||
logger.info(f'{name} is update...')
|
||||
data = await _last_check(data, game_name)
|
||||
except TimeoutError:
|
||||
logger.warning(f'更新 {game_name} 超时...')
|
||||
return {}, 999
|
||||
@@ -97,7 +94,7 @@ def _find_last_tag(element: bs4.element.Tag, attr: str, game_name: str) -> str:
|
||||
|
||||
|
||||
# 获取大图(小图快爬)
|
||||
async def _modify_avatar_url(session: aiohttp.ClientSession, game_name: str, char_name: str):
|
||||
async def _modify_avatar_url(game_name: str, char_name: str):
|
||||
# if game_name == 'prts':
|
||||
# async with session.get(f'https://wiki.biligame.com/arknights/{char_name}', timeout=7) as res:
|
||||
# soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
@@ -109,10 +106,10 @@ async def _modify_avatar_url(session: aiohttp.ClientSession, game_name: str, cha
|
||||
if game_name == 'genshin':
|
||||
return None
|
||||
if game_name == 'pretty_card':
|
||||
async with session.get(f'https://wiki.biligame.com/umamusume/{char_name}', timeout=7) as res:
|
||||
soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
img_url = soup.find('div', {'class': 'support_card-left'}).find('div').find('img').get('src')
|
||||
return img_url
|
||||
text = (await AsyncHttpx.get(f'https://wiki.biligame.com/umamusume/{char_name}')).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
img_url = soup.find('div', {'class': 'support_card-left'}).find('div').find('img').get('src')
|
||||
return img_url
|
||||
if game_name == 'guardian':
|
||||
# 未上传图片太多,换成像素图
|
||||
# async with session.get(f'https://wiki.biligame.com/gt/{char_name}', timeout=7) as res:
|
||||
@@ -130,7 +127,7 @@ async def _modify_avatar_url(session: aiohttp.ClientSession, game_name: str, cha
|
||||
|
||||
|
||||
# 数据最后处理(是否需要额外数据或处理数据)
|
||||
async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession):
|
||||
async def _last_check(data: dict, game_name: str):
|
||||
# if game_name == 'prts':
|
||||
# url = 'https://wiki.biligame.com/arknights/'
|
||||
# tasks = []
|
||||
@@ -142,23 +139,23 @@ async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession
|
||||
# data[key]['获取途径'] = x[key]['获取途径']
|
||||
if game_name == 'genshin':
|
||||
for key in data.keys():
|
||||
async with session.get(f'https://wiki.biligame.com/ys/{key}', timeout=7) as res:
|
||||
soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
_trs = ''
|
||||
for table in soup.find_all('table', {'class': 'wikitable'}):
|
||||
if str(table).find('常驻/限定') != -1:
|
||||
_trs = table.find('tbody').find_all('tr')
|
||||
break
|
||||
for tr in _trs:
|
||||
data[key]['常驻/限定'] = '未知'
|
||||
if str(tr).find('限定UP') != -1:
|
||||
data[key]['常驻/限定'] = '限定UP'
|
||||
logger.info(f'原神获取额外数据 {key}...{data[key]["常驻/限定"]}')
|
||||
break
|
||||
elif str(tr).find('常驻UP') != -1:
|
||||
data[key]['常驻/限定'] = '常驻UP'
|
||||
logger.info(f'原神获取额外数据 {key}...{data[key]["常驻/限定"]}')
|
||||
break
|
||||
text = (await AsyncHttpx.get(f'https://wiki.biligame.com/ys/{key}')).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
_trs = ''
|
||||
for table in soup.find_all('table', {'class': 'wikitable'}):
|
||||
if str(table).find('常驻/限定') != -1:
|
||||
_trs = table.find('tbody').find_all('tr')
|
||||
break
|
||||
for tr in _trs:
|
||||
data[key]['常驻/限定'] = '未知'
|
||||
if str(tr).find('限定UP') != -1:
|
||||
data[key]['常驻/限定'] = '限定UP'
|
||||
logger.info(f'原神获取额外数据 {key}...{data[key]["常驻/限定"]}')
|
||||
break
|
||||
elif str(tr).find('常驻UP') != -1:
|
||||
data[key]['常驻/限定'] = '常驻UP'
|
||||
logger.info(f'原神获取额外数据 {key}...{data[key]["常驻/限定"]}')
|
||||
break
|
||||
if game_name == 'pretty':
|
||||
for keys in data.keys():
|
||||
for key in data[keys].keys():
|
||||
|
||||
Regular → Executable
+98
-93
@@ -1,58 +1,59 @@
|
||||
import aiohttp
|
||||
from .config import DRAW_PATH, SEMAPHORE
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from .util import download_img
|
||||
from bs4 import BeautifulSoup
|
||||
from .util import remove_prohibited_str
|
||||
from utils.http_utils import AsyncHttpx
|
||||
from services.log import logger
|
||||
import asyncio
|
||||
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
import json
|
||||
|
||||
|
||||
headers = {'User-Agent': '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"'}
|
||||
headers = {
|
||||
"User-Agent": '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"'
|
||||
}
|
||||
|
||||
|
||||
async def update_requests_info(game_name: str):
|
||||
try:
|
||||
with open(DRAW_PATH + f'{game_name}.json', 'r', encoding='utf8') as f:
|
||||
with open(DRAW_PATH + f"{game_name}.json", "r", encoding="utf8") as f:
|
||||
data = json.load(f)
|
||||
except (ValueError, FileNotFoundError):
|
||||
data = {}
|
||||
try:
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
if game_name in ['fgo', 'fgo_card']:
|
||||
if game_name == 'fgo':
|
||||
url = 'http://fgo.vgtime.com/servant/ajax?card=&wd=&ids=&sort=12777&o=desc&pn='
|
||||
else:
|
||||
url = 'http://fgo.vgtime.com/equipment/ajax?wd=&ids=&sort=12958&o=desc&pn='
|
||||
for i in range(9999):
|
||||
async with session.get(f'{url}{i}', timeout=7) as response:
|
||||
fgo_data = json.loads(await response.text())
|
||||
if int(fgo_data['nums']) == 0:
|
||||
break
|
||||
for x in fgo_data['data']:
|
||||
x['name'] = remove_prohibited_str(x['name'])
|
||||
key = x['name']
|
||||
data = add_to_data(data, x, game_name)
|
||||
await download_img(data[key]['头像'], game_name, key)
|
||||
logger.info(f'{key} is update...')
|
||||
if game_name == 'onmyoji':
|
||||
url = 'https://yys.res.netease.com/pc/zt/20161108171335/js/app/all_shishen.json?v74='
|
||||
async with session.get(f'{url}', timeout=7) as response:
|
||||
onmyoji_data = await response.json()
|
||||
for x in onmyoji_data:
|
||||
x['name'] = remove_prohibited_str(x['name'])
|
||||
key = x['name']
|
||||
data = add_to_data(data, x, game_name)
|
||||
logger.info(f'{key} is update...')
|
||||
data = await _last_check(data, game_name, session)
|
||||
if game_name in ["fgo", "fgo_card"]:
|
||||
if game_name == "fgo":
|
||||
url = "http://fgo.vgtime.com/servant/ajax?card=&wd=&ids=&sort=12777&o=desc&pn="
|
||||
else:
|
||||
url = "http://fgo.vgtime.com/equipment/ajax?wd=&ids=&sort=12958&o=desc&pn="
|
||||
for i in range(9999):
|
||||
text = (await AsyncHttpx.get(f"{url}{i}")).text
|
||||
fgo_data = json.loads(text)
|
||||
if int(fgo_data["nums"]) == 0:
|
||||
break
|
||||
for x in fgo_data["data"]:
|
||||
x["name"] = remove_prohibited_str(x["name"])
|
||||
key = x["name"]
|
||||
data = add_to_data(data, x, game_name)
|
||||
await download_img(data[key]["头像"], game_name, key)
|
||||
logger.info(f"{key} is update...")
|
||||
if game_name == "onmyoji":
|
||||
url = "https://yys.res.netease.com/pc/zt/20161108171335/js/app/all_shishen.json?v74="
|
||||
onmyoji_data = (await AsyncHttpx.get(f"{url}")).json()
|
||||
for x in onmyoji_data:
|
||||
x["name"] = remove_prohibited_str(x["name"])
|
||||
key = x["name"]
|
||||
data = add_to_data(data, x, game_name)
|
||||
logger.info(f"{key} is update...")
|
||||
data = await _last_check(data, game_name)
|
||||
except TimeoutError:
|
||||
logger.warning(f'更新 {game_name} 超时...')
|
||||
logger.warning(f"更新 {game_name} 超时...")
|
||||
return {}, 999
|
||||
with open(DRAW_PATH + f'{game_name}.json', 'w', encoding='utf8') as wf:
|
||||
with open(DRAW_PATH + f"{game_name}.json", "w", encoding="utf8") as wf:
|
||||
json.dump(data, wf, ensure_ascii=False, indent=4)
|
||||
return data, 200
|
||||
|
||||
@@ -60,91 +61,95 @@ async def update_requests_info(game_name: str):
|
||||
# 添加到字典
|
||||
def add_to_data(data: dict, x: dict, game_name: str) -> dict:
|
||||
member_dict = {}
|
||||
if game_name == 'fgo':
|
||||
if game_name == "fgo":
|
||||
member_dict = {
|
||||
'id': x['id'],
|
||||
'card_id': x['charid'],
|
||||
'头像': x['icon'],
|
||||
'名称': x['name'],
|
||||
'职阶': x['classes'],
|
||||
'星级': x['star'],
|
||||
'hp': x['lvmax4hp'],
|
||||
'atk': x['lvmax4atk'],
|
||||
'card_quick': x['cardquick'],
|
||||
'card_arts': x['cardarts'],
|
||||
'card_buster': x['cardbuster'],
|
||||
'宝具': x['tprop'],
|
||||
"id": x["id"],
|
||||
"card_id": x["charid"],
|
||||
"头像": x["icon"],
|
||||
"名称": x["name"],
|
||||
"职阶": x["classes"],
|
||||
"星级": x["star"],
|
||||
"hp": x["lvmax4hp"],
|
||||
"atk": x["lvmax4atk"],
|
||||
"card_quick": x["cardquick"],
|
||||
"card_arts": x["cardarts"],
|
||||
"card_buster": x["cardbuster"],
|
||||
"宝具": x["tprop"],
|
||||
}
|
||||
if game_name == 'fgo_card':
|
||||
if game_name == "fgo_card":
|
||||
member_dict = {
|
||||
'id': x['id'],
|
||||
'card_id': x['equipid'],
|
||||
'头像': x['icon'],
|
||||
'名称': x['name'],
|
||||
'星级': x['star'],
|
||||
'hp': x['lvmax_hp'],
|
||||
'atk': x['lvmax_atk'],
|
||||
'skill_e': x['skill_e'].split('<br />')[: -1],
|
||||
"id": x["id"],
|
||||
"card_id": x["equipid"],
|
||||
"头像": x["icon"],
|
||||
"名称": x["name"],
|
||||
"星级": x["star"],
|
||||
"hp": x["lvmax_hp"],
|
||||
"atk": x["lvmax_atk"],
|
||||
"skill_e": x["skill_e"].split("<br />")[:-1],
|
||||
}
|
||||
if game_name == 'onmyoji':
|
||||
if game_name == "onmyoji":
|
||||
member_dict = {
|
||||
'id': x['id'],
|
||||
'名称': x['name'],
|
||||
'星级': x['level'],
|
||||
"id": x["id"],
|
||||
"名称": x["name"],
|
||||
"星级": x["level"],
|
||||
}
|
||||
data[member_dict['名称']] = member_dict
|
||||
data[member_dict["名称"]] = member_dict
|
||||
return data
|
||||
|
||||
|
||||
# 获取额外数据
|
||||
async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession) -> dict:
|
||||
if game_name == 'fgo':
|
||||
url = 'http://fgo.vgtime.com/servant/'
|
||||
async def _last_check(data: dict, game_name: str) -> dict:
|
||||
if game_name == "fgo":
|
||||
url = "http://fgo.vgtime.com/servant/"
|
||||
tasks = []
|
||||
semaphore = asyncio.Semaphore(SEMAPHORE)
|
||||
for key in data.keys():
|
||||
tasks.append(asyncio.ensure_future(_async_update_fgo_extra_info(url, key, data[key]['id'], session, semaphore)))
|
||||
tasks.append(
|
||||
asyncio.ensure_future(
|
||||
_async_update_fgo_extra_info(url, key, data[key]["id"], semaphore)
|
||||
)
|
||||
)
|
||||
asyResult = await asyncio.gather(*tasks)
|
||||
for x in asyResult:
|
||||
for key in x.keys():
|
||||
data[key]['入手方式'] = x[key]['入手方式']
|
||||
if game_name == 'onmyoji':
|
||||
url = 'https://yys.163.com/shishen/{}.html'
|
||||
data[key]["入手方式"] = x[key]["入手方式"]
|
||||
if game_name == "onmyoji":
|
||||
url = "https://yys.163.com/shishen/{}.html"
|
||||
for key in data.keys():
|
||||
async with session.get(f'{url.format(data[key]["id"])}', timeout=7) as response:
|
||||
soup = BeautifulSoup(await response.text(), 'lxml')
|
||||
data[key]['头像'] = "https:" + soup.find('div', {'class': 'pic_wrap'}).find('img')['src']
|
||||
await download_img(data[key]['头像'], game_name, key)
|
||||
text = (await AsyncHttpx.get(f'{url.format(data[key]["id"])}')).text
|
||||
soup = BeautifulSoup(text, "lxml")
|
||||
data[key]["头像"] = (
|
||||
"https:" + soup.find("div", {"class": "pic_wrap"}).find("img")["src"]
|
||||
)
|
||||
await download_img(data[key]["头像"], game_name, key)
|
||||
return data
|
||||
|
||||
|
||||
async def _async_update_fgo_extra_info(url: str, key: str, _id: str, session: aiohttp.ClientSession, semaphore):
|
||||
async def _async_update_fgo_extra_info(url: str, key: str, _id: str, semaphore):
|
||||
# 防止访问超时
|
||||
async with semaphore:
|
||||
for i in range(10):
|
||||
try:
|
||||
async with session.get(f'{url}{_id}', timeout=7) as response:
|
||||
soup = BeautifulSoup(await response.text(), 'lxml')
|
||||
obtain = soup.find('table', {'class': 'uk-table uk-codex-table'}).find_all('td')[-1].text
|
||||
if obtain.find('限时活动免费获取 活动结束后无法获得') != -1:
|
||||
obtain = ['活动获取']
|
||||
elif obtain.find('非限时UP无法获得') != -1:
|
||||
obtain = ['限时召唤']
|
||||
text = (await AsyncHttpx.get(f"{url}{_id}")).text
|
||||
soup = BeautifulSoup(text, "lxml")
|
||||
obtain = (
|
||||
soup.find("table", {"class": "uk-table uk-codex-table"})
|
||||
.find_all("td")[-1]
|
||||
.text
|
||||
)
|
||||
if obtain.find("限时活动免费获取 活动结束后无法获得") != -1:
|
||||
obtain = ["活动获取"]
|
||||
elif obtain.find("非限时UP无法获得") != -1:
|
||||
obtain = ["限时召唤"]
|
||||
else:
|
||||
if obtain.find("&") != -1:
|
||||
obtain = obtain.strip().split("&")
|
||||
else:
|
||||
if obtain.find('&') != -1:
|
||||
obtain = obtain.strip().split('&')
|
||||
else:
|
||||
obtain = obtain.strip().split(' ')
|
||||
logger.info(f'Fgo获取额外信息 {key}....{obtain}')
|
||||
x = {key: {}}
|
||||
x[key]['入手方式'] = obtain
|
||||
return x
|
||||
obtain = obtain.strip().split(" ")
|
||||
logger.info(f"Fgo获取额外信息 {key}....{obtain}")
|
||||
x = {key: {}}
|
||||
x[key]["入手方式"] = obtain
|
||||
return x
|
||||
except TimeoutError:
|
||||
logger.warning(f'访问{url}{_id} 第 {i}次 超时...已再次访问')
|
||||
logger.warning(f"访问{url}{_id} 第 {i}次 超时...已再次访问")
|
||||
return {}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Regular → Executable
+39
-36
@@ -1,4 +1,3 @@
|
||||
import aiohttp
|
||||
from .config import DRAW_PATH, SEMAPHORE
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from bs4 import BeautifulSoup
|
||||
@@ -6,6 +5,7 @@ from .util import download_img
|
||||
from .util import remove_prohibited_str
|
||||
from urllib.parse import unquote
|
||||
from services.log import logger
|
||||
from utils.http_utils import AsyncHttpx
|
||||
import bs4
|
||||
import asyncio
|
||||
|
||||
@@ -24,19 +24,21 @@ async def update_simple_info(url: str, game_name: str) -> 'dict, int':
|
||||
except (ValueError, FileNotFoundError):
|
||||
data = {}
|
||||
try:
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(url, timeout=7) as response:
|
||||
soup = BeautifulSoup(await response.text(), 'lxml')
|
||||
divs = get_char_divs(soup, game_name)
|
||||
for div in divs:
|
||||
type_lst = get_type_lst(div, game_name)
|
||||
index = 0
|
||||
for char_lst in type_lst:
|
||||
contents = get_char_lst_contents(char_lst, game_name)
|
||||
for char in contents:
|
||||
data = await retrieve_char_data(char, game_name, data, index)
|
||||
index += 1
|
||||
data = await _last_check(data, game_name, session)
|
||||
text = (await AsyncHttpx.get(url)).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
divs = get_char_divs(soup, game_name)
|
||||
for div in divs:
|
||||
type_lst = get_type_lst(div, game_name)
|
||||
index = 0
|
||||
for char_lst in type_lst:
|
||||
try:
|
||||
contents = get_char_lst_contents(char_lst, game_name)
|
||||
except AttributeError:
|
||||
continue
|
||||
for char in contents[1:]:
|
||||
data = await retrieve_char_data(char, game_name, data, index)
|
||||
index += 1
|
||||
data = await _last_check(data, game_name)
|
||||
except TimeoutError:
|
||||
logger.warning(f'更新 {game_name} 超时...')
|
||||
return {}, 999
|
||||
@@ -71,7 +73,7 @@ def get_char_lst_contents(char_lst: bs4.element.Tag, game_name: str):
|
||||
|
||||
|
||||
# 额外数据
|
||||
async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession) -> dict:
|
||||
async def _last_check(data: dict, game_name: str) -> dict:
|
||||
if game_name == 'azur':
|
||||
idx = 1
|
||||
for url in [
|
||||
@@ -91,7 +93,7 @@ async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession
|
||||
tasks = []
|
||||
semaphore = asyncio.Semaphore(SEMAPHORE)
|
||||
for key in data.keys():
|
||||
tasks.append(asyncio.ensure_future(_async_update_azur_extra_info(key, session, semaphore)))
|
||||
tasks.append(asyncio.ensure_future(_async_update_azur_extra_info(key, semaphore)))
|
||||
asyResult = await asyncio.gather(*tasks)
|
||||
for x in asyResult:
|
||||
for key in x.keys():
|
||||
@@ -125,10 +127,11 @@ async def retrieve_char_data(char: bs4.element.Tag, game_name: str, data: dict,
|
||||
'名称': remove_prohibited_str(char.find('a')['title']),
|
||||
'星级': 3 - index}
|
||||
if game_name == 'azur':
|
||||
char = char.find('td').find('div')
|
||||
print(char)
|
||||
char = char.find('div').find('div').find('div').find('div')
|
||||
avatar_img = char.find('a').find('img')
|
||||
try:
|
||||
member_dict['名称'] = remove_prohibited_str(str(avatar_img['alt'])[: str(avatar_img['alt']).find('头像')])
|
||||
member_dict['名称'] = remove_prohibited_str(char.find('a')['title'])
|
||||
except TypeError:
|
||||
member_dict['名称'] = char.find('a')['title'][:-4]
|
||||
try:
|
||||
@@ -138,7 +141,7 @@ async def retrieve_char_data(char: bs4.element.Tag, game_name: str, data: dict,
|
||||
except TypeError:
|
||||
member_dict['头像'] = "img link not find..."
|
||||
logger.warning(f'{member_dict["名称"]} 图片缺失....')
|
||||
star = char.find('div').find('img')['alt']
|
||||
star = char.find('img')['alt']
|
||||
if star == '舰娘头像外框普通.png':
|
||||
star = 1
|
||||
elif star == '舰娘头像外框稀有.png':
|
||||
@@ -161,28 +164,28 @@ async def retrieve_char_data(char: bs4.element.Tag, game_name: str, data: dict,
|
||||
return data
|
||||
|
||||
|
||||
async def _async_update_azur_extra_info(key: str, session: aiohttp.ClientSession, semaphore):
|
||||
async def _async_update_azur_extra_info(key: str, semaphore):
|
||||
if key[-1] == '改':
|
||||
return {key: {'获取途径': ['无法建造']}}
|
||||
async with semaphore:
|
||||
for i in range(20):
|
||||
try:
|
||||
async with session.get(f'https://wiki.biligame.com/blhx/{key}', timeout=7) as res:
|
||||
soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
try:
|
||||
construction_time = str(soup.find('table', {'class': 'wikitable sv-general'}).find('tbody'))
|
||||
x = {key: {'获取途径': []}}
|
||||
if construction_time.find('无法建造') != -1:
|
||||
x[key]['获取途径'].append('无法建造')
|
||||
elif construction_time.find('活动已关闭') != -1:
|
||||
x[key]['获取途径'].append('活动限定')
|
||||
else:
|
||||
x[key]['获取途径'].append('可以建造')
|
||||
logger.info(f'碧蓝航线获取额外信息 {key}...{x[key]["获取途径"]}')
|
||||
except AttributeError:
|
||||
x = {key: {'获取途径': []}}
|
||||
logger.warning(f'碧蓝航线获取额外信息错误 {key}...{[]}')
|
||||
return x
|
||||
text = (await AsyncHttpx.get(f'https://wiki.biligame.com/blhx/{key}')).text
|
||||
soup = BeautifulSoup(text, 'lxml')
|
||||
try:
|
||||
construction_time = str(soup.find('table', {'class': 'wikitable sv-general'}).find('tbody'))
|
||||
x = {key: {'获取途径': []}}
|
||||
if construction_time.find('无法建造') != -1:
|
||||
x[key]['获取途径'].append('无法建造')
|
||||
elif construction_time.find('活动已关闭') != -1:
|
||||
x[key]['获取途径'].append('活动限定')
|
||||
else:
|
||||
x[key]['获取途径'].append('可以建造')
|
||||
logger.info(f'碧蓝航线获取额外信息 {key}...{x[key]["获取途径"]}')
|
||||
except AttributeError:
|
||||
x = {key: {'获取途径': []}}
|
||||
logger.warning(f'碧蓝航线获取额外信息错误 {key}...{[]}')
|
||||
return x
|
||||
except TimeoutError:
|
||||
logger.warning(f'访问 https://wiki.biligame.com/blhx/{key} 第 {i}次 超时...已再次访问')
|
||||
return {}
|
||||
|
||||
Regular → Executable
+7
-20
@@ -1,13 +1,9 @@
|
||||
|
||||
import aiohttp
|
||||
import aiofiles
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from aiohttp.client_exceptions import InvalidURL
|
||||
from nonebot.adapters.cqhttp import MessageSegment
|
||||
from typing import List, Union, Set
|
||||
from pathlib import Path
|
||||
from .config import path_dict
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from utils.http_utils import AsyncHttpx
|
||||
import nonebot
|
||||
import pypinyin
|
||||
from utils.image_utils import CreateImg
|
||||
@@ -54,21 +50,12 @@ async def download_img(url: str, path: str, name: str) -> bool:
|
||||
if not file.exists():
|
||||
file.parent.mkdir(exist_ok=True, parents=True)
|
||||
try:
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
async with session.get(url, timeout=7) as response:
|
||||
async with aiofiles.open(IMAGE_PATH + f'/draw_card/{path}/{codename}.png', 'wb') as f:
|
||||
await f.write(await response.read())
|
||||
logger.info(f'下载 {path_dict[path]} 图片成功,名称:{name},url:{url}')
|
||||
return True
|
||||
except TimeoutError:
|
||||
logger.warning(f'下载 {path_dict[path]} 图片超时,名称:{name},url:{url}')
|
||||
return False
|
||||
except InvalidURL:
|
||||
logger.warning(f'下载 {path_dict[path]} 链接错误,名称:{name},url:{url}')
|
||||
return False
|
||||
else:
|
||||
# logger.info(f'{path_dict[path]} 图片 {name} 已存在')
|
||||
return False
|
||||
if await AsyncHttpx.download_file(url, IMAGE_PATH + f'/draw_card/{path}/{codename}.png'):
|
||||
logger.info(f'下载 {path_dict[path]} 图片成功,名称:{name},url:{url}')
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.warning(f'下载 {path_dict[path]} 链接错误 {type(e)}:{e},名称:{name},url:{url}')
|
||||
return False
|
||||
|
||||
|
||||
@driver.on_startup
|
||||
|
||||
Reference in New Issue
Block a user