def get_recruit_operators(self): recruit_detail = remove_xml_tag( self.get_json_data('gacha_table')['recruitDetail']) recruit_group = re.findall(r'★\\n(.*)', recruit_detail) recruit_operators = [] for item in recruit_group: recruit_operators += item.replace(' ', '').split('/') return recruit_operators
def requests_content(self, only_id=False, index=0): session = requests.session() cards = self.get_cards_list() if index >= len(cards): return Reply('博士,只能获取到列表内的微博哦') target_blog = cards[index] blog = target_blog['mblog'] detail_url = target_blog['scheme'] item_id = target_blog['itemid'] if only_id: return item_id # 获取完整正文 url = 'https://m.weibo.cn/statuses/extend?id=%s' % blog['id'] result = session.get(url, headers=self.headers).json() html_text = result['data']['longTextContent'] html_text = re.sub('<br />', '\n', html_text) html_text = remove_xml_tag(html_text) html_text = html_text.strip('\n') # 获取静态图片列表 pics_list = [] pics = blog['pics'] if 'pics' in blog else [] for pic in pics: pic_url = pic['large']['url'] name = pic_url.split('/')[-1] suffix = name.split('.')[-1] if suffix.lower() == 'gif': continue temp = 'resource/message/Blog' path = '%s/%s' % (temp, name) if os.path.exists(path) is False: if os.path.exists(temp) is False: os.mkdir(temp) stream = requests.get(pic_url, headers=self.headers, stream=True) if stream.status_code == 200: open(path, 'wb').write(stream.content) pics_list.append(Image(path)) return [ Reply(html_text), Reply(detail_url, 0, at=False, auto_image=False), Reply(pics_list, 0, at=False) ]
def talents(self, operator_id): talents = [] if self.data['talents']: for item in self.data['talents']: max_item = item['candidates'][-1] talents.append({ 'operator_id': operator_id, 'talents_name': max_item['name'], 'talents_desc': remove_xml_tag(max_item['description']) }) return talents
def detail(self, operator_id): items = self.get_json_data('item_table')['items'] token_id = 'p_' + self.id token = None if token_id in items: token = items[token_id] max_phases = self.data['phases'][-1] max_attr = max_phases['attributesKeyFrames'][-1]['data'] detail = { 'operator_id': operator_id, 'operator_desc': remove_xml_tag(self.data['description']), 'operator_usage': self.data['itemUsage'] or '', 'operator_quote': self.data['itemDesc'] or '', 'operator_token': token['description'] if token else '', 'max_level': '%s-%s' % (len(self.data['phases']) - 1, max_phases['maxLevel']), 'max_hp': max_attr['maxHp'], 'attack': max_attr['atk'], 'defense': max_attr['def'], 'magic_resistance': max_attr['magicResistance'], 'cost': max_attr['cost'], 'block_count': max_attr['blockCnt'], 'attack_time': max_attr['baseAttackTime'], 'respawn_time': max_attr['respawnTime'] } return detail
def get_blog_list(self): cards = self.get_cards_list() text = '博士,这是【明日方舟Arknights】最近的微博列表。\n' for index, item in enumerate(cards): content = remove_xml_tag(item['mblog']['text']) content = content[:30].replace('\n', ' ').replace('#明日方舟#', '').strip() date = item['mblog']['created_at'] date = time.strptime(date, '%a %b %d %H:%M:%S +0800 %Y') date = time.strftime('%m-%d %H:%M', date) text += '\n【%d】%s\n --- %s…' % (index + 1, date, content) text += '\n\n请和我说「阿米娅查看第 N 条微博」来获取详情吧' return Reply(text)
def building_skills(self, operator_id): building_data = self.get_json_data('building_data') building_skills = building_data['buffs'] skills = [] if self.id in building_data['chars']: char_buff = building_data['chars'][self.id] for buff in char_buff['buffChar']: for item in buff['buffData']: buff_id = item['buffId'] if buff_id in building_skills: skill = building_skills[buff_id] skills.append({ 'operator_id': operator_id, 'bs_unlocked': item['cond']['phase'], 'bs_name': skill['buffName'], 'bs_desc': remove_xml_tag(skill['description']) }) return skills
def save_operator_detail(self, operator_no, operator_id): data = self.get_json_data('char/data', operator_no) if data: # todo 保存详细信息 attrs_data = data['phases'][-1]['attributesKeyFrames'][-1] attrs = attrs_data['data'] max_level = attrs_data['level'] detail = { 'operator_id': operator_id, 'operator_desc': remove_xml_tag(data['description']), 'operator_usage': data['itemUsage'] or '', 'operator_quote': data['itemDesc'] or '', 'operator_token': data['tokenDesc'] if 'tokenDesc' in data else '', 'max_level': '%s-%s' % (len(data['phases']) - 1, max_level), 'max_hp': attrs['maxHp'], 'attack': attrs['atk'], 'defense': attrs['def'], 'magic_resistance': attrs['magicResistance'], 'cost': attrs['cost'], 'block_count': attrs['blockCnt'], 'attack_time': attrs['baseAttackTime'], 'respawn_time': attrs['respawnTime'] } database.operator.add_operator_detail([detail]) # todo 保存天赋信息 talents = [] if data['talents']: for item in data['talents']: max_item = item['candidates'][-1] talents.append({ 'operator_id': operator_id, 'talents_name': max_item['name'], 'talents_desc': remove_xml_tag(max_item['description']) }) if talents: database.operator.add_operator_talents(talents) # todo 保存基建信息 building_skill = [] if data['buildingData']: for item in data['buildingData']: if item: for bs in item: building_skill.append({ 'operator_id': operator_id, 'bs_unlocked': bs['cond']['phase'], 'bs_name': bs['data']['buffName'], 'bs_desc': remove_xml_tag(bs['data']['description']) }) if building_skill: database.operator.add_operator_building_skill( building_skill) # todo 保存潜能信息 potential = [] if data['potentialRanks']: for index, item in enumerate(data['potentialRanks']): potential.append({ 'operator_id': operator_id, 'potential_desc': item['description'], 'potential_rank': index + 1 }) if potential: database.operator.add_operator_potential(potential) # todo 保存精英化信息 evolve_cost = [] for index, phases in enumerate(data['phases']): if phases['evolveCost']: for item in phases['evolveCost']: evolve_cost.append({ 'operator_id': operator_id, 'evolve_level': index, 'use_material_id': item['id'], 'use_number': item['count'] }) if evolve_cost: database.operator.add_operator_evolve_costs(evolve_cost) # todo 保存技能信息 skills = [] skills_id = [] skills_desc = {} skills_cost = {} for index, item in enumerate(data['skills']): detail = self.get_json_data('skills', item['skillId']) if detail: name = detail['levels'][0]['name'] sk_no = item['skillId'] skills_id.append(sk_no) if sk_no not in skills_desc: skills_desc[sk_no] = [] if sk_no not in skills_cost: skills_cost[sk_no] = [] # 预处理技能描述数据 for lev, desc in enumerate(detail['levels']): blackboard = { item['key']: item['value'] for index, item in enumerate(desc['blackboard']) } description = remove_xml_tag(desc['description']) format_str = re.findall(r'({(\S+?)})', description) if format_str: for desc_item in format_str: key = desc_item[1].split(':') fd = key[0].lower().strip('-') if fd in blackboard: value = blackboard[fd] if len(key) >= 2 and key[1] in formatter: value = formatter[key[1]](value) description = description.replace( desc_item[0], str(value)) skills_desc[sk_no].append({ 'skill_level': lev + 1, 'skill_type': desc['skillType'], 'sp_type': desc['spData']['spType'], 'sp_init': desc['spData']['initSp'], 'sp_cost': desc['spData']['spCost'], 'duration': desc['duration'], 'description': description, 'max_charge': desc['spData']['maxChargeTime'] }) # 预处理专精数据 for lev, cond in enumerate(item['levelUpCostCond']): if bool(cond['levelUpCost']) is False: continue for idx, cost in enumerate(cond['levelUpCost']): skills_cost[sk_no].append({ 'mastery_level': lev + 1, 'use_material_id': cost['id'], 'use_number': cost['count'] }) icon = 'skill_icon_' + (detail['iconId'] or detail['skillId']) skills.append({ 'operator_id': operator_id, 'skill_no': sk_no, 'skill_index': index + 1, 'skill_name': name, 'skill_icon': icon }) self.get_pic('skills/pics/' + icon, 'skills') if skills: database.operator.add_operator_skill(skills) skills_id = { sk_no: database.operator.get_skill_id(sk_no, operator_id) for sk_no in skills_id } # todo 保存技能描述和专精信息 todo_list = [('技能描述', skills_desc, database.operator.add_operator_skill_description), ('技能专精信息', skills_cost, database.operator.add_operator_skill_mastery_costs)] for todo in todo_list: save_list = [] for sk_no, sk_list in todo[1].items(): for item in sk_list: item['skill_id'] = skills_id[sk_no] save_list.append(item) if save_list: todo[2](save_list)
def skills(self, operator_id): skill_data = self.get_json_data('skill_table') skills = [] skills_id = [] skills_desc = {} skills_cost = {} for index, item in enumerate(self.data['skills']): code = item['skillId'] if code not in skill_data: continue detail = skill_data[code] icon = 'skill_icon_' + (detail['iconId'] or detail['skillId']) if bool(detail) is False: continue skills_id.append(code) if code not in skills_desc: skills_desc[code] = [] if code not in skills_cost: skills_cost[code] = [] for lev, desc in enumerate(detail['levels']): blackboard = { item['key']: item['value'] for index, item in enumerate(desc['blackboard']) } description = remove_xml_tag(desc['description']) format_str = re.findall(r'({(\S+?)})', description) if format_str: for desc_item in format_str: key = desc_item[1].split(':') fd = key[0].lower().strip('-') if fd in blackboard: value = blackboard[fd] if len(key) >= 2 and key[1] in formatter: value = formatter[key[1]](value) description = description.replace( desc_item[0], str(value)) skills_desc[code].append({ 'skill_level': lev + 1, 'skill_type': desc['skillType'], 'sp_type': desc['spData']['spType'], 'sp_init': desc['spData']['initSp'], 'sp_cost': desc['spData']['spCost'], 'duration': desc['duration'], 'description': description, 'max_charge': desc['spData']['maxChargeTime'] }) for lev, cond in enumerate(item['levelUpCostCond']): if bool(cond['levelUpCost']) is False: continue for idx, cost in enumerate(cond['levelUpCost']): skills_cost[code].append({ 'mastery_level': lev + 1, 'use_material_id': cost['id'], 'use_number': cost['count'] }) skills.append({ 'operator_id': operator_id, 'skill_no': code, 'skill_index': index + 1, 'skill_name': detail['levels'][0]['name'], 'skill_icon': icon }) return skills, skills_id, skills_cost, skills_desc
def find_enemy(self, enemy): name = find_similar_string(enemy, list(self.enemies.keys())) if name: try: data = self.enemies[name]['info'] detail = self.enemies[name]['data'] text = '博士,这是找到的敌方档案\n\n\n\n\n\n\n' text += '【%s】\n\n' % name text += '%s\n\n' % data['description'] text += '[能力]\n%s\n\n' % remove_xml_tag(data['ability'] or '无') text += '[属性]\n耐久 %s | 攻击力 %s | 防御力 %s | 法术抗性 %s\n' % \ (data['endure'], data['attack'], data['defence'], data['resistance']) key_map = { 'attributes.maxHp': {'title': '生命值', 'value': ''}, 'attributes.atk': {'title': '攻击力', 'value': ''}, 'attributes.def': {'title': '物理防御', 'value': ''}, 'attributes.magicResistance': {'title': '魔法抗性', 'value': ''}, 'attributes.moveSpeed': {'title': '移动速度', 'value': ''}, 'attributes.baseAttackTime': {'title': '攻击间隔', 'value': ''}, 'attributes.hpRecoveryPerSec': {'title': '生命回复/秒', 'value': ''}, 'attributes.massLevel': {'title': '重量', 'value': ''}, 'rangeRadius': {'title': '攻击距离/格', 'value': ''}, 'lifePointReduce': {'title': '进点损失', 'value': ''} } for item in detail: text += '\n[等级 %s 数值]\n' % (item['level'] + 1) detail_data = item['enemyData'] key_index = 0 for key in key_map: defined, value = self.get_value(key, detail_data) if defined: key_map[key]['value'] = value else: value = key_map[key]['value'] text += '%s:%s%s' % (key_map[key]['title'], value, ' ' if key_index % 2 == 0 else '\n') key_index += 1 if detail_data['skills']: text += '技能冷却时间:\n' for sk in detail_data['skills']: sk_info = (sk['prefabKey'], sk['initCooldown'], sk['cooldown']) text += ' - [%s]\n -- 初始冷却 %ss,后续冷却 %ss\n' % sk_info icons = [ { 'path': 'resource/images/enemy/%s.png' % data['enemyId'], 'size': (80, 80), 'pos': (10, 30) } ] return TextImage(text, icons) except Exception as e: raise e print('Enemy', e) return '博士,【%s】档案好像损坏了... >.<' % name else: return False