diff --git a/README.md b/README.md index c79f8e61..ae14ed9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GenshinUID / 原神UID查询 -一个HoshinoBot插件,用于查询原神UID信息,用于查询树脂/探索派遣状态,推送树脂快满了。 +一个HoshinoBot插件,用于查询原神UID信息,用于查询树脂/探索派遣状态,推送树脂快满了,每日签到。 **一定要读更新记录和指令!!** @@ -46,6 +46,14 @@ $ pip3 install -r requirements.txt ## 更新记录 +#### 2021-10-24 + +**重要:目前Cookies池又采用了新的方式(去除冗余),如果你是上个版本的使用者,请在更新后使用群聊命令:优化Cookies,无损迁移旧版本全部Cookies;(如果你是上上个版本的使用者,更新后使用命令:迁移Cookies)** + +修复:可能会导致的添加cookies问题 + +新增:绑定Cookies后可以实现米游社签到,如果开启自动签到之后,可以每天0:30准时签到,具体使用可以前往[指令](#指令)处查阅。 + #### 2021-10-17 **重要:目前Cookies池采用了新的方式,如果你是之前版本的使用者,请在更新后使用群聊命令:迁移Cookies,无损迁移旧版本全部Cookies** @@ -148,29 +156,33 @@ $ pip3 install -r requirements.txt (**括号内为可选词缀**,以下所有可以输出图片的,**命令后跟图可自定义背景图片**): -| 触发前缀 | 触发后缀/备注 | 效果 | 举例 | 备注 | -| :--------------------- | ---------------------- | ---------------------------------- | ------------------ | ---------------------------------------- | -| uid | | 获取角色信息一览(带武器信息) | uid123456789 | | -| uid | (上期)深渊 | 获取角色深渊总览(层数为最后一层) | uid123456789深渊 | | -| uid | (上期)深渊9/10/11/12 | 获取角色深渊某一层数据 | uid123456789深渊12 | | -| mys | | 角色信息(带武器信息,冒险等级) | mys123456 | 米游社通行证 | -| mys | (上期)深渊 | 获取角色深渊总览(层数为最后一层) | mys123456深渊 | 米游社通行证 | -| mys | (上期)深渊9/10/11/12 | 获取角色深渊某一层数据 | mys123456深渊12 | 米游社通行证 | -| UID | | 获取角色信息一览(不带武器信息) | UID123456789 | 旧版本,比例更和谐 | -| 绑定uid | | 当前qq号关联绑定uid | 绑定uid123456789 | 查询前缀前置条件 | -| 绑定mys | | 当前qq号关联绑定米游社通行证 | 绑定mys12345678 | 查询前缀前置条件 | -| 查询 | | 查询当前绑定角色信息一览 | 查询 | **必须**绑定过mys/uid | -| 查询(上期)深渊 | | 查询当前绑定角色深渊总览 | 查询深渊 | **必须**绑定过mys/uid | -| 查询(上期)深渊\d | | 查询当前绑定角色深渊某一层数据 | 查询深渊10 | **必须**绑定过mys/uid | -| 添加 | | 向cookies池添加cookies | 添加 _ga=balabala | **私聊**bot,注意空格 | -| 查询 @人 | | 获取@的群友的角色信息一览 | 查询 @Wuyi | | -| 查询(上期)深渊 @人 | | 获取@的群友的深渊信息一览 | 查询深渊 @Wuyi | | -| 查询(上期)深渊\d @人 | | 获取@的群友的深渊某一层数据 | 查询深渊10 @Wuyi | | -| 当前状态 | | 获取树脂、每日委托、派遣等信息 | 当前状态 | **必须**绑定过CK和uid | -| 开启推送 | | 开启推送,超过140树脂提醒旅行者 | 开启推送 | 群聊/私聊都可
**必须**绑定过CK和uid | -| 关闭推送 | | 关闭树脂快满的提醒 | 关闭推送 | 都可以 | -| 校验全部Cookies | | 校验当前池内全部Cookies状态 | 校验全部Cookies | **群聊** | -| 迁移Cookies | | 迁移旧版本全部Cookies | 迁移Cookies | **群聊** | +| 触发前缀 | 触发后缀/备注 | 效果 | 举例 | 备注 | +| :--------------------- | ---------------------- | ----------------------------------- | ------------------ | ---------------------------------------- | +| uid | | 获取角色信息一览(带武器信息) | uid123456789 | | +| uid | (上期)深渊 | 获取角色深渊总览(层数为最后一层) | uid123456789深渊 | | +| uid | (上期)深渊9/10/11/12 | 获取角色深渊某一层数据 | uid123456789深渊12 | | +| mys | | 角色信息(带武器信息,冒险等级) | mys123456 | 米游社通行证 | +| mys | (上期)深渊 | 获取角色深渊总览(层数为最后一层) | mys123456深渊 | 米游社通行证 | +| mys | (上期)深渊9/10/11/12 | 获取角色深渊某一层数据 | mys123456深渊12 | 米游社通行证 | +| UID | | 获取角色信息一览(不带武器信息) | UID123456789 | 旧版本,比例更和谐 | +| 绑定uid | | 当前qq号关联绑定uid | 绑定uid123456789 | 查询前缀前置条件 | +| 绑定mys | | 当前qq号关联绑定米游社通行证 | 绑定mys12345678 | 查询前缀前置条件 | +| 查询 | | 查询当前绑定角色信息一览 | 查询 | **必须**绑定过mys/uid | +| 查询(上期)深渊 | | 查询当前绑定角色深渊总览 | 查询深渊 | **必须**绑定过mys/uid | +| 查询(上期)深渊\d | | 查询当前绑定角色深渊某一层数据 | 查询深渊10 | **必须**绑定过mys/uid | +| 添加 | | 向cookies池添加cookies | 添加 _ga=balabala | **私聊**bot,注意空格 | +| 查询 @人 | | 获取@的群友的角色信息一览 | 查询 @Wuyi | | +| 查询(上期)深渊 @人 | | 获取@的群友的深渊信息一览 | 查询深渊 @Wuyi | | +| 查询(上期)深渊\d @人 | | 获取@的群友的深渊某一层数据 | 查询深渊10 @Wuyi | | +| 当前状态 | | 获取树脂、每日委托、派遣等信息 | 当前状态 | **必须**绑定过CK和uid | +| 开启推送 | | 开启推送,超过140树脂提醒旅行者 | 开启推送 | 群聊/私聊都可
**必须**绑定过CK和uid | +| 关闭推送 | | 关闭树脂快满的提醒 | 关闭推送 | 都可以 | +| 校验全部Cookies | | 校验当前池内全部Cookies状态 | 校验全部Cookies | **群聊** | +| 迁移Cookies | | 迁移旧版本(上上个版本)全部Cookies | 迁移Cookies | **群聊** | +| 优化Cookies | | 优化上个版本全部Cookies | 优化Cookies | **群聊** | +| 签到 | | 米游社签到 | 签到 | **必须**绑定过CK和uid | +| 开启自动签到 | | 开启每日米游社签到 | 开启自动签到 | 群聊/私聊都可
**必须**绑定过CK和uid | +| 关闭自动签到 | | 关闭每日米游社签到 | 关闭自动签到 | 群聊/私聊都可
**必须**绑定过CK和uid | ### 深渊查询: @@ -180,6 +192,10 @@ $ pip3 install -r requirements.txt ![3](https://raw.githubusercontent.com/KimigaiiWuyi/GenshinUID/main/readme/3.png) +### 签到: + +![3](https://raw.githubusercontent.com/KimigaiiWuyi/GenshinUID/main/readme/4.png) + ## 相关仓库 - [PaimonBot](https://github.com/XiaoMiku01/PaimonBot) - 插件原始代码来自于它 diff --git a/__init__.py b/__init__.py index b2b0b34f..46b774f2 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,5 @@ from .getImg import draw_pic,draw_abyss_pic,draw_abyss0_pic -from .getDB import connectDB,selectDB,cookiesDB,cacheDB,deletecache,CheckDB,TransDB,OpenPush,GetMysInfo,GetDaily +from .getDB import connectDB,selectDB,cookiesDB,cacheDB,deletecache,CheckDB,TransDB,OpenPush,GetMysInfo,GetDaily,GetSignList,MysSign,GetSignInfo,OpCookies from nonebot import * from hoshino import Service,R,priv,util @@ -21,63 +21,48 @@ FILE_PATH = os.path.dirname(__file__) FILE2_PATH = os.path.join(FILE_PATH,'mys') Texture_PATH = os.path.join(FILE2_PATH,'texture2d') +daily_im = ''' +============== +(还剩{}补充满) +============== +原粹树脂:{}/160 +每日委托:{}/4 +探索派遣:{}/{} +======== +{}''' @sv.scheduled_job('cron', hour='0') async def delete(): deletecache() -@sv.scheduled_job('interval', minutes=30) -async def push(): +@sv.scheduled_job('cron', hour='0',minute="30") +async def dailysign(): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - cursor = c.execute("SELECT * FROM NewCookies WHERE StatusA != ?",("off",)) + cursor = c.execute("SELECT * FROM NewCookiesTable WHERE StatusB != ?",("off",)) c_data = cursor.fetchall() for row in c_data: - raw_data = await GetDaily(str(row[1])) - dailydata = raw_data["data"] - resin_num = dailydata["current_resin"] - if resin_num >= row[5]: - re_time = dailydata["resin_recovery_time"] - m, s = divmod(int(re_time), 60) - h, m = divmod(m, 60) - time = "%02d小时%02d分钟%02d秒" % (h, m, s) + + im = await sign(str(row[0])) - task_num = dailydata["finished_task_num"] - travel_num = dailydata["current_expedition_num"] - max_travel_num = dailydata["max_expedition_num"] - travel_data = dailydata["expeditions"] - - travel_str = '' - - for i in travel_data: - name = i["avatar_side_icon"].split('/')[-1].split('.')[0].split('_')[-1] - statu = i['status'] - if statu == "Finished": - travel_str = travel_str + f"{name} : 完成\n" - else: - remain_time = i['remained_time'] - m1, s1 = divmod(int(remain_time), 60) - h1, m1 = divmod(m1, 60) - remain_time_str = "还剩%02d小时%02d分钟%02d秒" % (h1, m1, s1) - travel_str = travel_str + f"{name} : {remain_time_str}\n" - im = f''' -============== -你的树脂快满了!!! -(还剩{time}补充满) -============== -原粹树脂:{resin_num}/160 -每日委托:{task_num}/4 -探索派遣:{travel_num}/{max_travel_num} -======== -{travel_str} -'''.strip() - - if row[2] == "on": - await bot.send_private_msg(user_id = row[4],message = im) - else: - await bot.send_group_msg(group_id = row[2],message = f"[CQ:at,qq={row[4]}]" + "\n" + im) + if row[4] == "on": + await bot.send_private_msg(user_id = row[2],message = im) else: - pass + await bot.send_group_msg(group_id = row[4],message = f"[CQ:at,qq={row[2]}]" + "\n" + im) + +@sv.scheduled_job('interval', minutes=30) +async def push(): + daily_data = await daily() + if daily_data != None: + for i in daily_data: + if i['gid'] == "on": + await bot.send_private_msg(user_id = i['qid'],message = i['message']) + else: + await bot.send_group_msg(group_id = i['gid'],message = f"[CQ:at,qq={i['qid']}]" + "\n" + i['message']) + else: + pass + + @bot.on_message('private') async def setting(ctx): @@ -88,55 +73,112 @@ async def setting(ctx): if '添加 ' in message: try: mes = message.replace('添加 ','') - ltuid = re.search(r"ltuid=(\d*)", mes) - mysid_data = ltuid.group(0).split('=') + aid = re.search(r"account_id=(\d*)", mes) + mysid_data = aid.group(0).split('=') mysid = mysid_data[1] - - mys_data = await GetMysInfo(mysid,mes) + cookie = ';'.join(filter(lambda x: x.split('=')[0] in ["cookie_token", "account_id"], [i.strip() for i in mes.split(';')])) + mys_data = await GetMysInfo(mysid,cookie) mys_data = mys_data[0] uid = mys_data['data']['list'][0]['game_role_id'] - await cookiesDB(uid,mes) + await cookiesDB(uid,cookie,userid) await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'添加Cookies成功!Cookies属于个人重要信息,如果你是在不知情的情况下添加,请马上修改米游社账户密码,保护个人隐私!') except: - await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'校验失败!') + await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=f'校验失败!请输入正确的Cookies!') elif '开启推送' in message: try: uid = await selectDB(userid,mode = "uid") - im = await OpenPush(int(uid[0]),userid,"on") + im = await OpenPush(int(uid[0]),userid,"on","StatusA") await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) except: await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") elif '关闭推送' in message: try: uid = await selectDB(userid,mode = "uid") - im = await OpenPush(int(uid[0]),userid,"off") + im = await OpenPush(int(uid[0]),userid,"off","StatusA") + await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) + except: + await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") + elif '开启自动签到' in message: + try: + uid = await selectDB(userid,mode = "uid") + im = await OpenPush(int(uid[0]),userid,"on","StatusB") + await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) + except: + await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") + elif '关闭自动签到' in message: + try: + uid = await selectDB(userid,mode = "uid") + im = await OpenPush(int(uid[0]),userid,"off","StatusA") await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) except: await bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") -@sv.on_fullmatch('开启推送') +@sv.on_prefix('开启') +async def _(bot:HoshinoBot, ev: CQEvent): + message = ev.message.extract_plain_text() + m = ''.join(re.findall('[\u4e00-\u9fa5]',message)) + if m == "自动签到": + try: + gid = ev.group_id + qid = ev.sender["user_id"] + uid = await selectDB(ev.sender['user_id'],mode = "uid") + im = await OpenPush(int(uid[0]),ev.sender['user_id'],str(gid),"StatusB") + await bot.send(ev,im,at_sender=True) + except: + await bot.send(ev,"未绑定uid信息!",at_sender=True) + elif m == "推送": + try: + gid = ev.group_id + qid = ev.sender["user_id"] + uid = await selectDB(ev.sender['user_id'],mode = "uid") + im = await OpenPush(int(uid[0]),ev.sender['user_id'],str(gid),"StatusA") + await bot.send(ev,im,at_sender=True) + except: + await bot.send(ev,"未绑定uid信息!",at_sender=True) + +@sv.on_prefix('关闭') +async def _(bot:HoshinoBot, ev: CQEvent): + message = ev.message.extract_plain_text() + m = ''.join(re.findall('[\u4e00-\u9fa5]',message)) + if m == "自动签到": + try: + gid = ev.group_id + qid = ev.sender["user_id"] + uid = await selectDB(ev.sender['user_id'],mode = "uid") + im = await OpenPush(int(uid[0]),ev.sender['user_id'],"off","StatusB") + await bot.send(ev,im,at_sender=True) + except: + await bot.send(ev,"未绑定uid信息!",at_sender=True) + elif m == "推送": + try: + gid = ev.group_id + qid = ev.sender["user_id"] + uid = await selectDB(ev.sender['user_id'],mode = "uid") + im = await OpenPush(int(uid[0]),ev.sender['user_id'],"off","StatusA") + await bot.send(ev,im,at_sender=True) + except: + await bot.send(ev,"未绑定uid信息!",at_sender=True) + +@sv.on_fullmatch('签到') async def _(bot:HoshinoBot, ev: CQEvent): try: - gid = ev.group_id qid = ev.sender["user_id"] uid = await selectDB(ev.sender['user_id'],mode = "uid") - im = await OpenPush(int(uid[0]),ev.sender['user_id'],str(gid)) + uid = uid[0] + im = await sign(uid) await bot.send(ev,im,at_sender=True) except: - await bot.send(ev,"未绑定uid信息!",at_sender=True) + pass -@sv.on_fullmatch('关闭推送') +@sv.on_fullmatch('优化Cookies') async def _(bot:HoshinoBot, ev: CQEvent): try: - gid = ev.group_id - qid = ev.sender["user_id"] - uid = await selectDB(ev.sender['user_id'],mode = "uid") - im = await OpenPush(int(uid[0]),ev.sender['user_id'],"off") + im = await OpCookies() await bot.send(ev,im,at_sender=True) except: - await bot.send(ev,"未绑定uid信息!",at_sender=True) - + pass + @sv.on_fullmatch('校验全部Cookies') async def _(bot:HoshinoBot, ev: CQEvent): im = await CheckDB() @@ -152,45 +194,8 @@ async def _(bot:HoshinoBot, ev: CQEvent): try: uid = await selectDB(ev.sender['user_id'],mode = "uid") uid = uid[0] - raw_data = await GetDaily(uid) - dailydata = raw_data["data"] - resin_num = dailydata["current_resin"] - re_time = dailydata["resin_recovery_time"] - m, s = divmod(int(re_time), 60) - h, m = divmod(m, 60) - time = "%02d小时%02d分钟%02d秒" % (h, m, s) - - task_num = dailydata["finished_task_num"] - travel_num = dailydata["current_expedition_num"] - max_travel_num = dailydata["max_expedition_num"] - travel_data = dailydata["expeditions"] - - travel_str = '' - - for i in travel_data: - name = i["avatar_side_icon"].split('/')[-1].split('.')[0].split('_')[-1] - statu = i['status'] - if statu == "Finished": - travel_str = travel_str + f"{name} : 完成\n" - else: - remain_time = i['remained_time'] - m1, s1 = divmod(int(remain_time), 60) - h1, m1 = divmod(m1, 60) - remain_time_str = "还剩%02d小时%02d分钟%02d秒" % (h1, m1, s1) - travel_str = travel_str + f"{name} : {remain_time_str}\n" - - im = f''' -: -============== -(还剩{time}补充满) -============== -原粹树脂:{resin_num}/160 -每日委托:{task_num}/4 -探索派遣:{travel_num}/{max_travel_num} -======== -{travel_str} -'''.strip() - + mes = await daily("ask",uid) + im = mes[0]['message'] except: im = "没有找到绑定信息。" @@ -267,7 +272,7 @@ async def _(bot, ev): if len(re.findall(r"\d+", message)) == 1: floor_num = re.findall(r"\d+", message)[0] im = await draw_abyss_pic(uid[0],nickname,floor_num,image,uid[1]) - await bot.send(ev, im, at_sender=True) + await bot.send(ev, im, at_sender=True) else: im = await draw_abyss0_pic(uid[0],nickname,image,uid[1]) await bot.send(ev, im, at_sender=True) @@ -342,3 +347,68 @@ async def _(bot:HoshinoBot, ev: CQEvent): except: await bot.send(ev,'输入错误!') + + + +async def sign(uid): + sign_data = await MysSign(uid) + sign_info = await GetSignInfo(uid) + sign_info = sign_info['data'] + sign_list = await GetSignList() + status = sign_data['message'] + getitem = sign_list['data']['awards'][int(sign_info['total_sign_day'])-1]['name'] + getnum = sign_list['data']['awards'][int(sign_info['total_sign_day'])-1]['cnt'] + get_im = f"本次签到获得{getitem}x{getnum}" + if status == "OK" and sign_info['is_sign'] == True: + mes_im = "签到成功" + else: + mes_im = status + sign_missed = sign_info['sign_cnt_missed'] + im = "\n" + mes_im +"!" + "\n" + get_im + "\n" + f"本月漏签次数:{sign_missed}" + return im + +async def daily(mode = "push",uid = None): + temp_list = [] + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + if mode == "push": + cursor = c.execute("SELECT * FROM NewCookiesTable WHERE StatusA != ?",("off",)) + c_data = cursor.fetchall() + elif mode == "ask": + c_data = ([uid,0,0,0,0,0,0],) + + for row in c_data: + raw_data = await GetDaily(str(row[0])) + dailydata = raw_data["data"] + + resin_num = dailydata["current_resin"] + task_num = dailydata["finished_task_num"] + travel_num = dailydata["current_expedition_num"] + max_travel_num = dailydata["max_expedition_num"] + travel_data = dailydata["expeditions"] + + if resin_num >= row[6] : + + re_time = dailydata["resin_recovery_time"] + m, s = divmod(int(re_time), 60) + h, m = divmod(m, 60) + time = "%02d小时%02d分钟%02d秒" % (h, m, s) + + travel_str = '' + + for i in travel_data: + name = i["avatar_side_icon"].split('/')[-1].split('.')[0].split('_')[-1] + statu = i['status'] + if statu == "Finished": + travel_str = travel_str + f"{name} : 完成\n" + else: + remain_time = i['remained_time'] + m1, s1 = divmod(int(remain_time), 60) + h1, m1 = divmod(m1, 60) + remain_time_str = "还剩%02d小时%02d分钟%02d秒" % (h1, m1, s1) + travel_str = travel_str + f"{name} : {remain_time_str}\n" + send_mes = daily_im.format(time,resin_num,task_num,travel_num,max_travel_num,travel_str) + if row[1] != 0: + send_mes = "你的树脂快满了!" + send_mes + temp_list.append({"qid":row[2],"gid":row[3],"message":send_mes}) + return temp_list diff --git a/getDB.py b/getDB.py index 64e5180e..e2923422 100644 --- a/getDB.py +++ b/getDB.py @@ -17,14 +17,14 @@ mhyVersion = "2.11.1" FILE_PATH = os.path.abspath(os.path.join(os.getcwd(), "hoshino")) DATA_PATH = os.path.join(FILE_PATH,'config') -async def OpenPush(uid,qid,status): +async def OpenPush(uid,qid,status,mode): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - cursor = c.execute("SELECT * from NewCookies WHERE UID = ?",(uid,)) + cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?",(uid,)) c_data = cursor.fetchall() if len(c_data) != 0: try: - c.execute("UPDATE NewCookies SET StatusA = ?,QID = ? WHERE UID=?",(status,qid,uid)) + c.execute("UPDATE NewCookiesTable SET {s} = ?,QID = ? WHERE UID=?".format(s = mode),(status,qid,uid)) conn.commit() conn.close() return "成功!" @@ -37,21 +37,21 @@ async def CheckDB(): str = '' conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - cursor = c.execute("SELECT Cookies,UID from NewCookies") - for row in cursor: + cursor = c.execute("SELECT UID,Cookies from NewCookiesTable") + c_data = cursor.fetchall() + for row in c_data: try: - ltuid = re.search(r"ltuid=(\d*)", row[0]) - mysid_data = ltuid.group(0).split('=') + aid = re.search(r"account_id=(\d*)",row[1]) + mysid_data = aid.group(0).split('=') mysid = mysid_data[1] - - mys_data = await GetMysInfo(mysid,row[0]) + mys_data = await GetMysInfo(mysid,row[1]) mys_data = mys_data[0] uid = mys_data['data']['list'][0]['game_role_id'] - - str = str + f"uid{row[1]}/mysid{mysid}的Cookies是正常的!\n" + str = str + f"uid{row[0]}/mysid{mysid}的Cookies是正常的!\n" except: - str = str + f"uid{row[1]}/mysid{mysid}的Cookies是异常的!已删除该条Cookies!\n" - c.execute("DELETE from NewCookies where UID=?",(row[1],)) + str = str + f"uid{row[0]}的Cookies是异常的!已删除该条Cookies!\n" + c.execute("DELETE from NewCookiesTable where UID=?",(row[0],)) + c.execute("DELETE from CookiesCache where Cookies=?",(row[1],)) conn.commit() conn.close() return str @@ -66,26 +66,28 @@ async def TransDB(): conn.close() return "你没有需要迁移的数据库。" else: - c.execute('''CREATE TABLE IF NOT EXISTS NewCookies - (Cookies TEXT PRIMARY KEY NOT NULL, - UID INT, + c.execute('''CREATE TABLE IF NOT EXISTS NewCookiesTable + (UID INT PRIMARY KEY NOT NULL, + Cookies TEXT, + QID INT, StatusA TEXT, StatusB TEXT, - QID INT, + StatusC TEXT, NUM INT, Extra TEXT);''') cursor = c.execute("SELECT * from CookiesTable") c_data = cursor.fetchall() for row in c_data: try: - ltuid = re.search(r"ltuid=(\d*)", row[0]) - mysid_data = ltuid.group(0).split('=') + newcookies = ';'.join(filter(lambda x: x.split('=')[0] in ["cookie_token", "account_id"], [i.strip() for i in row[0].split(';')])) + aid = re.search(r"account_id=(\d*)", row[0]) + mysid_data = aid.group(0).split('=') mysid = mysid_data[1] mys_data = await GetMysInfo(mysid,row[0]) mys_data = mys_data[0] uid = mys_data['data']['list'][0]['game_role_id'] - c.execute("INSERT OR IGNORE INTO NewCookies (Cookies,UID,StatusA,StatusB,NUM) \ - VALUES (?, ?,?,?,?)",(row[0],uid,"off","off",140)) + c.execute("INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,NUM) \ + VALUES (?, ?,?,?,?,?)",(newcookies,uid,"off","off","off",140)) str = str + f"uid{uid}/mysid{mysid}的Cookies已转移成功!\n" except: str = str + f"uid{uid}/mysid{mysid}的Cookies是异常的!已删除该条Cookies!\n" @@ -160,15 +162,15 @@ async def cacheDB(uid,mode = 1,mys = None): c_data = cursor.fetchall() if len(c_data)==0: - cookiesrow = c.execute("SELECT * FROM NewCookies ORDER BY RANDOM() limit 1") + cookiesrow = c.execute("SELECT * FROM NewCookiesTable ORDER BY RANDOM() limit 1") for row2 in cookiesrow: if mode == 1: c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)",(row2[0],uid)) + VALUES (?, ?)",(row2[1],uid)) if mode == 2: c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)",(row2[0],uid)) - use = row2[0] + VALUES (?, ?)",(row2[1],uid)) + use = row2[1] else: use = c_data[0][2] if mys: @@ -181,33 +183,78 @@ async def cacheDB(uid,mode = 1,mys = None): conn.close() return use -async def cookiesDB(uid,Cookies): +async def cookiesDB(uid,Cookies,qid): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS NewCookies - (Cookies TEXT PRIMARY KEY NOT NULL, - UID INT, + c.execute('''CREATE TABLE IF NOT EXISTS NewCookiesTable + (UID INT PRIMARY KEY NOT NULL, + Cookies TEXT, + QID INT, StatusA TEXT, StatusB TEXT, - QID INT, + StatusC TEXT, NUM INT, Extra TEXT);''') - - c.execute("INSERT OR IGNORE INTO NewCookies (Cookies,UID,StatusA,StatusB,NUM) \ - VALUES (?, ?,?,?,?)",(Cookies,uid,"off","off",140)) + + cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?",(uid,)) + c_data = cursor.fetchall() + if len(c_data) == 0 : + c.execute("INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,NUM,QID) \ + VALUES (?, ?,?,?,?,?,?)",(Cookies,uid,"off","off","off",140,qid)) + else: + c.execute("UPDATE NewCookiesTable SET Cookies = ? WHERE UID=?",(Cookies,uid)) conn.commit() conn.close() +async def OpCookies(): + str = "" + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + test = c.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name = 'NewCookies'") + if test == 0: + conn.commit() + conn.close() + return "你没有需要优化的数据库。" + else: + c.execute('''CREATE TABLE IF NOT EXISTS NewCookiesTable + (UID INT PRIMARY KEY NOT NULL, + Cookies TEXT, + QID INT, + StatusA TEXT, + StatusB TEXT, + StatusC TEXT, + NUM INT, + Extra TEXT);''') + cursor = c.execute("SELECT * from NewCookies") + c_data = cursor.fetchall() + for row in c_data: + try: + newcookies = ';'.join(filter(lambda x: x.split('=')[0] in ["cookie_token", "account_id"], [i.strip() for i in row[0].split(';')])) + aid = re.search(r"account_id=(\d*)", row[0]) + mysid_data = aid.group(0).split('=') + mysid = mysid_data[1] + mys_data = await GetMysInfo(mysid,row[0]) + mys_data = mys_data[0] + uid = mys_data['data']['list'][0]['game_role_id'] + c.execute("INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,QID,NUM) \ + VALUES (?, ?,?,?,?,?,?)",(newcookies,row[1],row[2],row[3],"off",row[4],row[5])) + str = str + f"uid{row[1]}的Cookies已转移成功!\n" + except: + str = str + f"uid{row[1]}的Cookies是异常的!已删除该条Cookies!\n" + conn.commit() + conn.close() + return str + + async def OwnerCookies(uid): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - try: - cursor = c.execute("SELECT * FROM NewCookies WHERE UID = ?",(uid,)) + cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?",(uid,)) c_data = cursor.fetchall() - cookies = c_data[0][0] + cookies = c_data[0][1] except: return @@ -222,13 +269,24 @@ async def OwnerCookies(uid): - +def random_hex(length): + result = hex(random.randint(0,16**length)).replace('0x','').upper() + if len(result)