Ejemplo n.º 1
0
def api_sync_normal_gacha(player):
    data = '{}'
    res = utils.post_to_gs('/gacha/syncNormalGacha', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('卡池信息同步成功: uid:{}'.format(player.get_uid()))
    return
Ejemplo n.º 2
0
def api_recieve_mail(player, mail_id, mail_type):
    data = '{{"type":{},"mailId":{}}}'.format(mail_type, mail_id)
    res = utils.post_to_gs('/mail/receiveMail', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('邮件收取成功: uid:{}, 邮件id:{}'.format(player.get_uid(), mail_id))
    return
Ejemplo n.º 3
0
def api_checkin(player):
    data = '{}'
    res = utils.post_to_gs('/user/checkIn', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('每日签到完成: uid:{}'.format(player.get_uid()))
    return
Ejemplo n.º 4
0
def api_upgrade_guest_user(player_guest, player_new):
    sign = encrypt_utils.u8_sign(
        encrypt_utils.GUEST_UPGRADE_STR.format(player_new.get_device_id(),
                                               player_guest.get_device_id2(),
                                               player_guest.get_device_id3(),
                                               player_guest.get_channel_uid(),
                                               player_guest.get_access_token(),
                                               player_new.get_channel_uid(),
                                               player_new.get_access_token(),
                                               config.PLATFORM,
                                               player_guest.get_uid()))
    data = '''{{"uid":"{}","extension1":"{{\\"uid\\":\\"{}\\",\\"access_token\\":\\"{}\\"}}","extension2":"{{\\"uid\\":\\"{}\\",\\"access_token\\":\\"{}\\"}}","platform":{},"deviceId":"{}","deviceId2":"{}","deviceId3":"{}","sign":"{}"}}'''.format(
        player_guest.get_uid(), player_guest.get_channel_uid(),
        player_guest.get_access_token(), player_new.get_channel_uid(),
        player_new.get_access_token(), config.PLATFORM,
        player_new.get_device_id(), player_guest.get_device_id2(),
        player_guest.get_device_id3(), sign)
    res = utils.post_to_as('/u8/user/upgradeGuestUser', data)
    code = int(res['result'])
    if code:
        panic('游客账号绑定失败: data={}, err_code={}'.format(data, code))
    player_guest.set_account(player_new.get_account())
    player_guest.set_password(player_new.get_password())
    logger.i('游客账号绑定成功: 账号:{}, 密码:{}, uid:{}'.format(
        player_guest.get_account(), player_guest.get_password(),
        player_guest.get_uid()))
    return
Ejemplo n.º 5
0
def api_finish_story(player, story):
    data = '{{"storyId":"{}"}}'.format(story)
    res = utils.post_to_gs('/story/finishStory', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('完成剧情: uid:{}, story: {}'.format(player.get_uid(), story))
    return
Ejemplo n.º 6
0
def api_get_token(player):
    sign = encrypt_utils.u8_sign(
        encrypt_utils.GET_TOKEN_SIGN_STR.format(config.APP_ID,
                                                config.CHANNEL_ID,
                                                player.get_device_id(),
                                                player.get_device_id2(),
                                                player.get_device_id3(),
                                                player.get_channel_uid(),
                                                player.get_access_token(),
                                                config.PLATFORM,
                                                config.SUB_CHANNEL,
                                                config.WORLD_ID))
    data = '''{{"appId":"{}","channelId":"{}","extension":"{{\\"uid\\":\\"{}\\",\\"access_token\\":\\"{}\\"}}","worldId":"{}","platform":{},"subChannel":"{}","deviceId":"{}","deviceId2":"{}","deviceId3":"{}","sign":"{}"}}'''.format(
        config.APP_ID, config.CHANNEL_ID, player.get_channel_uid(),
        player.get_access_token(), config.WORLD_ID, config.PLATFORM,
        config.SUB_CHANNEL, player.get_device_id(), player.get_device_id2(),
        player.get_device_id3(), sign)
    res = utils.post_to_as('/u8/user/getToken', data)
    code = int(res['result'])
    if code:
        panic('获取token失败: data={}, err_code={}'.format(data, code))
    player.set_uid(res['uid'])
    player.set_token(res['token'])
    player.save_account_info()
    logger.i('获取token成功: uid:{}, channel_uid:{}, token:{}'.format(
        res['uid'], res['channelUid'], res['token']))
    return res
Ejemplo n.º 7
0
def api_squad_formation(player, squad_id, slots, change_skill=0):
    data = '{{"squadId":"{}","slots":{},"changeSkill":{}}}'.format(
        squad_id, json.dumps(slots, ensure_ascii=False), change_skill)
    res = utils.post_to_gs('/quest/squadFormation', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('编队更新成功: uid:{}'.format(player.get_uid()))
    return
Ejemplo n.º 8
0
def api_confirm_mission(player, mission_id):
    data = '{{"missionId":"{}"}}'.format(mission_id)
    res = utils.post_to_gs('/mission/confirmMission', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('完成任务: uid:{}, mission_id:{}'.format(player.get_uid(),
                                                  mission_id))
    return
Ejemplo n.º 9
0
def api_sync_status(player, modules):
    data = '{{"modules":{},"params":{{"16":{{"goodIdMap":{{"LS":[],"HS":[],"ES":[],"CASH":[],"GP":["GP_Once_1"],"SOCIAL":[]}}}}}}}}'.format(
        modules)
    res = utils.post_to_gs('/account/syncStatus', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('状态同步成功: uid:{}, 更新账号上线时间:{}'.format(player.get_uid(), res['ts']))
    return
Ejemplo n.º 10
0
def api_activity_checkin(player, activity_id, index):
    data = '{{"index":{},"activityId":"{}"}}'.format(index, activity_id)
    res = utils.post_to_gs('/activity/getActivityCheckInReward', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('活动签到完成: uid:{}, 活动id:{}, 当前签到次数:{}'.format(
        player.get_uid(), activity_id, index))
    return
Ejemplo n.º 11
0
 def report_status(self):
     logger.i('脚本完成: uid: {} 剩余体力: {}/{} 玉:{} 源石:{} 金币:{} ssr数量:{}'.format(
         self.get_uid(),
         self.get_attr()['status']['ap'],
         self.get_attr()['status']['maxAp'],
         self.get_attr()['status']['diamondShard'],
         self.get_attr()['status']['androidDiamond'],
         self.get_attr()['status']['gold'], self.get_card_cnt(5)))
     return
Ejemplo n.º 12
0
def api_advancedGacha(player, pool_id, use_ticket):
    data = '{{"poolId":"{}","useTkt":{}}}'.format(pool_id, use_ticket)
    res = utils.post_to_gs('/gacha/advancedGacha', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    is_new = '新' if res['charGet']['isNew'] else '重复'
    logger.i('单抽成功: uid:{}, 获得{}卡牌: {}'.format(player.get_uid(), is_new,
                                               res['charGet']['charId']))
    return
Ejemplo n.º 13
0
def api_auth(player):
    sign = encrypt_utils.u8_sign(
        encrypt_utils.AUTH_SIGN_STR.format(player.get_access_token()))
    data = '{{"token":"{}","sign":"{}"}}'.format(player.get_access_token(),
                                                 sign)
    res = utils.post_to_as('/user/auth', data)
    player.set_channel_uid(res['uid'])
    logger.i('auth登录成功: channel_uid:{}'.format(res['uid']))
    return
Ejemplo n.º 14
0
def api_use_item(player, inst_id, item_id, cnt):
    data = '{{"instId":{},"itemId":"{}","cnt":{}}}'.format(
        inst_id, item_id, cnt)
    res = utils.post_to_gs('/user/useItem', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('道具使用成功: uid:{}, 道具id:{}, 道具剩余数量:{}'.format(
        player.get_uid(), item_id,
        player.get_attr()['consumable'][item_id][inst_id]['count']))
    return
Ejemplo n.º 15
0
def api_bind_nickname(player, nickname):
    data = '{{"nickName":"{}"}}'.format(nickname)
    res = utils.post_to_gs('/user/bindNickName', data, player)
    code = int(res['result'])
    if code:
        panic('设置昵称失败: data={}, err_code={}'.format(data, code))
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('昵称设置成功: uid:{}, 昵称:{}'.format(player.get_uid(), nickname))
    return
Ejemplo n.º 16
0
def api_sync_data(player):
    data = '{"platform":1}'
    res = utils.post_to_gs('/account/syncData', data, player)
    logger.i('数据同步成功: uid:{}, 服务器时间:{}'.format(player.get_uid(), res['ts']))
    # 本地时间校正
    utils.set_time_diff(res['ts'])
    # 记录玩家上线时间
    player.set_login_time(res['user']['event']['status'])
    # 保存玩家游戏数据
    player.update_attr(res['user'])
    logger.i('登陆时间戳已保存: uid:{}, login_time:{}'.format(player.get_uid(),
                                                      player.get_login_time()))
    return res
Ejemplo n.º 17
0
def api_login(player):
    if not RES_VERSION or not CLIENT_VERSION:
        panic('获取客户端版本号失败!')
    data = '''{{"networkVersion":"{}","uid":"{}","token":"{}","assetsVersion":"{}","clientVersion":"{}","platform":{},"deviceId":"{}","deviceId2":"{}","deviceId3":"{}"}}'''.format(
        config.NETWORK_VERSION, player.get_uid(), player.get_token(),
        RES_VERSION, CLIENT_VERSION, config.PLATFORM, player.get_device_id(),
        player.get_device_id2(), player.get_device_id3())
    res = utils.post_to_gs('/account/login', data, player)
    code = int(res['result'])
    if code:
        panic('登录失败: data={}, err_code={}'.format(data, code))
    player.set_secret(res['secret'])
    logger.i('账号登录成功: uid={}, secret={}'.format(player.get_uid(),
                                                player.get_secret()))
    return player.get_secret()
Ejemplo n.º 18
0
def api_guest_login(player):
    sign = encrypt_utils.u8_sign(
        encrypt_utils.GUEST_LOGIN_SIGN_STR.format(player.get_device_id()))
    data = '{{"deviceId":"{}","sign":"{}"}}'.format(player.get_device_id(),
                                                    sign)
    res = utils.post_to_as('/user/guestLogin', data)
    code = int(res['result'])
    if code:
        panic('账号注册失败: data={}, err_code={}'.format(data, code))
    player.set_channel_uid(res['uid'])
    player.set_access_token(res['token'])
    logger.i('账号注册成功: deviceId:{}, channel_uid:{}, access_token:{}'.format(
        player.get_device_id(), res['uid'], res['token']))
    # 返回新注册账号的信息
    return res
Ejemplo n.º 19
0
def api_get_meta_info_list(player):
    data = '{{"from":{}}}'.format(utils.get_local_time())
    res = utils.post_to_gs('/mail/getMetaInfoList', data, player)
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    unread_mail_list = []
    has_item = False
    for mail in res['result']:
        if 0 == mail['state']:
            unread_mail_list.append({
                'mailId': mail['mailId'],
                'type': mail['type']
            })
            if mail['hasItem']:
                has_item = True
    logger.i('成功获取邮件列表: uid:{}, 未读邮件数:{}, 是否有物品:{}'.format(
        player.get_uid(), len(unread_mail_list), has_item))
    return unread_mail_list
Ejemplo n.º 20
0
def api_battle_start(player, stage_id, squad='null', is_weekly_copy=False):
    cgi = '/quest/battleStart' if not is_weekly_copy else '/campaign/battleStart'
    # 不演习/不求助好友/不自动战斗
    use_practice_ticket = 0
    assist_friend = 'null'
    is_replay = 0
    data = '''{{"usePracticeTicket":{},"stageId":"{}","squad":{},"assistFriend":{},"isReplay":{},"startTs":{}}}'''.format(
        use_practice_ticket, stage_id, squad, assist_friend, is_replay,
        utils.get_local_time())
    res = utils.post_to_gs(cgi, data, player)
    code = int(res['result'])
    if code:
        panic('进入副本失败: data={}, err_code={}'.format(data, code))
    battle_id = res['battleId']
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('进入副本成功: uid:{}, 副本id:{}, battle_id:{}'.format(
        player.get_uid(), stage_id, battle_id))
    return battle_id
Ejemplo n.º 21
0
def api_battle_finish(player,
                      battle_id,
                      battle_start_time,
                      battle_data,
                      is_weekly_copy=False):
    cgi = '/quest/battleFinish' if not is_weekly_copy else '/campaign/battleFinish'
    # 校正battle_data数据
    battle_data['battleId'] = battle_id
    # 生成is_cheat校验参数
    is_cheat = encrypt_utils.get_is_cheat(battle_id)
    battle_data['battleData']['isCheat'] = is_cheat
    # 通关时间
    now = utils.get_local_time()
    complete_time = config.get_random_complete_time(now - battle_start_time)
    battle_data['battleData']['completeTime'] = complete_time
    battle_data['battleData']['stats']['beginTs'] = battle_start_time
    battle_data['battleData']['stats']['endTs'] = now
    # 生成access校验
    access = encrypt_utils.get_access_token(player.get_login_time())
    battle_data['battleData']['stats']['access'] = access
    # 应用包名
    battle_data['battleData']['stats']['packageName'] = config.PACKAGE_NAME
    # 平台
    battle_data['platform'] = config.PLATFORM
    # 战斗数据更多优化
    config.adjust_battle_data(battle_data)
    # battle_data加密
    encrypted_data = encrypt_utils.battle_finish_data_encrypt(
        json.dumps(battle_data), player.get_login_time())
    data = '''{{"data":"{}","battleData":{{"isCheat":"{}","completeTime":{},"stats":null}}}}'''.format(
        encrypted_data, is_cheat, complete_time)
    res = utils.post_to_gs(cgi, data, player)
    code = int(res['result'])
    if code:
        panic('副本通关失败: data={}, err_code={}'.format(data, code))
    # 游戏数据差量更新
    player.update_attr(res['playerDataDelta']['modified'])
    logger.i('副本通关成功: uid:{}, 当前剩余体力: {}/{}'.format(
        player.get_uid(),
        player.get_attr()['status']['ap'],
        player.get_attr()['status']['maxAp']))
    return res
Ejemplo n.º 22
0
def api_as_login(player):
    sign = encrypt_utils.u8_sign(
        encrypt_utils.LOGIN_SIGN_STR.format(player.get_account(),
                                            player.get_device_id(),
                                            player.get_password(),
                                            config.PLATFORM))
    data = '{{"account":"{}","password":"******","deviceId":"{}","platform":{},"sign":"{}"}}'.format(
        player.get_account(), player.get_password(), player.get_device_id(),
        config.PLATFORM, sign)
    res = utils.post_to_as('/user/login', data)
    code = int(res['result'])
    if code:
        panic('账号密码登录失败: data={}, err_code={}'.format(data, code))
    player.set_channel_uid(res['uid'])
    player.set_access_token(res['token'])
    logger.i(
        '账号密码登录成功: 账号:{}, 密码:{}, deviceId:{}, channel_uid:{}, access_token:{}'.
        format(player.get_account(), player.get_password(),
               player.get_device_id(), res['uid'], res['token']))
    return
Ejemplo n.º 23
0
def play():
    # 新建玩家
    player = players.Player(config.get_random_device_id())
    time.sleep(0.5)

    # 注册账号
    api.api_guest_login(player)
    gevent.sleep(1)

    # auth登录
    api.api_auth(player)
    gevent.sleep(5)

    # 获取token
    api.api_get_token(player)
    gevent.sleep(1)

    # 登录游戏服务器
    api.api_login(player)
    # 同步账号数据
    api.api_sync_data(player)
    # 更新在线状态
    api.api_sync_status(player, 95)
    # 获取未完成订单
    api.api_get_unconfirmed_orderid_list(player)
    gevent.sleep(2)

    # 设置昵称
    api.api_bind_nickname(player, config.get_random_nickname())
    gevent.sleep(1)

    # 进入教程01副本
    battle_id = api.api_battle_start(player, 'guide_01')
    # 计算本次副本持续时间
    battle_start_time = utils.get_local_time()
    battle_finish_time = config.get_random_battle_finish_time(
        battle_start_time)
    logger.i('本次副本持续时间: {}秒'.format(battle_finish_time - battle_start_time))
    # 等待战斗结束
    gevent.sleep(battle_finish_time - battle_start_time)

    # 战斗日志
    battle_data = json.loads(
        utils.read_buf_from_file('gamedata/battle_log/guide_01.json'))
    # 教程01副本通关
    api.api_battle_finish(player, battle_id, battle_start_time, battle_data)
    gevent.sleep(1)

    # 进入教程02副本
    battle_id = api.api_battle_start(player, 'guide_02')
    battle_start_time = utils.get_local_time()
    battle_finish_time = config.get_random_battle_finish_time(
        battle_start_time)
    logger.i('本次副本持续时间: {}秒'.format(battle_finish_time - battle_start_time))
    # 等待战斗结束
    gevent.sleep(battle_finish_time - battle_start_time)

    # 战斗日志
    battle_data = json.loads(
        utils.read_buf_from_file('gamedata/battle_log/guide_02.json'))
    # 教程02副本通关
    api.api_battle_finish(player, battle_id, battle_start_time, battle_data)
    gevent.sleep(1)

    # 更新在线状态
    api.api_sync_status(player, 95)
    # 提交剧情
    api.api_finish_story(player, 'obt/guide/l0-0/0_home_ui')
    gevent.sleep(1)

    # 同步卡池
    api.api_sync_normal_gacha(player)
    # 单抽
    api.api_advancedGacha(player, 'BOOT_0_1_1', 0)
    gevent.sleep(5)

    # 提交剧情
    api.api_finish_story(player, 'obt/guide/l0-0/1_recruit_adv')
    gevent.sleep(1)

    # 更新编队0信息
    squad_id = '0'
    slots = player.get_attr()['troop']['squads'][squad_id]['slots']
    slots[4] = {"charInstId": 5, "skillIndex": 0}
    api.api_squad_formation(player, squad_id, slots)
    # 提交剧情
    api.api_finish_story(player, 'obt/guide/l0-0/2_make_squad')
    gevent.sleep(1)

    # 进入主线main_00-01副本
    squad = player.get_attr()['troop']['squads']['0']
    battle_id = api.api_battle_start(player, 'main_00-01',
                                     json.dumps(squad, ensure_ascii=False))
    gevent.sleep(2)

    # 提交剧情
    api.api_finish_story(player, 'obt/guide/l0-0/3_battle_ui')
    gevent.sleep(2)
    api.api_finish_story(player, 'obt/main/level_main_00-01_beg')
    gevent.sleep(2)

    # 等待战斗结束
    battle_start_time = utils.get_local_time()
    battle_finish_time = config.get_random_battle_finish_time(
        battle_start_time)
    logger.i('本次副本持续时间: {}秒'.format(battle_finish_time - battle_start_time))
    gevent.sleep(battle_finish_time - battle_start_time)

    # 战斗日志
    battle_data = json.loads(
        utils.read_buf_from_file('gamedata/battle_log/main_00-01.json'))
    # 主线main_00-01副本通关
    api.api_battle_finish(player, battle_id, battle_start_time, battle_data)
    gevent.sleep(2)

    # 提交剧情
    api.api_finish_story(player, 'obt/main/level_main_00-01_end')
    gevent.sleep(2)
    # 更新在线状态
    api.api_sync_status(player, 95)

    # 提交任务
    api.api_confirm_mission(player, 'main_1')
    gevent.sleep(2)
    # 提交剧情
    api.api_finish_story(player, 'obt/guide/l0-1/0_mission_main')
    gevent.sleep(2)

    # 每日签到
    if player.get_attr()['checkIn']['canCheckIn']:
        api.api_checkin(player)

    # 领取新手礼包
    mail_list = api.api_get_meta_info_list(player)
    for mail in mail_list:
        api.api_recieve_mail(player, mail['mailId'], mail['type'])
        gevent.sleep(1)

    # 活动签到
    if config.CHECKIN_ACTIVITY_ID:
        history = player.get_attr()['activity']['CHECKIN_ONLY'][
            config.CHECKIN_ACTIVITY_ID]['history']
        for index in range(len(history)):
            if history[index]:
                api.api_activity_checkin(player, config.CHECKIN_ACTIVITY_ID,
                                         index)

    # 使用消耗品
    for item_id in player.get_attr()['consumable']:
        for inst_id in player.get_attr()['consumable'][item_id]:
            cnt = player.get_attr()['consumable'][item_id][inst_id]['count']
            if cnt > 0:
                api.api_use_item(player, inst_id, item_id, cnt)

    # 当前角色脚本完成
    player.report_status()
    return
Ejemplo n.º 24
0
def api_get_unconfirmed_orderid_list(player):
    data = '{}'
    utils.post_to_gs('/pay/getUnconfirmedOrderIdList', data, player)
    logger.i('获取未完成订单成功: uid:{}'.format(player.get_uid()))
    return
Ejemplo n.º 25
0
def api_get_version():
    res = {"resVersion": "19-09-24-12-06-01-04fffa", "clientVersion": "0.7.52"}
    logger.i('获取客户端版本号成功: resVersion:{}, clientVersion:{}'.format(
        res['resVersion'], res['clientVersion']))
    return res['resVersion'], res['clientVersion']