mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-06-03 05:59:51 +08:00
准备:当前状态图片版 & 自动米游币获取
This commit is contained in:
parent
287e861d06
commit
afb9a61be2
@ -319,6 +319,30 @@ async def cookies_db(uid, cookies, qid):
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
async def stoken_db(s_cookies,uid):
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
columns = [i[1] for i in c.execute('PRAGMA table_info(NewCookiesTable)')]
|
||||||
|
|
||||||
|
if "Stoken" not in columns:
|
||||||
|
c.execute('ALTER TABLE NewCookiesTable ADD COLUMN Stoken TEXT')
|
||||||
|
|
||||||
|
c.execute("UPDATE NewCookiesTable SET Stoken = ? WHERE UID=?", (s_cookies, int(uid)))
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
async def get_stoken(uid):
|
||||||
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
|
c = conn.cursor()
|
||||||
|
try:
|
||||||
|
cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?", (uid,))
|
||||||
|
c_data = cursor.fetchall()
|
||||||
|
stoken = c_data[0][8]
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
|
||||||
|
return stoken
|
||||||
|
|
||||||
async def owner_cookies(uid):
|
async def owner_cookies(uid):
|
||||||
conn = sqlite3.connect('ID_DATA.db')
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
@ -346,8 +370,11 @@ def md5(text):
|
|||||||
return md5_func.hexdigest()
|
return md5_func.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
def old_version_get_ds_token():
|
def old_version_get_ds_token(mysbbs = False):
|
||||||
n = "h8w582wxwgqvahcdkpvdhbh2w9casgfl"
|
if mysbbs:
|
||||||
|
n = "fd3ykrh7o1j54g581upo1tvpam0dsgtf"
|
||||||
|
else:
|
||||||
|
n = "h8w582wxwgqvahcdkpvdhbh2w9casgfl"
|
||||||
i = str(int(time.time()))
|
i = str(int(time.time()))
|
||||||
r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
|
r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6))
|
||||||
c = md5("salt=" + n + "&t=" + i + "&r=" + r)
|
c = md5("salt=" + n + "&t=" + i + "&r=" + r)
|
||||||
@ -365,6 +392,17 @@ def get_ds_token(q="", b=None):
|
|||||||
c = md5("salt=" + s + "&t=" + t + "&r=" + r + "&b=" + br + "&q=" + q)
|
c = md5("salt=" + s + "&t=" + t + "&r=" + r + "&b=" + br + "&q=" + q)
|
||||||
return t + "," + r + "," + c
|
return t + "," + r + "," + c
|
||||||
|
|
||||||
|
async def get_stoken_by_login_ticket(loginticket,mys_id):
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(
|
||||||
|
url="https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket",
|
||||||
|
params={
|
||||||
|
"login_ticket": loginticket,
|
||||||
|
"token_types": "3",
|
||||||
|
"uid": mys_id
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return req.json()
|
||||||
|
|
||||||
async def get_daily_data(uid, server_id="cn_gf01"):
|
async def get_daily_data(uid, server_id="cn_gf01"):
|
||||||
if uid[0] == '5':
|
if uid[0] == '5':
|
||||||
@ -387,7 +425,6 @@ async def get_daily_data(uid, server_id="cn_gf01"):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
data = json.loads(req.text)
|
data = json.loads(req.text)
|
||||||
# print(data)
|
|
||||||
return data
|
return data
|
||||||
except requests.exceptions.SSLError:
|
except requests.exceptions.SSLError:
|
||||||
try:
|
try:
|
||||||
|
@ -1300,6 +1300,200 @@ async def draw_pic(uid, nickname, image=None, mode=2, role_level=None):
|
|||||||
resultmes = imgmes
|
resultmes = imgmes
|
||||||
return resultmes
|
return resultmes
|
||||||
|
|
||||||
|
async def draw_info_pic(uid,image = None):
|
||||||
|
|
||||||
|
def seconds2hours(seconds: int) -> str:
|
||||||
|
m, s = divmod(int(seconds), 60)
|
||||||
|
h, m = divmod(m, 60)
|
||||||
|
return "%02d:%02d:%02d" % (h, m, s)
|
||||||
|
|
||||||
|
#获取数据
|
||||||
|
award_data = await get_award(uid)
|
||||||
|
daily_data = await get_daily_data(uid)
|
||||||
|
daily_data = daily_data["data"]
|
||||||
|
|
||||||
|
nickname = award_data['data']['nickname']
|
||||||
|
|
||||||
|
# 获取背景图片
|
||||||
|
bg2_path = os.path.join(BG_PATH, random.choice([x for x in os.listdir(BG_PATH)
|
||||||
|
if os.path.isfile(os.path.join(BG_PATH, x))]))
|
||||||
|
|
||||||
|
if image:
|
||||||
|
image_data = image.group(2)
|
||||||
|
edit_bg = Image.open(BytesIO(get(image_data).content))
|
||||||
|
else:
|
||||||
|
edit_bg = Image.open(bg2_path)
|
||||||
|
|
||||||
|
# 获取背景主色
|
||||||
|
q = edit_bg.quantize(colors=3, method=2)
|
||||||
|
bg_num_temp = 0
|
||||||
|
for i in range(0, 3):
|
||||||
|
bg = tuple(q.getpalette()[i * 3:(i * 3) + 3])
|
||||||
|
bg_num = bg[0] + bg[1] + bg[2]
|
||||||
|
if bg_num >= bg_num_temp:
|
||||||
|
bg_num_temp = bg_num
|
||||||
|
bg_color = (bg[0], bg[1], bg[2])
|
||||||
|
|
||||||
|
# 通过背景主色(bg_color)确定文字主色
|
||||||
|
r = 140
|
||||||
|
if max(bg_color) > 255 - r:
|
||||||
|
r *= -1
|
||||||
|
new_color = (math.floor(bg_color[0] + r if bg_color[0] + r <= 255 else 255),
|
||||||
|
math.floor(bg_color[1] + r if bg_color[1] + r <= 255 else 255),
|
||||||
|
math.floor(bg_color[2] + r if bg_color[2] + r <= 255 else 255))
|
||||||
|
|
||||||
|
# 确定texture2D路径
|
||||||
|
info1_path = os.path.join(TEXT_PATH, "info_1.png")
|
||||||
|
info2_path = os.path.join(TEXT_PATH, "info_2.png")
|
||||||
|
info3_path = os.path.join(TEXT_PATH, "info_3.png")
|
||||||
|
|
||||||
|
avatar_bg_path = os.path.join(TEXT_PATH, "avatar_bg.png")
|
||||||
|
avatar_fg_path = os.path.join(TEXT_PATH, "avatar_fg.png")
|
||||||
|
|
||||||
|
all_mask_path = os.path.join(TEXT_PATH, "All_Mask.png")
|
||||||
|
|
||||||
|
# 确定整体图片的长宽
|
||||||
|
based_w = 900
|
||||||
|
based_h = 1470
|
||||||
|
based_scale = '%.3f' % (based_w / based_h)
|
||||||
|
|
||||||
|
# 通过确定的长宽比,缩放背景图片
|
||||||
|
w, h = edit_bg.size
|
||||||
|
scale_f = '%.3f' % (w / h)
|
||||||
|
new_w = math.ceil(based_h * float(scale_f))
|
||||||
|
new_h = math.ceil(based_w / float(scale_f))
|
||||||
|
if scale_f > based_scale:
|
||||||
|
bg_img2 = edit_bg.resize((new_w, based_h), Image.ANTIALIAS)
|
||||||
|
else:
|
||||||
|
bg_img2 = edit_bg.resize((based_w, new_h), Image.ANTIALIAS)
|
||||||
|
bg_img = bg_img2.crop((0, 0, 900, based_h))
|
||||||
|
|
||||||
|
# 转换遮罩的颜色、大小匹配,并paste上去
|
||||||
|
all_mask = Image.open(all_mask_path).resize(bg_img.size, Image.ANTIALIAS)
|
||||||
|
all_mask_img = Image.new("RGBA", (based_w, based_h), bg_color)
|
||||||
|
bg_img.paste(all_mask_img, (0, 0), all_mask)
|
||||||
|
|
||||||
|
# 操作图片
|
||||||
|
info1 = Image.open(info1_path)
|
||||||
|
info2 = Image.open(info2_path)
|
||||||
|
info3 = Image.open(info3_path)
|
||||||
|
avatar_bg = Image.open(avatar_bg_path)
|
||||||
|
avatar_fg = Image.open(avatar_fg_path)
|
||||||
|
|
||||||
|
avatar_bg_color = Image.new("RGBA", (316, 100), bg_color)
|
||||||
|
bg_img.paste(avatar_bg_color, (113, 98), avatar_bg)
|
||||||
|
bg_img.paste(avatar_fg, (114, 95), avatar_fg)
|
||||||
|
|
||||||
|
info1_color = Image.new("RGBA", (900, 1300), bg_color)
|
||||||
|
bg_img.paste(info1_color, (0, 0), info1)
|
||||||
|
|
||||||
|
info2_color = Image.new("RGBA", (900, 1300), new_color)
|
||||||
|
bg_img.paste(info2_color, (0, 0), info2)
|
||||||
|
|
||||||
|
bg_img.paste(info3, (0, 0), info3)
|
||||||
|
|
||||||
|
|
||||||
|
text_draw = ImageDraw.Draw(bg_img)
|
||||||
|
|
||||||
|
#用户信息
|
||||||
|
text_draw.text((220, 137), f"{nickname}", new_color, genshin_font(32),anchor="lm")
|
||||||
|
text_draw.text((235, 170), 'UID ' + f"{uid}", new_color, genshin_font(14),anchor="lm")
|
||||||
|
|
||||||
|
#本日原石/摩拉
|
||||||
|
text_draw.text((715, 148), f"{award_data['data']['day_data']['current_primogems']}/{award_data['data']['day_data']['last_primogems']}", new_color, genshin_font(28),anchor="lm")
|
||||||
|
text_draw.text((715, 185), f"{award_data['data']['day_data']['current_mora']}/{award_data['data']['day_data']['last_mora']}", new_color, genshin_font(28),anchor="lm")
|
||||||
|
|
||||||
|
#本月原石/摩拉
|
||||||
|
text_draw.text((762, 287), f"{award_data['data']['month_data']['current_primogems']}", new_color, genshin_font(21),anchor="lm")
|
||||||
|
text_draw.text((762, 323), f"{award_data['data']['month_data']['current_mora']}", new_color, genshin_font(21),anchor="lm")
|
||||||
|
|
||||||
|
#上月原石/摩拉
|
||||||
|
text_draw.text((762, 359), f"{award_data['data']['month_data']['last_primogems']}", new_color, genshin_font(21),anchor="lm")
|
||||||
|
text_draw.text((762, 395), f"{award_data['data']['month_data']['last_mora']}", new_color, genshin_font(21),anchor="lm")
|
||||||
|
|
||||||
|
#收入比例
|
||||||
|
for index,i in enumerate(award_data['data']['month_data']['group_by']):
|
||||||
|
text_draw.text((721, 445 + index * 32), f"{str(i['num'])}({str(i['percent'])}%)", new_color, genshin_font(21),anchor="lm")
|
||||||
|
|
||||||
|
#基本四项
|
||||||
|
text_draw.text((415, 314), f"{daily_data['current_resin']}/{daily_data['max_resin']}", new_color, genshin_font(28),anchor="lm")
|
||||||
|
text_draw.text((415, 408), f'{daily_data["current_home_coin"]}/{daily_data["max_home_coin"]}', new_color, genshin_font(28),anchor="lm")
|
||||||
|
text_draw.text((415, 503), f"{daily_data['finished_task_num']}/{daily_data['total_task_num']}", new_color, genshin_font(28),anchor="lm")
|
||||||
|
text_draw.text((415, 597), f"{str(daily_data['resin_discount_num_limit'] - daily_data['remain_resin_discount_num'])}/{daily_data['resin_discount_num_limit']}", new_color, genshin_font(28),anchor="lm")
|
||||||
|
|
||||||
|
#树脂恢复时间计算
|
||||||
|
resin_recovery_time = seconds2hours(
|
||||||
|
daily_data['resin_recovery_time'])
|
||||||
|
next_resin_rec_time = seconds2hours(
|
||||||
|
8 * 60 - ((daily_data['max_resin'] - daily_data['current_resin']) * 8 * 60 - int(
|
||||||
|
daily_data['resin_recovery_time'])))
|
||||||
|
rec_time = f' ({next_resin_rec_time}/{resin_recovery_time})'
|
||||||
|
|
||||||
|
#洞天宝钱时间计算
|
||||||
|
coin_rec_time = seconds2hours(int(daily_data["home_coin_recovery_time"]))
|
||||||
|
coin_add_speed = math.ceil((daily_data["max_home_coin"] - daily_data["current_home_coin"]) / (
|
||||||
|
int(daily_data["home_coin_recovery_time"]) / 60 / 60))
|
||||||
|
coin = f'({coin_rec_time} 约{coin_add_speed}/h)'
|
||||||
|
|
||||||
|
if daily_data['is_extra_task_reward_received']:
|
||||||
|
daily_task_status = "「每日委托」奖励已领取"
|
||||||
|
else:
|
||||||
|
daily_task_status = "「每日委托」奖励未领取"
|
||||||
|
|
||||||
|
#详细信息
|
||||||
|
text_draw.text((190, 331), f"将于{rec_time}后全部恢复", new_color, genshin_font(18),anchor="lm")
|
||||||
|
text_draw.text((190, 425), f"预计{coin}后达到储存上限", new_color, genshin_font(18),anchor="lm")
|
||||||
|
text_draw.text((190, 518), f"{daily_task_status}", new_color, genshin_font(18),anchor="lm")
|
||||||
|
text_draw.text((190, 614), f"本周剩余消耗减半次数", new_color, genshin_font(18),anchor="lm")
|
||||||
|
|
||||||
|
#派遣图片准备
|
||||||
|
char_bg_path = os.path.join(TEXT_PATH, "char_bg.png")
|
||||||
|
|
||||||
|
char_bg = Image.open(char_bg_path)
|
||||||
|
|
||||||
|
char_color = (math.floor(bg_color[0] + 10 if bg_color[0] + r <= 255 else 255),
|
||||||
|
math.floor(bg_color[1] + 10 if bg_color[1] + r <= 255 else 255),
|
||||||
|
math.floor(bg_color[2] + 10 if bg_color[2] + r <= 255 else 255))
|
||||||
|
|
||||||
|
charset_mask = Image.new("RGBA", (900, 130), char_color)
|
||||||
|
|
||||||
|
#派遣
|
||||||
|
for index,i in enumerate(daily_data["expeditions"]):
|
||||||
|
if not os.path.exists(os.path.join(CHAR_IMG_PATH, f"UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][:-4]}@2x.png")):
|
||||||
|
get_char_img_pic(f"https://upload-bbs.mihoyo.com/game_record/genshin/character_image/UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][:-4]}@2x.png")
|
||||||
|
char_stand_img = os.path.join(CHAR_IMG_PATH, f"UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][:-4]}@2x.png")
|
||||||
|
char_stand = Image.open(char_stand_img)
|
||||||
|
char_stand_mask = Image.open(os.path.join(TEXT_PATH, "stand_mask.png"))
|
||||||
|
charpic = Image.new("RGBA", (900, 130))
|
||||||
|
|
||||||
|
charpic_temp = Image.new("RGBA", (900, 130))
|
||||||
|
charpic_temp.paste(char_stand, (395, -99), char_stand_mask)
|
||||||
|
char_icon = Image.open(BytesIO(get(i['avatar_side_icon']).content))
|
||||||
|
|
||||||
|
char_icon_scale = char_icon.resize((140,140),Image.ANTIALIAS)
|
||||||
|
charpic.paste(charset_mask, (0, 0), char_bg)
|
||||||
|
charpic.paste(char_icon_scale, (63, -26), char_icon_scale)
|
||||||
|
charpic.paste(charpic_temp, (0, 0), charpic_temp)
|
||||||
|
|
||||||
|
charpic_draw = ImageDraw.Draw(charpic)
|
||||||
|
|
||||||
|
if i['status'] == 'Finished':
|
||||||
|
charpic_draw.text((200, 65), f"探索完成", new_color, genshin_font(24),anchor="lm")
|
||||||
|
else:
|
||||||
|
remained_timed: str = seconds2hours(i['remained_time'])
|
||||||
|
charpic_draw.text((200, 65), f"剩余时间 {remained_timed}", new_color, genshin_font(24),anchor="lm")
|
||||||
|
|
||||||
|
bg_img.paste(charpic, (0,748 + 133*index), charpic)
|
||||||
|
|
||||||
|
end_pic = Image.open(os.path.join(TEXT_PATH,"abyss_3.png"))
|
||||||
|
bg_img.paste(end_pic,(0,1430),end_pic)
|
||||||
|
|
||||||
|
bg_img = bg_img.convert('RGB')
|
||||||
|
result_buffer = BytesIO()
|
||||||
|
bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90)
|
||||||
|
imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode()
|
||||||
|
resultmes = imgmes
|
||||||
|
return resultmes
|
||||||
|
|
||||||
def create_rounded_rectangle_mask(rectangle, radius):
|
def create_rounded_rectangle_mask(rectangle, radius):
|
||||||
solid_fill = (50, 50, 50, 255)
|
solid_fill = (50, 50, 50, 255)
|
||||||
|
239
mihoyo_libs/get_mihoyo_bbs_coin.py
Normal file
239
mihoyo_libs/get_mihoyo_bbs_coin.py
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
import time
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
|
||||||
|
from httpx import AsyncClient
|
||||||
|
|
||||||
|
from .get_data import old_version_get_ds_token,random_hex
|
||||||
|
|
||||||
|
Today_getcoins = 0
|
||||||
|
Today_have_getcoins = 0 # 这个变量以后可能会用上,先留着了
|
||||||
|
Have_coins = 0
|
||||||
|
|
||||||
|
|
||||||
|
# 米游社的API列表
|
||||||
|
bbs_Cookieurl = "https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}"
|
||||||
|
bbs_Cookieurl2 = "https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket?login_ticket={}&token_types=3&uid={}"
|
||||||
|
bbs_Taskslist = "https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState" # 获取任务列表
|
||||||
|
bbs_Signurl = "https://bbs-api.mihoyo.com/apihub/sapi/signIn?gids={}" # post
|
||||||
|
bbs_Listurl = "https://bbs-api.mihoyo.com/post/api/getForumPostList?forum_id={}&is_good=false&is_hot=false&page_size=20&sort_type=1"
|
||||||
|
bbs_Detailurl = "https://bbs-api.mihoyo.com/post/api/getPostFull?post_id={}"
|
||||||
|
bbs_Shareurl = "https://bbs-api.mihoyo.com/apihub/api/getShareConf?entity_id={}&entity_type=1"
|
||||||
|
bbs_Likeurl = "https://bbs-api.mihoyo.com/apihub/sapi/upvotePost" # post json
|
||||||
|
|
||||||
|
mihoyobbs_List = [{
|
||||||
|
"id": "1",
|
||||||
|
"forumId": "1",
|
||||||
|
"name": "崩坏3",
|
||||||
|
"url": "https://bbs.mihoyo.com/bh3/"
|
||||||
|
}, {
|
||||||
|
"id": "2",
|
||||||
|
"forumId": "26",
|
||||||
|
"name": "原神",
|
||||||
|
"url": "https://bbs.mihoyo.com/ys/"
|
||||||
|
}, {
|
||||||
|
"id": "3",
|
||||||
|
"forumId": "30",
|
||||||
|
"name": "崩坏2",
|
||||||
|
"url": "https://bbs.mihoyo.com/bh2/"
|
||||||
|
}, {
|
||||||
|
"id": "4",
|
||||||
|
"forumId": "37",
|
||||||
|
"name": "未定事件簿",
|
||||||
|
"url": "https://bbs.mihoyo.com/wd/"
|
||||||
|
}, {
|
||||||
|
"id": "5",
|
||||||
|
"forumId": "34",
|
||||||
|
"name": "大别野",
|
||||||
|
"url": "https://bbs.mihoyo.com/dby/"
|
||||||
|
}, {
|
||||||
|
"id": "6",
|
||||||
|
"forumId": "52",
|
||||||
|
"name": "崩坏:星穹铁道",
|
||||||
|
"url": "https://bbs.mihoyo.com/sr/"
|
||||||
|
}]
|
||||||
|
|
||||||
|
def random_text(num: int) -> str:
|
||||||
|
return ''.join(random.sample(string.ascii_lowercase + string.digits, num))
|
||||||
|
|
||||||
|
class mihoyobbs_coin:
|
||||||
|
def __init__(self,cookies):
|
||||||
|
self.headers = {
|
||||||
|
"DS": old_version_get_ds_token(True),
|
||||||
|
"cookie": cookies,
|
||||||
|
"x-rpc-client_type": "2",
|
||||||
|
"x-rpc-app_version": "2.7.0",
|
||||||
|
"x-rpc-sys_version": "6.0.1",
|
||||||
|
"x-rpc-channel": "mihoyo",
|
||||||
|
"x-rpc-device_id": random_hex(32),
|
||||||
|
"x-rpc-device_name": random_text(random.randint(1, 10)),
|
||||||
|
"x-rpc-device_model": "Mi 10",
|
||||||
|
"Referer": "https://app.mihoyo.com",
|
||||||
|
"Host": "bbs-api.mihoyo.com",
|
||||||
|
"User-Agent": "okhttp/4.8.0"
|
||||||
|
}
|
||||||
|
self.Task_do = {
|
||||||
|
"bbs_Sign": False,
|
||||||
|
"bbs_Read_posts": False,
|
||||||
|
"bbs_Read_posts_num": 3,
|
||||||
|
"bbs_Like_posts": False,
|
||||||
|
"bbs_Like_posts_num": 5,
|
||||||
|
"bbs_Share": False
|
||||||
|
}
|
||||||
|
self.mihoyobbs_List_Use = []
|
||||||
|
|
||||||
|
async def task_run(self):
|
||||||
|
await self.Load_Mihoyobbs_List_Use()
|
||||||
|
start = await self.Get_taskslist()
|
||||||
|
self.postsList = await self.get_list()
|
||||||
|
sign = await self.signing()
|
||||||
|
read = await self.read_posts()
|
||||||
|
like = await self.Likeposts()
|
||||||
|
share = await self.share_post()
|
||||||
|
im = start + "\n" + sign + "\n" + read + "\n" + like + "\n" + share
|
||||||
|
return im
|
||||||
|
|
||||||
|
async def Load_Mihoyobbs_List_Use(self):
|
||||||
|
for i in [2,5]:
|
||||||
|
for k in mihoyobbs_List:
|
||||||
|
if i == int(k["id"]):
|
||||||
|
self.mihoyobbs_List_Use.append(k)
|
||||||
|
|
||||||
|
# 获取任务列表,用来判断做了哪些任务
|
||||||
|
async def Get_taskslist(self):
|
||||||
|
global Today_getcoins
|
||||||
|
global Today_have_getcoins
|
||||||
|
global Have_coins
|
||||||
|
#log.info("正在获取任务列表")
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(url = bbs_Taskslist, headers = self.headers)
|
||||||
|
data = req.json()
|
||||||
|
if "err" in data["message"] or data["retcode"] == -100:
|
||||||
|
return "你的Cookies已失效。"
|
||||||
|
#log.error("获取任务列表失败,你的cookie可能已过期,请重新设置cookie。")
|
||||||
|
else:
|
||||||
|
Today_getcoins = data["data"]["can_get_points"]
|
||||||
|
Today_have_getcoins = data["data"]["already_received_points"]
|
||||||
|
Have_coins = data["data"]["total_points"]
|
||||||
|
# 如果当日可获取米游币数量为0直接判断全部任务都完成了
|
||||||
|
if Today_getcoins == 0:
|
||||||
|
self.Task_do["bbs_Sign"] = True
|
||||||
|
self.Task_do["bbs_Read_posts"] = True
|
||||||
|
self.Task_do["bbs_Like_posts"] = True
|
||||||
|
self.Task_do["bbs_Share"] = True
|
||||||
|
else:
|
||||||
|
# 如果第0个大于或等于62则直接判定任务没做
|
||||||
|
if data["data"]["states"][0]["mission_id"] >= 62:
|
||||||
|
#log.info(f"新的一天,今天可以获得{Today_getcoins}个米游币")
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
#log.info(f"似乎还有任务没完成,今天还能获得{Today_getcoins}")
|
||||||
|
for i in data["data"]["states"]:
|
||||||
|
# 58是讨论区签到
|
||||||
|
if i["mission_id"] == 58:
|
||||||
|
if i["is_get_award"]:
|
||||||
|
self.Task_do["bbs_Sign"] = True
|
||||||
|
# 59是看帖子
|
||||||
|
elif i["mission_id"] == 59:
|
||||||
|
if i["is_get_award"]:
|
||||||
|
self.Task_do["bbs_Read_posts"] = True
|
||||||
|
else:
|
||||||
|
self.Task_do["bbs_Read_posts_num"] -= i["happened_times"]
|
||||||
|
# 60是给帖子点赞
|
||||||
|
elif i["mission_id"] == 60:
|
||||||
|
if i["is_get_award"]:
|
||||||
|
self.Task_do["bbs_Like_posts"] = True
|
||||||
|
else:
|
||||||
|
self.Task_do["bbs_Like_posts_num"] -= i["happened_times"]
|
||||||
|
# 61是分享帖子
|
||||||
|
elif i["mission_id"] == 61:
|
||||||
|
if i["is_get_award"]:
|
||||||
|
self.Task_do["bbs_Share"] = True
|
||||||
|
# 分享帖子,是最后一个任务,到这里了下面都是一次性任务,直接跳出循环
|
||||||
|
break
|
||||||
|
return "开始执行~"
|
||||||
|
|
||||||
|
# 获取要帖子列表
|
||||||
|
async def get_list(self) -> list:
|
||||||
|
temp_list = []
|
||||||
|
print("正在获取帖子列表......")
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(url=bbs_Listurl.format(self.mihoyobbs_List_Use[0]["forumId"]), headers=self.headers)
|
||||||
|
data = req.json()
|
||||||
|
for n in range(5):
|
||||||
|
temp_list.append([data["data"]["list"][n]["post"]["post_id"], data["data"]["list"][n]["post"]["subject"]])
|
||||||
|
#log.info("已获取{}个帖子".format(len(temp_list)))
|
||||||
|
return temp_list
|
||||||
|
|
||||||
|
# 进行签到操作
|
||||||
|
async def signing(self):
|
||||||
|
if self.Task_do["bbs_Sign"]:
|
||||||
|
return "讨论区任务已经完成过了~"
|
||||||
|
else:
|
||||||
|
num_ok = 0
|
||||||
|
for i in self.mihoyobbs_List_Use:
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.post(url=bbs_Signurl.format(i["id"]), data={}, headers=self.headers)
|
||||||
|
data = req.json()
|
||||||
|
if "err" not in data["message"]:
|
||||||
|
num_ok += 1
|
||||||
|
time.sleep(random.randint(2, 8))
|
||||||
|
else:
|
||||||
|
return "你的Cookies已失效。"
|
||||||
|
return "已完成签到任务~"
|
||||||
|
|
||||||
|
|
||||||
|
# 看帖子
|
||||||
|
async def read_posts(self):
|
||||||
|
if self.Task_do["bbs_Read_posts"]:
|
||||||
|
return "看帖任务已经完成过了~"
|
||||||
|
else:
|
||||||
|
num_ok = 0
|
||||||
|
for i in range(self.Task_do["bbs_Read_posts_num"]):
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(url=bbs_Detailurl.format(self.postsList[i][0]), headers=self.headers)
|
||||||
|
data = req.json()
|
||||||
|
if data["message"] == "OK":
|
||||||
|
num_ok += 1
|
||||||
|
time.sleep(random.randint(2, 8))
|
||||||
|
return "已完成看帖任务~共计成功{}次~".foramt(num_ok)
|
||||||
|
# 点赞
|
||||||
|
async def Likeposts(self):
|
||||||
|
if self.Task_do["bbs_Like_posts"]:
|
||||||
|
return "点赞任务已经完成过了~"
|
||||||
|
else:
|
||||||
|
num_ok = 0
|
||||||
|
num_cancel = 0
|
||||||
|
for i in range(self.Task_do["bbs_Like_posts_num"]):
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.post(url=bbs_Likeurl, headers=self.headers,
|
||||||
|
json={"post_id": self.postsList[i][0], "is_cancel": False})
|
||||||
|
data = req.json()
|
||||||
|
if data["message"] == "OK":
|
||||||
|
num_ok += 1
|
||||||
|
# 判断取消点赞是否打开
|
||||||
|
if True:
|
||||||
|
time.sleep(random.randint(2, 8))
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.post(url=bbs_Likeurl, headers=self.headers,
|
||||||
|
json={"post_id": self.postsList[i][0], "is_cancel": True})
|
||||||
|
data = req.json()
|
||||||
|
if data["message"] == "OK":
|
||||||
|
num_cancel += 1
|
||||||
|
time.sleep(random.randint(2, 8))
|
||||||
|
return "已完成点赞任务~共计点赞{}次,取消点赞{}次~".foramt(num_ok,num_cancel)
|
||||||
|
# 分享操作
|
||||||
|
|
||||||
|
async def share_post(self):
|
||||||
|
if self.Task_do["bbs_Share"]:
|
||||||
|
return "分享任务已经完成过了~"
|
||||||
|
else:
|
||||||
|
for _ in range(3):
|
||||||
|
async with AsyncClient() as client:
|
||||||
|
req = await client.get(url=bbs_Shareurl.format(self.postsList[0][0]), headers=self.headers)
|
||||||
|
data = req.json()
|
||||||
|
if data["message"] == "OK":
|
||||||
|
return "已完成分享任务~获得10米游币~"
|
||||||
|
else:
|
||||||
|
time.sleep(random.randint(2, 8))
|
||||||
|
time.sleep(random.randint(2, 8))
|
@ -1,6 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
import sqlite3
|
import sqlite3
|
||||||
@ -10,7 +11,10 @@ from io import BytesIO
|
|||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||||
from .get_data import *
|
from .get_data import *
|
||||||
|
from .get_image import draw_event_pic
|
||||||
|
import get_mihoyo_bbs_coin as coin
|
||||||
|
|
||||||
FILE_PATH = os.path.dirname(__file__)
|
FILE_PATH = os.path.dirname(__file__)
|
||||||
FILE2_PATH = os.path.join(FILE_PATH, 'mihoyo_bbs')
|
FILE2_PATH = os.path.join(FILE_PATH, 'mihoyo_bbs')
|
||||||
@ -235,30 +239,43 @@ async def char_adv(name):
|
|||||||
return im
|
return im
|
||||||
|
|
||||||
async def deal_ck(mes, qid):
|
async def deal_ck(mes, qid):
|
||||||
aid = re.search(r"account_id=(\d*)", mes)
|
if "stoken" in mes:
|
||||||
mysid_data = aid.group(0).split('=')
|
login_ticket = re.search(r"login_ticket=([0-9a-zA-Z]+)", mes).group(0).split('=')[1]
|
||||||
mysid = mysid_data[1]
|
uid = await select_db(qid,"uid")
|
||||||
cookie = ';'.join(filter(lambda x: x.split('=')[0] in [
|
#mys_id = re.search(r"login_uid=([0-9]+)", mes).group(0).split('=')[1]
|
||||||
"cookie_token", "account_id"], [i.strip() for i in mes.split(';')]))
|
ck = await owner_cookies(uid[0])
|
||||||
mys_data = await get_mihoyo_bbs_info(mysid, cookie)
|
mys_id = re.search(r"account_id=(\d*)", ck).group(0).split('=')[1]
|
||||||
for i in mys_data['data']['list']:
|
raw_data = await get_stoken_by_login_ticket(login_ticket,mys_id)
|
||||||
if i['game_id'] != 2:
|
stoken = raw_data["data"]["list"][0]["token"]
|
||||||
mys_data['data']['list'].remove(i)
|
s_cookies = "stuid={};stoken={}".format(mys_id,stoken)
|
||||||
uid = mys_data['data']['list'][0]['game_role_id']
|
await stoken_db(s_cookies,uid[0])
|
||||||
|
return "添加Stoken成功!"
|
||||||
|
else:
|
||||||
|
aid = re.search(r"account_id=(\d*)", mes)
|
||||||
|
mysid_data = aid.group(0).split('=')
|
||||||
|
mysid = mysid_data[1]
|
||||||
|
cookie = ';'.join(filter(lambda x: x.split('=')[0] in [
|
||||||
|
"cookie_token", "account_id"], [i.strip() for i in mes.split(';')]))
|
||||||
|
mys_data = await get_mihoyo_bbs_info(mysid, cookie)
|
||||||
|
for i in mys_data['data']['list']:
|
||||||
|
if i['game_id'] != 2:
|
||||||
|
mys_data['data']['list'].remove(i)
|
||||||
|
uid = mys_data['data']['list'][0]['game_role_id']
|
||||||
|
|
||||||
conn = sqlite3.connect('ID_DATA.db')
|
conn = sqlite3.connect('ID_DATA.db')
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
c.execute("DELETE from CookiesCache where uid=? or mysid = ?", (uid, mysid))
|
c.execute("DELETE from CookiesCache where uid=? or mysid = ?", (uid, mysid))
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
await cookies_db(uid, cookie, qid)
|
|
||||||
|
|
||||||
|
await cookies_db(uid, cookie, qid)
|
||||||
|
return f'添加Cookies成功!\nCookies属于个人重要信息,如果你是在不知情的情况下添加,请马上修改米游社账户密码,保护个人隐私!\n————\n' \
|
||||||
|
f'如果需要【开启自动签到】和【开启推送】还需要使用命令“绑定uid”绑定你的uid。\n例如:绑定uid123456789。'
|
||||||
|
|
||||||
async def award(uid):
|
async def award(uid):
|
||||||
data = await get_award(uid)
|
data = await get_award(uid)
|
||||||
@ -483,6 +500,29 @@ async def daily(mode="push", uid=None):
|
|||||||
{"qid": row[2], "gid": row[3], "message": send_mes})
|
{"qid": row[2], "gid": row[3], "message": send_mes})
|
||||||
return temp_list
|
return temp_list
|
||||||
|
|
||||||
|
async def mihoyo_coin(qid):
|
||||||
|
uid = await select_db(qid, mode="uid")
|
||||||
|
uid = uid[0]
|
||||||
|
s_cookies = await get_stoken(uid)
|
||||||
|
if s_cookies:
|
||||||
|
get_coin = coin.mihoyobbs_coin(s_cookies)
|
||||||
|
im = await get_coin.task_run()
|
||||||
|
else:
|
||||||
|
im = "你还没有绑定Stoken~"
|
||||||
|
return im
|
||||||
|
|
||||||
|
async def get_event_pic():
|
||||||
|
img_path = os.path.join(FILE2_PATH, "event.jpg")
|
||||||
|
while True:
|
||||||
|
if os.path.exists(img_path):
|
||||||
|
f = open(img_path, 'rb')
|
||||||
|
ls_f = b64encode(f.read()).decode()
|
||||||
|
img_mes = 'base64://' + ls_f
|
||||||
|
f.close()
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
await draw_event_pic()
|
||||||
|
return img_mes
|
||||||
|
|
||||||
async def weapon_wiki(name, level=None):
|
async def weapon_wiki(name, level=None):
|
||||||
data = await get_weapon_info(name)
|
data = await get_weapon_info(name)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 6.7 KiB |
BIN
mihoyo_libs/mihoyo_bbs/texture2d/info_1.png
Normal file
BIN
mihoyo_libs/mihoyo_bbs/texture2d/info_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
mihoyo_libs/mihoyo_bbs/texture2d/info_2.png
Normal file
BIN
mihoyo_libs/mihoyo_bbs/texture2d/info_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
BIN
mihoyo_libs/mihoyo_bbs/texture2d/info_3.png
Normal file
BIN
mihoyo_libs/mihoyo_bbs/texture2d/info_3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
Loading…
x
Reference in New Issue
Block a user