Spaces:
Runtime error
Runtime error
Commit
·
a9c6b76
1
Parent(s):
adbd325
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
|
3 |
+
import io
|
4 |
+
import datetime
|
5 |
+
from pytz import timezone
|
6 |
+
|
7 |
+
from login import catch_qr, get_uid_key
|
8 |
+
from nft import having_card_id_list, card_id_set_ava
|
9 |
+
|
10 |
+
sid_map = {
|
11 |
+
"SHN48荣耀时刻": 1,
|
12 |
+
"无": 2,
|
13 |
+
"无2": 3,
|
14 |
+
"胶囊计划": 4,
|
15 |
+
"天官赐福": 5,
|
16 |
+
"A - AKB48TSH四周年": 6,
|
17 |
+
"B - AKB48TSH四周年": 7,
|
18 |
+
"C - AKB48TSH四周年": 8,
|
19 |
+
"D - AKB48TSH四周年": 9,
|
20 |
+
"E - AKB48TSH四周年": 10,
|
21 |
+
"F - AKB48TSH四周年": 11,
|
22 |
+
"G - AKB48TSH四周年": 12,
|
23 |
+
"H - AKB48TSH四周年": 13,
|
24 |
+
"三体动画": 14
|
25 |
+
}
|
26 |
+
|
27 |
+
|
28 |
+
def qr(ava_image):
|
29 |
+
if ava_image:
|
30 |
+
qr_img, info = catch_qr(ava_image)
|
31 |
+
return {image_qr: qr_img, login_info: info}
|
32 |
+
return {image_qr: None, login_info: None}
|
33 |
+
|
34 |
+
|
35 |
+
def verify_login(info, u_verify, u_id, u_key, sid):
|
36 |
+
sid_num = sid_map[sid]
|
37 |
+
code = "请刷新页面并重新扫码登录"
|
38 |
+
if not u_verify:
|
39 |
+
result, u_id, u_key, code = get_uid_key(info)
|
40 |
+
if not result:
|
41 |
+
return False, "", "", sid_num, code
|
42 |
+
else:
|
43 |
+
u_verify = True
|
44 |
+
return u_verify, u_id, u_key, sid_num, code
|
45 |
+
|
46 |
+
|
47 |
+
def back_card_id_list(info, u_verify, u_id, u_key, sid):
|
48 |
+
if info:
|
49 |
+
u_verify, u_id, u_key, sid_num, code = verify_login(info, u_verify, u_id, u_key, sid)
|
50 |
+
if u_verify:
|
51 |
+
result, had_card_id_list, code = having_card_id_list(u_id, u_key, sid_num)
|
52 |
+
if result:
|
53 |
+
print("获取卡牌列表成功")
|
54 |
+
card_name_list = list(had_card_id_list.keys())
|
55 |
+
return {verify: u_verify, uid: u_id, key: u_key, card_id_list: had_card_id_list,
|
56 |
+
card_list_drop: gr.update(choices=card_name_list, value=card_name_list[0]), code_output: code}
|
57 |
+
else:
|
58 |
+
print("获取卡牌列表失败")
|
59 |
+
return {verify: u_verify, uid: u_id, key: u_key, card_list_drop: gr.update(choices=[]),
|
60 |
+
code_output: code}
|
61 |
+
else:
|
62 |
+
return {code_output: "请先上传头像和扫码登录"}
|
63 |
+
|
64 |
+
|
65 |
+
def name_get_card_id(card_id_list_dict, card_list_drop_name):
|
66 |
+
if card_id_list_dict and card_list_drop_name:
|
67 |
+
for card_name in card_id_list_dict.keys():
|
68 |
+
if card_name == card_list_drop_name:
|
69 |
+
cid = card_id_list_dict[card_name]
|
70 |
+
return {card_id: cid}
|
71 |
+
return {card_id: ""}
|
72 |
+
|
73 |
+
|
74 |
+
def login_up_nft(info, u_verify, u_id, u_key, sid, cid, ava_image):
|
75 |
+
if info and ava_image:
|
76 |
+
u_verify, u_id, u_key, sid_num, code = verify_login(info, u_verify, u_id, u_key, sid)
|
77 |
+
if u_verify:
|
78 |
+
if not cid:
|
79 |
+
result, had_card_id_list, code = having_card_id_list(u_id, u_key, sid_num)
|
80 |
+
if had_card_id_list:
|
81 |
+
cid = list(had_card_id_list.values())[0]
|
82 |
+
bytes_object = io.BytesIO()
|
83 |
+
ava_image.save(bytes_object, format='PNG')
|
84 |
+
img_data = bytes_object.getvalue()
|
85 |
+
result, code = card_id_set_ava(cid, u_key, img_data)
|
86 |
+
|
87 |
+
tz = timezone('Asia/Shanghai')
|
88 |
+
now = datetime.datetime.now(tz)
|
89 |
+
print("提交完成:", now)
|
90 |
+
|
91 |
+
return {verify: u_verify, uid: u_id, key: u_key, code_output: code}
|
92 |
+
else:
|
93 |
+
return {verify: u_verify, uid: u_id, key: u_key, code_output: code}
|
94 |
+
return "请先上传头像和扫码登录"
|
95 |
+
|
96 |
+
|
97 |
+
with gr.Blocks() as demo:
|
98 |
+
login_info = gr.State([])
|
99 |
+
card_id_list = gr.State({})
|
100 |
+
card_id = gr.State("")
|
101 |
+
verify = gr.State(False)
|
102 |
+
key = gr.State("")
|
103 |
+
uid = gr.State("")
|
104 |
+
with gr.Tab("bilibili NFT自定义头像"):
|
105 |
+
gr.Markdown("第一步:")
|
106 |
+
gr.Markdown("""获取一个最低R级的数字周边,很简单,多关注官方活动。""")
|
107 |
+
gr.Markdown("第二步:")
|
108 |
+
with gr.Row():
|
109 |
+
with gr.Column():
|
110 |
+
gr.Markdown(
|
111 |
+
"""成功领取后,下方上传新头像,头像尽量为正方形并长宽小于1024像素,右上角画笔按钮可裁剪,
|
112 |
+
然后等待生成二维码并扫码登录进行授权(左上传头像,右扫码登录))""")
|
113 |
+
image_ava = gr.Image(type="pil", label="上传头像")
|
114 |
+
image_qr = gr.Image(type="pil", label="客户端扫码登录")
|
115 |
+
gr.Markdown("第三步:")
|
116 |
+
with gr.Row():
|
117 |
+
gr.Markdown(
|
118 |
+
"""第二步完成后,选择拥有的卡组,并等待加载出所拥有的卡,再指定底卡,务必重新选择,否则无法工作
|
119 |
+
最后点击按钮<验证并提交头像>等待完成显示结果(成功可能需要时间审核)""")
|
120 |
+
with gr.Row():
|
121 |
+
sid_drop = gr.Dropdown(label="卡组", choices=list(sid_map.keys()), value="请点击重新选择")
|
122 |
+
card_list_drop = gr.Dropdown(label="指定已有底卡")
|
123 |
+
set_button = gr.Button("验证并提交头像")
|
124 |
+
code_output = gr.Textbox(label="消息输出", placeholder="点击提交按钮才会提交")
|
125 |
+
|
126 |
+
with gr.Accordion("警告"):
|
127 |
+
gr.Markdown("本服务基于bilibili未公开API制作,因此稳定性无法保证,敬请谅解。")
|
128 |
+
|
129 |
+
image_ava.change(qr, inputs=[image_ava], outputs=[image_qr, login_info])
|
130 |
+
sid_drop.change(back_card_id_list, inputs=[login_info, verify, uid, key, sid_drop],
|
131 |
+
outputs=[card_id_list, verify, uid, key, card_list_drop, code_output])
|
132 |
+
card_list_drop.change(name_get_card_id, inputs=[card_id_list, card_list_drop], outputs=[card_id])
|
133 |
+
set_button.click(login_up_nft, inputs=[login_info, verify, uid, key, sid_drop, card_id, image_ava],
|
134 |
+
outputs=[verify, uid, key, code_output])
|
135 |
+
|
136 |
+
demo.launch()
|