Spaces:
Running
Running
1.9
Browse files- README.md +2 -2
- __pycache__/login.cpython-310.pyc +0 -0
- __pycache__/nft.cpython-310.pyc +0 -0
- app.py +78 -17
- bili.json +0 -0
- nft.py +36 -38
- requirements.txt +1 -1
README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
---
|
2 |
title: NFT Avatar
|
3 |
-
emoji:
|
4 |
colorFrom: indigo
|
5 |
colorTo: yellow
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 3.16.
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
license: cc-by-3.0
|
|
|
1 |
---
|
2 |
title: NFT Avatar
|
3 |
+
emoji: 💎
|
4 |
colorFrom: indigo
|
5 |
colorTo: yellow
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 3.16.1b1
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
license: cc-by-3.0
|
__pycache__/login.cpython-310.pyc
ADDED
Binary file (2.07 kB). View file
|
|
__pycache__/nft.cpython-310.pyc
ADDED
Binary file (4.63 kB). View file
|
|
app.py
CHANGED
@@ -1,9 +1,11 @@
|
|
1 |
-
import io
|
2 |
-
|
3 |
import gradio as gr
|
4 |
|
|
|
|
|
|
|
|
|
5 |
from login import catch_qr, get_uid_key
|
6 |
-
from nft import
|
7 |
|
8 |
sid_map = {
|
9 |
"SHN48荣耀时刻": 1,
|
@@ -24,29 +26,81 @@ sid_map = {
|
|
24 |
|
25 |
|
26 |
def qr(ava_image):
|
27 |
-
if ava_image
|
28 |
qr_img, info = catch_qr(ava_image)
|
29 |
return {image_qr: qr_img, login_info: info}
|
30 |
return {image_qr: None, login_info: None}
|
31 |
|
32 |
|
33 |
-
def
|
34 |
-
|
35 |
-
|
36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
bytes_object = io.BytesIO()
|
38 |
ava_image.save(bytes_object, format='PNG')
|
39 |
img_data = bytes_object.getvalue()
|
40 |
-
|
41 |
-
|
42 |
-
|
|
|
|
|
|
|
|
|
43 |
else:
|
44 |
-
return code
|
45 |
return "请先上传头像和扫码登录"
|
46 |
|
47 |
|
48 |
with gr.Blocks() as demo:
|
49 |
login_info = gr.State([])
|
|
|
|
|
|
|
|
|
|
|
50 |
with gr.Tab("bili_NFT自定义头像"):
|
51 |
gr.Markdown("30秒自定义钻石头像(NFT),一站式操作仅三步,无需下载安装,代码开源免费,拿我项目收费的都是骗子")
|
52 |
gr.Markdown("""
|
@@ -62,17 +116,20 @@ with gr.Blocks() as demo:
|
|
62 |
with gr.Row():
|
63 |
with gr.Column():
|
64 |
gr.Markdown(
|
65 |
-
"
|
|
|
66 |
image_ava = gr.Image(type="pil", label="上传头像")
|
67 |
image_qr = gr.Image(type="pil", label="b站客户端扫码登录")
|
68 |
gr.Markdown("第三步:")
|
69 |
with gr.Row():
|
70 |
gr.Markdown(
|
71 |
-
"""
|
|
|
72 |
with gr.Row():
|
73 |
sid_drop = gr.Dropdown(label="卡组", choices=list(sid_map.keys()), value="三体动画")
|
74 |
-
|
75 |
-
|
|
|
76 |
|
77 |
with gr.Accordion("代码引用及郑重提醒"):
|
78 |
gr.Markdown("https://github.com/wdvipa/custom_bilibili_nft")
|
@@ -81,6 +138,10 @@ with gr.Blocks() as demo:
|
|
81 |
gr.Markdown("本软件纯属娱乐,不得用于其他用途,秋后算账别怨我!")
|
82 |
|
83 |
image_ava.change(qr, inputs=[image_ava], outputs=[image_qr, login_info])
|
84 |
-
|
|
|
|
|
|
|
|
|
85 |
|
86 |
demo.launch()
|
|
|
|
|
|
|
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,
|
|
|
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("bili_NFT自定义头像"):
|
105 |
gr.Markdown("30秒自定义钻石头像(NFT),一站式操作仅三步,无需下载安装,代码开源免费,拿我项目收费的都是骗子")
|
106 |
gr.Markdown("""
|
|
|
116 |
with gr.Row():
|
117 |
with gr.Column():
|
118 |
gr.Markdown(
|
119 |
+
"""确保第一步领取三体数字藏品后,上传新头像,头像尽量为正方形并长宽小于1024像素,右上角画笔按钮可裁剪,
|
120 |
+
然后等待生成二维码并扫码登录进行授权(左上传头像,右扫码登录))""")
|
121 |
image_ava = gr.Image(type="pil", label="上传头像")
|
122 |
image_qr = gr.Image(type="pil", label="b站客户端扫码登录")
|
123 |
gr.Markdown("第三步:")
|
124 |
with gr.Row():
|
125 |
gr.Markdown(
|
126 |
+
"""第二步完成后,选择拥有的卡组,并等待加载出所拥有的卡,再指定底卡,不选默认随机三体卡,
|
127 |
+
最后���击按钮<验证并提交头像>等待完成显示结果(成功可能需要时间审核)""")
|
128 |
with gr.Row():
|
129 |
sid_drop = gr.Dropdown(label="卡组", choices=list(sid_map.keys()), value="三体动画")
|
130 |
+
card_list_drop = gr.Dropdown(label="指定已有底卡")
|
131 |
+
set_button = gr.Button("验证并提交头像")
|
132 |
+
code_output = gr.Textbox(label="提交结果", placeholder="请先点击提交按钮")
|
133 |
|
134 |
with gr.Accordion("代码引用及郑重提醒"):
|
135 |
gr.Markdown("https://github.com/wdvipa/custom_bilibili_nft")
|
|
|
138 |
gr.Markdown("本软件纯属娱乐,不得用于其他用途,秋后算账别怨我!")
|
139 |
|
140 |
image_ava.change(qr, inputs=[image_ava], outputs=[image_qr, login_info])
|
141 |
+
sid_drop.change(back_card_id_list, inputs=[login_info, verify, uid, key, sid_drop],
|
142 |
+
outputs=[card_id_list, verify, uid, key, card_list_drop, code_output])
|
143 |
+
card_list_drop.change(name_get_card_id, inputs=[card_id_list, card_list_drop], outputs=[card_id])
|
144 |
+
set_button.click(login_up_nft, inputs=[login_info, verify, uid, key, sid_drop, card_id, image_ava],
|
145 |
+
outputs=[verify, uid, key, code_output])
|
146 |
|
147 |
demo.launch()
|
bili.json
DELETED
The diff for this file is too large to render.
See raw diff
|
|
nft.py
CHANGED
@@ -1,6 +1,4 @@
|
|
1 |
import time
|
2 |
-
import json
|
3 |
-
from pathlib import Path
|
4 |
import requests
|
5 |
from hashlib import md5
|
6 |
from typing import Union
|
@@ -8,8 +6,6 @@ from urllib.parse import urlencode
|
|
8 |
from requests_toolbelt.multipart.encoder import MultipartEncoder
|
9 |
import imghdr
|
10 |
|
11 |
-
CARD_INFO_PATH = Path(__file__).parent / "bili.json" # 不要动
|
12 |
-
|
13 |
|
14 |
class Crypto:
|
15 |
APPKEY = '4409e2ce8ffd12b8'
|
@@ -51,7 +47,7 @@ def get_image_type(file_path):
|
|
51 |
return imghdr.what(None, data)
|
52 |
|
53 |
|
54 |
-
def
|
55 |
url = "https://api.bilibili.com/x/vas/nftcard/cardlist"
|
56 |
params = SingableDict(
|
57 |
{
|
@@ -70,27 +66,29 @@ def get_one_card_id(UID, ACCESS_KEY, sid):
|
|
70 |
print(f"获取卡片信息出错,下面是 api 返回:\n{data}")
|
71 |
return
|
72 |
# print(data) # 查询已添加无需再填
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
|
|
|
|
94 |
|
95 |
|
96 |
def set_face(card_id, ACCESS_KEY, img_data):
|
@@ -125,18 +123,18 @@ def set_face(card_id, ACCESS_KEY, img_data):
|
|
125 |
return True, '设置头像成功, 请等待审核'
|
126 |
|
127 |
|
128 |
-
def
|
129 |
-
|
130 |
access_key = str(key)
|
131 |
sid = str(sid)
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
return result, code
|
|
|
1 |
import time
|
|
|
|
|
2 |
import requests
|
3 |
from hashlib import md5
|
4 |
from typing import Union
|
|
|
6 |
from requests_toolbelt.multipart.encoder import MultipartEncoder
|
7 |
import imghdr
|
8 |
|
|
|
|
|
9 |
|
10 |
class Crypto:
|
11 |
APPKEY = '4409e2ce8ffd12b8'
|
|
|
47 |
return imghdr.what(None, data)
|
48 |
|
49 |
|
50 |
+
def get_have_card_id_list(UID, ACCESS_KEY, sid):
|
51 |
url = "https://api.bilibili.com/x/vas/nftcard/cardlist"
|
52 |
params = SingableDict(
|
53 |
{
|
|
|
66 |
print(f"获取卡片信息出错,下面是 api 返回:\n{data}")
|
67 |
return
|
68 |
# print(data) # 查询已添加无需再填
|
69 |
+
have_card_id_list = {}
|
70 |
+
try:
|
71 |
+
for round in data['data']['round_list']:
|
72 |
+
for card in round['card_list']:
|
73 |
+
if card['card_id_list']:
|
74 |
+
print(f"找到付费卡 card_id: {card['card_id_list'][0]['card_id']}\n这个id属于{card['card_name']}")
|
75 |
+
have_card_id_list.update({card['card_name']: card['card_id_list'][0]['card_id']})
|
76 |
+
if data["data"]["pre_list"]:
|
77 |
+
for i in data["data"]["pre_list"]:
|
78 |
+
if card_id_list := i.get("card_id_list"):
|
79 |
+
for j in card_id_list:
|
80 |
+
if card_id := j.get("card_id"):
|
81 |
+
print(f"找到预约卡card_id: {card_id}\n这个 id 属于{i.get('card_name')}")
|
82 |
+
have_card_id_list.update({i.get('card_name'): card_id})
|
83 |
+
except Exception as e:
|
84 |
+
print(f"处理卡牌列表出错{e.args[0]},下面是 api 返回:\n{data}")
|
85 |
+
return {}
|
86 |
+
if have_card_id_list:
|
87 |
+
print(f"已经找到卡片")
|
88 |
+
return have_card_id_list
|
89 |
+
else:
|
90 |
+
print("没有找到可用的卡片")
|
91 |
+
return {}
|
92 |
|
93 |
|
94 |
def set_face(card_id, ACCESS_KEY, img_data):
|
|
|
123 |
return True, '设置头像成功, 请等待审核'
|
124 |
|
125 |
|
126 |
+
def having_card_id_list(uid, key, sid):
|
127 |
+
uid = int(uid)
|
128 |
access_key = str(key)
|
129 |
sid = str(sid)
|
130 |
+
|
131 |
+
had_card_id_list = get_have_card_id_list(uid, access_key, sid) # 根据你所取得的卡card_id进行更改
|
132 |
+
if had_card_id_list:
|
133 |
+
return True, had_card_id_list, "已找到拥有卡牌"
|
134 |
+
return False, {}, "没找到任何card_id ,请确认当前卡组已拥有卡片"
|
135 |
+
|
136 |
+
|
137 |
+
def card_id_set_ava(card_id, key, img_data):
|
138 |
+
access_key = str(key)
|
139 |
+
result, code = set_face(card_id, access_key, img_data)
|
140 |
return result, code
|
requirements.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
numpy
|
2 |
-
gradio
|
3 |
qrcode[pil]
|
4 |
requests
|
5 |
requests_toolbelt
|
|
|
1 |
numpy
|
2 |
+
gradio==3.16.1b1
|
3 |
qrcode[pil]
|
4 |
requests
|
5 |
requests_toolbelt
|