def show_accounts_status(cfg, ctx): if not has_any_account_in_normal_run(cfg): return _show_head_line(ctx) heads = ["序号", "账号名", "启用状态", "聚豆余额", "聚豆历史总数", "成就点", "心悦组队"] colSizes = [4, 12, 8, 8, 12, 6, 8] logger.info(tableify(heads, colSizes)) for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() status = "启用" if account_config.enable else "未启用" djc_info = djcHelper.query_balance("查询聚豆概览", print_res=False)["data"] djc_allin, djc_balance = int(djc_info['allin']), int(djc_info['balance']) xinyue_info = djcHelper.query_xinyue_info("查询心悦成就点概览", print_res=False) teaminfo = djcHelper.query_xinyue_teaminfo(print_res=False) team_score = "无队伍" if teaminfo.id != "": team_score = "{}/20".format(teaminfo.score) fixed_team = djcHelper.get_fixed_team() if fixed_team is not None: team_score = "[{}]{}".format(fixed_team.id, team_score) cols = [idx, account_config.name, status, djc_balance, djc_allin, xinyue_info.score, team_score] logger.info(color("fg_bold_green") + tableify(cols, colSizes))
def check_all_skey_and_pskey(cfg, check_skey_only=False): if not has_any_account_in_normal_run(cfg): return _show_head_line("启动时检查各账号skey/pskey/openid是否过期") qq2index = {} for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.warning(color("fg_bold_yellow") + f"------------检查第{idx}个账户({account_config.name})------------") djcHelper = DjcHelper(account_config, cfg.common) djcHelper.fetch_pskey() djcHelper.check_skey_expired() if not check_skey_only: djcHelper.get_bind_role_list(print_warning=False) djcHelper.fetch_guanjia_openid(print_warning=False) qq = uin2qq(djcHelper.cfg.account_info.uin) if qq in qq2index: msg = f"第{idx}个账号的实际登录QQ {qq} 与第{qq2index[qq]}个账号的qq重复,是否重复扫描了?\n\n点击确认后,程序将清除本地登录记录,并退出运行。请重新运行并按顺序登录正确的账号~" logger.error(color("fg_bold_red") + msg) win32api.MessageBox(0, msg, "重复登录", win32con.MB_ICONINFORMATION) clear_login_status() sys.exit(-1) qq2index[qq] = idx
def query_card_info(): # 读取配置信息 cfg = config() # init_pool(cfg.get_pool_size()) # check_all_skey_and_pskey(cfg, check_skey_only=True) # 12.30 送卡片次数(re:好像送给别人没有上限?) indexes = list(range(len(cfg.account_configs), 0, -1)) # 展示卡仓信息 lottery_zzconfig = zzconfig() card_info_map = parse_card_group_info_map(lottery_zzconfig) order_map = {} # 卡片编码 => 名称 for name, card_info in card_info_map.items(): order_map[card_info.index] = name heads = [] colSizes = [] card_indexes = [ "1-1", "1-2", "1-3", "1-4", "2-1", "2-2", "2-3", "2-4", "3-1", "3-2", "3-3", "3-4" ] card_width = 3 heads.extend(card_indexes) colSizes.extend([card_width for i in card_indexes]) summaryCols = [*[0 for card in card_indexes]] for idx in indexes: # 从1开始,第i个 account_config = cfg.account_configs[idx - 1] djcHelper = DjcHelper(account_config, cfg.common) lr = djcHelper.fetch_pskey() djcHelper.check_skey_expired() djcHelper.get_bind_role_list() qa = QzoneActivity(djcHelper, lr) card_counts = qa.get_card_counts() # 处理各个卡片数目 for card_position, card_index in enumerate(card_indexes): card_count = card_counts[order_map[card_index]] # 更新统计信息 summaryCols[card_position] += card_count msg = "\n卡片详情如下" msg += "\n " for col in range(4): msg += f" {col + 1:3d}" for row in range(3): msg += f"\n{row + 1}" for col in range(4): msg += f" {summaryCols[row * 4 + col]:3d}" msg += "\n" return msg
def try_join_xinyue_team(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("尝试加入心悦固定队") for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.info("") logger.warning( color("fg_bold_yellow") + "------------尝试第{}个账户({})------------".format( idx, account_config.name)) djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() # 尝试加入固定心悦队伍 djcHelper.try_join_fixed_xinyue_team() if cfg.common._debug_run_first_only: logger.warning("调试开关打开,不再处理后续账户") break
def auto_send_cards(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("运行完毕自动赠送卡片") target_qqs = cfg.common.auto_send_card_target_qqs if len(target_qqs) == 0: logger.warning("未定义自动赠送卡片的对象QQ数组,将跳过本阶段") return # 统计各账号卡片数目 logger.info("拉取各账号的卡片数据中,请耐心等待...") qq_to_card_name_to_counts = {} qq_to_prize_counts = {} qq_to_djcHelper = {} for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) lr = djcHelper.fetch_pskey() if lr is None: continue qq = uin2qq(lr.uin) qa = QzoneActivity(djcHelper, lr) qq_to_card_name_to_counts[qq] = qa.get_card_counts() qq_to_prize_counts[qq] = qa.get_prize_counts() qq_to_djcHelper[qq] = djcHelper logger.info("{}/{} 账号 {:} 的数据拉取完毕".format( idx, len(cfg.account_configs), padLeftRight(account_config.name, 12))) # 赠送卡片 for target_qq in target_qqs: if target_qq in qq_to_djcHelper: left_times = qq_to_djcHelper[ target_qq].ark_lottery_query_left_times(target_qq) logger.warning( color("fg_bold_green") + "账号 {}({}) 今日仍可被赠送 {} 次卡片".format( qq_to_djcHelper[target_qq].cfg.name, target_qq, left_times) ) # 最多赠送目标账号今日仍可接收的卡片数 for i in range(left_times): send_card(target_qq, qq_to_card_name_to_counts, qq_to_prize_counts, qq_to_djcHelper) # 赠送卡片完毕后尝试抽奖 djcHelper = qq_to_djcHelper[target_qq] lr = djcHelper.fetch_pskey() if lr is not None: qa = QzoneActivity(djcHelper, lr) qa.try_lottery_using_cards(print_warning=False)
def run(cfg): _show_head_line("开始核心逻辑") user_buy_info = get_user_buy_info(cfg) show_buy_info(user_buy_info) for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): logger.info(f"第{idx}个账号({account_config.name})未启用,将跳过") continue _show_head_line(f"开始处理第{idx}个账户({account_config.name})") start_time = datetime.datetime.now() djcHelper = DjcHelper(account_config, cfg.common) djcHelper.run(user_buy_info) used_time = datetime.datetime.now() - start_time _show_head_line(f"处理第{idx}个账户({account_config.name}) 共耗时 {used_time}") if cfg.common._debug_run_first_only: logger.warning("调试开关打开,不再处理后续账户") break
def try_xinyue_sailiyam_start_work(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("尝试派赛利亚出去打工") for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.info("") logger.warning(color("fg_bold_green") + f"------------开始处理第{idx}个账户({account_config.name})的赛利亚的打工和领工资~------------") djcHelper = DjcHelper(account_config, cfg.common) if account_config.function_switches.get_xinyue_sailiyam or account_config.function_switches.disable_most_activities: # 先尝试领工资 djcHelper.show_xinyue_sailiyam_work_log() djcHelper.xinyue_sailiyam_op("领取工资", "714229", iPackageId=djcHelper.get_xinyue_sailiyam_package_id()) djcHelper.xinyue_sailiyam_op("全勤奖", "715724") # 然后派出去打工 djcHelper.xinyue_sailiyam_op("出去打工", "714255") logger.info("等待一会,避免请求过快") time.sleep(3) logger.info(color("fg_bold_cyan") + djcHelper.get_xinyue_sailiyam_workinfo()) logger.info(color("fg_bold_cyan") + djcHelper.get_xinyue_sailiyam_status())
def query_lottery_status(idx: int, account_config: AccountConfig, common_config: CommonConfig, card_indexes: List[str], prize_indexes: List[str], order_map: Dict[str, str]) -> Optional[List]: if not account_config.ark_lottery.show_status: return djcHelper = DjcHelper(account_config, common_config) lr = djcHelper.fetch_pskey() if lr is None: return djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) qa = QzoneActivity(djcHelper, lr) card_counts = qa.get_card_counts() prize_counts = qa.get_prize_counts() cols = [idx, account_config.name] # 处理各个卡片数目 for card_position, card_index in enumerate(card_indexes): card_count = card_counts[order_map[card_index]] cols.append(card_count) # 处理各个奖励剩余领取次数 for prize_index in prize_indexes: prize_count = prize_counts[order_map[prize_index]] cols.append(prize_count) return cols
def show_accounts_status(cfg, ctx): logger.info("") _show_head_line("部分活动信息") logger.warning("如果一直卡在这一步,请在小助手目录下创建一个空文件:不查询活动.txt") Urls().show_current_valid_act_infos() logger.info("") _show_head_line("付费相关信息") user_buy_info = get_user_buy_info(cfg) show_buy_info(user_buy_info) if not has_any_account_in_normal_run(cfg): return _show_head_line(ctx) heads = ["序号", "账号名", "启用状态", "聚豆余额", "聚豆历史总数", "成就点", "心悦组队", "心悦G分", "编年史", "年史碎片", "守护者卡片", "马杰洛石头"] colSizes = [4, 12, 8, 8, 12, 6, 8, 8, 14, 8, 15, 10] logger.info(tableify(heads, colSizes)) for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) status = "启用" if account_config.is_enabled() else "未启用" djc_info = djcHelper.query_balance("查询聚豆概览", print_res=False)["data"] djc_allin, djc_balance = int(djc_info['allin']), int(djc_info['balance']) xinyue_info = djcHelper.query_xinyue_info("查询心悦成就点概览", print_res=False) teaminfo = djcHelper.query_xinyue_teaminfo(print_res=False) team_score = "无队伍" if teaminfo.id != "": team_score = f"{teaminfo.score}/20" fixed_team = djcHelper.get_fixed_team() if fixed_team is not None: team_score = f"[{fixed_team.id}]{team_score}" gpoints = djcHelper.query_gpoints() ui = djcHelper.query_dnf_helper_chronicle_info() levelInfo = f"LV{ui.level}({ui.currentExp}/{ui.levelExp})" chronicle_points = ui.point if ui.totalExp == 0: levelInfo = "" chronicle_points = "" majieluo_cards = djcHelper.query_majieluo_card_info() stone_count = djcHelper.query_stone_count() cols = [idx, account_config.name, status, djc_balance, djc_allin, xinyue_info.score, team_score, gpoints, levelInfo, chronicle_points, majieluo_cards, stone_count] logger.info(color("fg_bold_green") + tableify(cols, colSizes, need_truncate=True))
def show_accounts_status(cfg, ctx): if not has_any_account_in_normal_run(cfg): return _show_head_line(ctx) heads = [ "序号", "账号名", "启用状态", "聚豆余额", "聚豆历史总数", "成就点", "心悦组队", "闪光杯出货数", "赛丽亚卡片", "爆竹积分", "马杰洛石头" ] colSizes = [4, 12, 8, 8, 12, 6, 8, 12, 14, 8, 10] logger.info(tableify(heads, colSizes)) for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() status = "启用" if account_config.is_enabled() else "未启用" djc_info = djcHelper.query_balance("查询聚豆概览", print_res=False)["data"] djc_allin, djc_balance = int(djc_info['allin']), int( djc_info['balance']) xinyue_info = djcHelper.query_xinyue_info("查询心悦成就点概览", print_res=False) teaminfo = djcHelper.query_xinyue_teaminfo(print_res=False) team_score = "无队伍" if teaminfo.id != "": team_score = f"{teaminfo.score}/20" fixed_team = djcHelper.get_fixed_team() if fixed_team is not None: team_score = f"[{fixed_team.id}]{team_score}" shanguang_equip_count = djcHelper.query_dnf_shanguang_equip_count( print_warning=False) sailiya_cards = djcHelper.query_majieluo_card_info() firecrackers_points = djcHelper.query_firecrackers_points() stone_count = djcHelper.query_stone_count() cols = [ idx, account_config.name, status, djc_balance, djc_allin, xinyue_info.score, team_score, shanguang_equip_count, sailiya_cards, firecrackers_points, stone_count ] logger.info( color("fg_bold_green") + tableify(cols, colSizes, need_truncate=True)) logger.info("") _show_head_line("付费相关信息") user_buy_info = get_user_buy_info(cfg) show_buy_info(user_buy_info)
def sell_card(targetQQ: str, cards_to_send: List[str]) -> str: cards_to_send = [ name for name in cards_to_send if name != CARD_PLACEHOLDER ] original_cards = [*cards_to_send] # 读取配置信息 load_config("config.toml", "config.toml.local") cfg = config() # 12.30 送卡片次数(re:好像送给别人没有上限?) indexes = list(range(len(cfg.account_configs), 0, -1)) card_info_map = parse_card_group_info_map(zzconfig()) for name in cards_to_send: if name not in card_info_map: return f"{name}不是本期卡片名称,有效的卡片名称为: {list(card_info_map.keys())}" success_send_list = [] for idx in indexes: # 从1开始,第i个 account_config = cfg.account_configs[idx - 1] show_head_line(f"开始处理第{idx}个账户[{account_config.name}]", color("fg_bold_yellow")) djcHelper = DjcHelper(account_config, cfg.common) lr = djcHelper.fetch_pskey() djcHelper.check_skey_expired() djcHelper.get_bind_role_list() remaining_cards = [] for name in cards_to_send: res = djcHelper.send_card_by_name(name, targetQQ) retCode = int(res["13333"]["ret"]) if retCode == 0: success_send_list.append(name) else: remaining_cards.append(name) if len(original_cards) == 1: if retCode == 10017: return "该账号今日已被赠送过四次" cards_to_send = remaining_cards if len(cards_to_send) == 0: break msg = "" if len(success_send_list) != 0: msg += f"\n成功发送以下卡片:{success_send_list}" if len(cards_to_send) != 0: msg += f"\n无法发送以下卡片:{cards_to_send},是否已达到赠送上限或者这个卡卖完了?" if len(success_send_list) != 0: msg += f"\n请使用手机打开集卡页面确认是否到账~ 若到账请按1元每张的价格主动扫码转账哦~(不自觉的坏孩子会被tjjtds哦<_<)" msg += "\n" return msg
def do_check_all_skey_and_pskey(idx: int, account_config: AccountConfig, common_config: CommonConfig): if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 return None logger.warning(color("fg_bold_yellow") + f"------------检查第{idx}个账户({account_config.name})------------") djcHelper = DjcHelper(account_config, common_config) djcHelper.fetch_pskey() djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False)
def do_run(idx: int, account_config: AccountConfig, common_config: CommonConfig, user_buy_info: BuyInfo): _show_head_line(f"开始处理第{idx}个账户({account_config.name})") start_time = datetime.datetime.now() djcHelper = DjcHelper(account_config, common_config) djcHelper.run(user_buy_info) used_time = datetime.datetime.now() - start_time _show_head_line(f"处理第{idx}个账户({account_config.name}) 共耗时 {used_time}")
def run(cfg): _show_head_line("开始核心逻辑") user_buy_info = get_user_buy_info(cfg) # 购买过dlc的用户可以获得两个月免费使用付费功能的时长 if has_buy_auto_updater_dlc(cfg): max_present_times = datetime.timedelta(days=2 * 31) free_start_time = parse_time("2021-02-07 00:00:00") now = datetime.datetime.now() since_start_time = now - free_start_time not_paied_time = max( since_start_time - datetime.timedelta(days=user_buy_info.total_buy_month * 31), datetime.timedelta()) present_times = datetime.timedelta() if not_paied_time < max_present_times: # 如果当前到2.7号的未付费时长少于两个月,则补齐差值到过期时间 present_times = max_present_times - not_paied_time user_buy_info.expire_at = format_time( parse_time(user_buy_info.expire_at) + present_times) user_buy_info.buy_records.insert( 0, BuyRecord().auto_update_config({ "buy_month": 2, "buy_at": free_start_time })) logger.info( color("bold_green") + f"当前运行的qq中已有某个qq购买过自动更新dlc,自{free_start_time}开始将累积可免费使用付费功能两个月,目前累积未付费时长为{not_paied_time},故而补偿{present_times}" ) show_buy_info(user_buy_info) for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): logger.info(f"第{idx}个账号({account_config.name})未启用,将跳过") continue _show_head_line(f"开始处理第{idx}个账户({account_config.name})") djcHelper = DjcHelper(account_config, cfg.common) djcHelper.run(user_buy_info) if cfg.common._debug_run_first_only: logger.warning("调试开关打开,不再处理后续账户") break
def check_djc_role_binding(): load_config("config.toml", "config.toml.local") cfg = config() if not has_any_account_in_normal_run(cfg): logger.warning("未发现任何有效的账户配置,请检查配置文件") os.system("PAUSE") exit(-1) _show_head_line("启动时检查各账号是否在道聚城绑定了dnf账号和任意手游账号") while True: all_binded = True not_binded_accounts = [] for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.warning( color("fg_bold_yellow") + "------------检查第{}个账户({})------------".format( idx, account_config.name)) djcHelper = DjcHelper(account_config, cfg.common) if not djcHelper.check_djc_role_binding(): all_binded = False not_binded_accounts.append(account_config.name) if all_binded: break else: logger.warning( color("fg_bold_yellow") + "请前往道聚城将上述提示的未绑定dnf或任意手游的账号【{}】进行绑定,具体操作流程可以参考使用文档或者教学视频。". format(not_binded_accounts)) logger.warning( color("fg_bold_yellow") + "如果本账号不需要道聚城相关操作,可以打开配置表,将该账号的cannot_bind_dnf设为true,game_name设为无,即可跳过道聚城相关操作" ) logger.warning( color("fg_bold_yellow") + " ps: 上面这个cannot_bind_dnf之前笔误写成了cannot_band_dnf,如果之前填过,请手动把配置名称改成cannot_bind_dnf~" ) logger.warning(color("fg_bold_cyan") + "操作完成后点击任意键即可再次进行检查流程...") os.system("PAUSE") # 这时候重新读取一遍用户修改过后的配置文件(比如把手游设为了 无 ) load_config("config.toml", "config.toml.local") cfg = config()
def do_check_all_skey_and_pskey(idx: int, window_index:int, account_config: AccountConfig, common_config: CommonConfig, check_skey_only: bool) -> Optional[DjcHelper]: if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 return None logger.warning(color("fg_bold_yellow") + f"------------检查第{idx}个账户({account_config.name})------------") djcHelper = DjcHelper(account_config, common_config) djcHelper.fetch_pskey(window_index=window_index) djcHelper.check_skey_expired(window_index=window_index) if not check_skey_only: djcHelper.get_bind_role_list(print_warning=False) djcHelper.fetch_guanjia_openid(print_warning=False) return djcHelper
def do_run(idx: int, account_config: AccountConfig, common_config: CommonConfig): _show_head_line(f"开始处理第{idx}个账户({account_config.name})") start_time = datetime.datetime.now() djcHelper = DjcHelper(account_config, common_config) djcHelper.check_skey_expired() djcHelper.get_bind_role_list() if is_new_version_ark_lottery(): djcHelper.dnf_ark_lottery() else: djcHelper.ark_lottery() used_time = datetime.datetime.now() - start_time _show_head_line(f"处理第{idx}个账户({account_config.name}) 共耗时 {used_time}")
def check_all_skey_and_pskey(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("启动时检查各账号skey/pskey/openid是否过期") for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.warning(color("fg_bold_yellow") + "------------检查第{}个账户({})------------".format(idx, account_config.name)) djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) djcHelper.fetch_pskey()
def query_account_ark_lottery_info(idx: int, total_account: int, account_config: AccountConfig, common_config: CommonConfig) -> (Dict[str, int], Dict[str, int], DjcHelper): djcHelper = DjcHelper(account_config, common_config) lr = djcHelper.fetch_pskey() if lr is None: return djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) qa = QzoneActivity(djcHelper, lr) card_name_to_counts = qa.get_card_counts() prize_counts = qa.get_prize_counts() logger.info(f"{idx:2d}/{total_account} 账号 {padLeftRight(account_config.name, 12)} 的数据拉取完毕") return card_name_to_counts, prize_counts, djcHelper
def run(cfg): _show_head_line("开始核心逻辑") for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.enable: logger.info("第{}个账号({})未启用,将跳过".format(idx, account_config.name)) continue _show_head_line("开始处理第{}个账户({})".format(idx, account_config.name)) djcHelper = DjcHelper(account_config, cfg.common) djcHelper.run() if cfg.common._debug_run_first_only: logger.warning("调试开关打开,不再处理后续账户") break
def try_join_xinyue_team(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("尝试加入心悦固定队") for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.info("") logger.warning(color("fg_bold_yellow") + f"------------尝试第{idx}个账户({account_config.name})------------") djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() # 尝试加入固定心悦队伍 djcHelper.try_join_fixed_xinyue_team()
def get_account_status(idx: int, account_config: AccountConfig, common_config: CommonConfig): djcHelper = DjcHelper(account_config, common_config) djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) status = "启用" if account_config.is_enabled() else "未启用" djc_info = djcHelper.query_balance("查询聚豆概览", print_res=False)["data"] djc_allin, djc_balance = int(djc_info['allin']), int(djc_info['balance']) xinyue_info = djcHelper.query_xinyue_info("查询心悦成就点概览", print_res=False) teaminfo = djcHelper.query_xinyue_teaminfo() team_award_summary = "无队伍" if teaminfo.id != "": team_award_summary = teaminfo.award_summary fixed_team = djcHelper.get_fixed_team() if fixed_team is not None: team_award_summary = f"[{fixed_team.id}]{team_award_summary}" gpoints = djcHelper.query_gpoints() ui = djcHelper.query_dnf_helper_chronicle_info() levelInfo = f"LV{ui.level}({ui.currentExp}/{ui.levelExp})" chronicle_points = ui.point if ui.totalExp == 0: levelInfo = "" chronicle_points = "" return [ idx, account_config.name, status, djc_balance, djc_allin, xinyue_info.xytype_str, xinyue_info.score, xinyue_info.ysb, team_award_summary, xinyue_info.work_info(), gpoints, levelInfo, chronicle_points, ]
def try_xinyue_sailiyam_start_work(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("尝试派赛利亚出去打工") for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.info("") logger.warning(color("fg_bold_green") + "------------开始尝试派第{}个账户({})的赛利亚出去打工------------".format(idx, account_config.name)) djcHelper = DjcHelper(account_config, cfg.common) if account_config.function_switches.get_xinyue_sailiyam: djcHelper.xinyue_sailiyam_op("出去打工", "714255") logger.info(color("fg_bold_cyan") + djcHelper.get_xinyue_sailiyam_workinfo()) logger.info(color("fg_bold_cyan") + djcHelper.get_xinyue_sailiyam_status())
def try_take_xinyue_team_award(cfg: Config): if not has_any_account_in_normal_run(cfg): return _show_head_line("尝试领取心悦组队奖励") # 所有账号运行完毕后,尝试领取一次心悦组队奖励,避免出现前面角色还没完成,后面的完成了,前面的却没领奖励 for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.info("") logger.warning(color("fg_bold_green") + f"------------开始尝试为第{idx}个账户({account_config.name})领取心悦组队奖励------------") if not account_config.function_switches.get_xinyue: logger.warning("未启用领取心悦特权专区功能,将跳过") continue djcHelper = DjcHelper(account_config, cfg.common) djcHelper.xinyue_battle_ground_op("领取默契奖励点", "749229")
def check_djc_role_binding(): load_config("config.toml", "config.toml.local") cfg = config() if not has_any_account_in_normal_run(cfg): logger.warning("未发现任何有效的账户配置,请检查配置文件") os.system("PAUSE") exit(-1) _show_head_line("启动时检查各账号是否在道聚城绑定了dnf账号和任意手游账号") while True: all_binded = True for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.warning( color("fg_bold_yellow") + "------------检查第{}个账户({})------------".format( idx, account_config.name)) djcHelper = DjcHelper(account_config, cfg.common) if not djcHelper.check_djc_role_binding(): all_binded = False if all_binded: break else: logger.warning( color("fg_bold_yellow") + "请前往道聚城将上述提示的未绑定dnf或任意手游的账号进行绑定,具体操作流程可以参考使用文档或者教学视频。") logger.warning(color("fg_bold_cyan") + "操作完成后点击任意键即可再次进行检查流程...") os.system("PAUSE") # 这时候重新读取一遍用户修改过后的配置文件(比如把手游设为了 无 ) load_config("config.toml", "config.toml.local") cfg = config()
def try_take_xinyue_team_award(cfg): if not has_any_account_in_normal_run(cfg): return _show_head_line("尝试领取心悦组队奖励") # 所有账号运行完毕后,尝试领取一次心悦组队奖励,避免出现前面角色还没完成,后面的完成了,前面的却没领奖励 for idx, account_config in enumerate(cfg.account_configs): idx += 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue logger.info("") logger.warning( color("fg_bold_green") + "------------开始尝试为第{}个账户({})领取心悦组队奖励------------".format( idx, account_config.name)) if len(account_config.xinyue_operations) == 0: logger.warning("未设置心悦相关操作信息,将跳过") continue djcHelper = DjcHelper(account_config, cfg.common) xinyue_info = djcHelper.query_xinyue_info("获取心悦信息", print_res=False) op_cfgs = [("513818", "查询小队信息"), ("514385", "领取组队奖励")] xinyue_operations = [] for opcfg in op_cfgs: op = XinYueOperationConfig() op.iFlowId, op.sFlowName = opcfg op.count = 1 xinyue_operations.append(op) for op in xinyue_operations: djcHelper.do_xinyue_op(xinyue_info.xytype, op) if cfg.common._debug_run_first_only: logger.warning("调试开关打开,不再处理后续账户") break
def show_lottery_status(ctx, cfg, need_show_tips=False): if not has_any_account_in_normal_run(cfg): return _show_head_line(ctx) show_end_time("2021-02-28 23:59:59") lottery_zzconfig = zzconfig() card_info_map = parse_card_group_info_map(lottery_zzconfig) order_map = {} # 卡片编码 => 名称 for name, card_info in card_info_map.items(): order_map[card_info.index] = name # 奖励展示名称 => 实际名称 groups = [ lottery_zzconfig.prizeGroups.group1, lottery_zzconfig.prizeGroups.group2, lottery_zzconfig.prizeGroups.group3, lottery_zzconfig.prizeGroups.group4, ] prizeDisplayTitles = [] for group in groups: displayTitle = group.title if len(displayTitle) > 4 and "礼包" in displayTitle: # 将 全民竞速礼包 这种名称替换为 全民竞速 displayTitle = displayTitle.replace("礼包", "") order_map[displayTitle] = group.title prizeDisplayTitles.append(displayTitle) heads = [] colSizes = [] baseHeads = ["序号", "账号名"] baseColSizes = [4, 12] heads.extend(baseHeads) colSizes.extend(baseColSizes) card_indexes = ["1-1", "1-2", "1-3", "1-4", "2-1", "2-2", "2-3", "2-4", "3-1", "3-2", "3-3", "3-4"] card_width = 3 heads.extend(card_indexes) colSizes.extend([card_width for i in card_indexes]) prize_indexes = [*prizeDisplayTitles] heads.extend(prize_indexes) colSizes.extend([printed_width(name) for name in prize_indexes]) accounts_that_should_enable_cost_card_to_lottery = [] logger.info(tableify(heads, colSizes)) summaryCols = [1, "总计", *[0 for card in card_indexes], *[count_with_color(0, "bold_green", show_width=printed_width(prize_index)) for prize_index in prize_indexes]] for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue if not account_config.ark_lottery.show_status: continue djcHelper = DjcHelper(account_config, cfg.common) lr = djcHelper.fetch_pskey() if lr is None: continue djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) qa = QzoneActivity(djcHelper, lr) card_counts = qa.get_card_counts() prize_counts = qa.get_prize_counts() summaryCols[0] += 1 cols = [idx, account_config.name] has_any_card = False has_any_left_gift = False # 处理各个卡片数目 for card_position, card_index in enumerate(card_indexes): card_count = card_counts[order_map[card_index]] cols.append(colored_count(idx, card_count, account_config.ark_lottery.show_color)) # 更新统计信息 summaryCols[len(baseHeads) + card_position] += card_count if card_count > 0: has_any_card = True # 处理各个奖励剩余领取次数 for prize_index in prize_indexes: prize_count = prize_counts[order_map[prize_index]] cols.append(count_with_color(prize_count, "bold_green", show_width=printed_width(prize_index))) if prize_count > 0: has_any_left_gift = True logger.info(tableify(cols, colSizes)) if has_any_card and not has_any_left_gift: accounts_that_should_enable_cost_card_to_lottery.append(account_config.name) for cardIdx in range(len(card_indexes)): idx = len(baseHeads) + cardIdx summaryCols[idx] = colored_count(len(cfg.account_configs), summaryCols[idx], cfg.common.ark_lottery_summary_show_color or "fg_thin_cyan") logger.info(tableify(summaryCols, colSizes)) if need_show_tips and len(accounts_that_should_enable_cost_card_to_lottery) > 0: accounts = ', '.join(accounts_that_should_enable_cost_card_to_lottery) msg = f"账户({accounts})仍有剩余卡片,但已无任何可领取礼包,建议开启消耗卡片来抽奖的功能" logger.warning(color("fg_bold_yellow") + msg) if not os.path.exists("DNF蚊子腿小助手_集卡特别版.exe"): logger.warning(color("bold_cyan") + ( "以下为广告时间0-0\n" "如果只需要集卡功能,可以联系我购买集卡特别版哦,特别版仅包含集卡相关功能(集卡、送卡、展示卡片信息、兑换卡片奖励、使用卡片抽奖),供某些只需要集卡的朋友使用\n" "演示地址:https://www.bilibili.com/video/BV1zA411H7mP\n" "价格:6.66元\n" "购买方式:加小助手群后QQ私聊我付款截图,我确认无误后会将DLC以及用法发给你,并拉到一个无法主动加入的专用群,通过群文件分发该DLC的后续更新版本~\n" "PS:这个DLC相当于是小助手的子集,用于仅处理集卡相关内容,之前听到有的朋友有这样的需求,所以特地制作的,是否购买自行考量哈。\n" "如果购买的话能鼓励我花更多时间来维护小助手,支持新的蚊子腿以及优化使用体验(o゚▽゚)o \n" "\n" "2021.2.2 update: 本轮集卡我又换完啦,有需要买卡的朋友可以加群私聊我购买哦~依旧是一元一张任意卡。先问下有没有卡,得到确定回复后直接发付款截图和要收卡片的QQ号码即可(不需要加好友)" ))
def show_lottery_status(ctx, cfg, need_show_tips=False): if not has_any_account_in_normal_run(cfg): return _show_head_line(ctx) order_map = { "1-1": "多人配合新挑战", "1-2": "丰富机制闯难关", "1-3": "新剧情视听盛宴", "1-4": "单人成团战不停", "2-1": "回归奖励大升级", "2-2": "秒升Lv96刷深渊", "2-3": "灿烂自选回归领", "2-4": "告别酱油变大佬", "3-1": "单人爽刷新玩法", "3-2": "独立成团打副本", "3-3": "海量福利金秋享", "3-4": "超强奖励等你拿", "全新团本": "勇士归来礼包", "超低门槛": "超低门槛", "人人可玩": "人人可玩", "幸运礼包": "幸运礼包", } heads = ["序号", "账号名"] colSizes = [4, 12] card_indexes = [ "1-1", "1-2", "1-3", "1-4", "2-1", "2-2", "2-3", "2-4", "3-1", "3-2", "3-3", "3-4" ] card_width = 3 heads.extend(card_indexes) colSizes.extend([card_width for i in card_indexes]) prize_indexes = ["全新团本", "超低门槛", "人人可玩", "幸运礼包"] heads.extend(prize_indexes) colSizes.extend([printed_width(name) for name in prize_indexes]) accounts_that_should_enable_cost_card_to_lottery = [] logger.info(tableify(heads, colSizes)) for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue if not account_config.ark_lottery.show_status: continue djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) lr = djcHelper.fetch_pskey() if lr is None: continue al = ArkLottery(djcHelper, lr) card_counts = al.get_card_counts() prize_counts = al.get_prize_counts() cols = [idx, account_config.name] has_any_card = False has_any_left_gift = False # 处理各个卡片数目 for card_index in card_indexes: card_count = card_counts[order_map[card_index]] show_count = card_count # 特殊处理色彩 if card_count == 0: if idx == 1: # 突出显示大号没有的卡片 show_count = color("fg_bold_cyan") + padLeftRight( card_count, 3) + color("INFO") else: # 小号没有的卡片直接不显示,避免信息干扰 show_count = "" else: if idx == 1: if card_count == 1: # 大号只有一张的卡片也特殊处理 show_count = color("fg_bold_blue") + padLeftRight( card_count, 3) + color("INFO") else: # 大号其余卡片亮绿色 show_count = color("fg_bold_green") + padLeftRight( card_count, 3) + color("INFO") else: # 小号拥有的卡片淡化处理,方便辨识 show_color = account_config.ark_lottery.show_color or "fg_bold_black" show_count = color(show_color) + padLeftRight( card_count, 3) + color("INFO") cols.append(show_count) if card_count > 0: has_any_card = True # 处理各个奖励剩余领取次数 for prize_index in prize_indexes: prize_count = prize_counts[order_map[prize_index]] cols.append(prize_count) if prize_count > 0: has_any_left_gift = True logger.info(tableify(cols, colSizes)) if has_any_card and not has_any_left_gift: accounts_that_should_enable_cost_card_to_lottery.append( account_config.name) if need_show_tips and len( accounts_that_should_enable_cost_card_to_lottery) > 0: msg = "账户({})仍有剩余卡片,但已无任何可领取礼包,建议开启消耗卡片来抽奖的功能".format( ', '.join(accounts_that_should_enable_cost_card_to_lottery)) logger.warning(color("fg_bold_yellow") + msg)
def show_lottery_status(ctx, cfg, need_show_tips=False): if not has_any_account_in_normal_run(cfg): return _show_head_line(ctx) logger.info(get_not_ams_act_desc("集卡")) lottery_zzconfig = zzconfig() card_info_map = parse_card_group_info_map(lottery_zzconfig) order_map = {} # 卡片编码 => 名称 for name, card_info in card_info_map.items(): order_map[card_info.index] = name # 奖励展示名称 => 实际名称 groups = [ lottery_zzconfig.prizeGroups.group1, lottery_zzconfig.prizeGroups.group2, lottery_zzconfig.prizeGroups.group3, lottery_zzconfig.prizeGroups.group4, ] prizeDisplayTitles = [] for group in groups: displayTitle = group.title if len(displayTitle) > 4 and "礼包" in displayTitle: # 将 全民竞速礼包 这种名称替换为 全民竞速 displayTitle = displayTitle.replace("礼包", "") order_map[displayTitle] = group.title prizeDisplayTitles.append(displayTitle) heads = [] colSizes = [] baseHeads = ["序号", "账号名"] baseColSizes = [4, 12] heads.extend(baseHeads) colSizes.extend(baseColSizes) card_indexes = ["1-1", "1-2", "1-3", "1-4", "2-1", "2-2", "2-3", "2-4", "3-1", "3-2", "3-3", "3-4"] card_width = 3 heads.extend(card_indexes) colSizes.extend([card_width for i in card_indexes]) prize_indexes = [*prizeDisplayTitles] heads.extend(prize_indexes) colSizes.extend([printed_width(name) for name in prize_indexes]) accounts_that_should_enable_cost_card_to_lottery = [] logger.info(tableify(heads, colSizes)) summaryCols = [1, "总计", *[0 for card in card_indexes], *[count_with_color(0, "bold_green", show_width=printed_width(prize_index)) for prize_index in prize_indexes]] for _idx, account_config in enumerate(cfg.account_configs): idx = _idx + 1 if not account_config.is_enabled(): # 未启用的账户的账户不走该流程 continue if not account_config.ark_lottery.show_status: continue djcHelper = DjcHelper(account_config, cfg.common) lr = djcHelper.fetch_pskey() if lr is None: continue djcHelper.check_skey_expired() djcHelper.get_bind_role_list(print_warning=False) qa = QzoneActivity(djcHelper, lr) card_counts = qa.get_card_counts() prize_counts = qa.get_prize_counts() summaryCols[0] += 1 cols = [idx, account_config.name] has_any_card = False has_any_left_gift = False # 处理各个卡片数目 for card_position, card_index in enumerate(card_indexes): card_count = card_counts[order_map[card_index]] cols.append(colored_count(idx, card_count, account_config.ark_lottery.show_color)) # 更新统计信息 summaryCols[len(baseHeads) + card_position] += card_count if card_count > 0: has_any_card = True # 处理各个奖励剩余领取次数 for prize_index in prize_indexes: prize_count = prize_counts[order_map[prize_index]] cols.append(count_with_color(prize_count, "bold_green", show_width=printed_width(prize_index))) if prize_count > 0: has_any_left_gift = True logger.info(tableify(cols, colSizes)) if has_any_card and not has_any_left_gift: accounts_that_should_enable_cost_card_to_lottery.append(account_config.name) for cardIdx in range(len(card_indexes)): idx = len(baseHeads) + cardIdx summaryCols[idx] = colored_count(len(cfg.account_configs), summaryCols[idx], cfg.common.ark_lottery_summary_show_color or "fg_thin_cyan") logger.info(tableify(summaryCols, colSizes)) if need_show_tips and len(accounts_that_should_enable_cost_card_to_lottery) > 0: accounts = ', '.join(accounts_that_should_enable_cost_card_to_lottery) msg = f"账户({accounts})仍有剩余卡片,但已无任何可领取礼包,建议开启消耗卡片来抽奖的功能" logger.warning(color("fg_bold_yellow") + msg)
from util import show_head_line if __name__ == '__main__': # 读取配置信息 load_config("config.toml", "config.toml.local") cfg = config() # 12.30 送卡片次数(re:好像送给别人没有上限?) indexes = [4] for idx in indexes: # 从1开始,第i个 account_config = cfg.account_configs[idx - 1] show_head_line("开始处理第{}个账户[{}]".format(idx, account_config.name), color("fg_bold_yellow")) djcHelper = DjcHelper(account_config, cfg.common) djcHelper.check_skey_expired() djcHelper.get_bind_role_list() lr = djcHelper.fetch_pskey() # re: 先填QQ # undone: 然后填写卡片 targetQQ = "XXXXXXXXXXX" cards_to_send = [ ("XXXXXXXXXXX", 1), ("XXXXXXXXXXX", 1), ("XXXXXXXXXXX", 1), ("XXXXXXXXXXX", 1), ] for name, count in cards_to_send: