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 |
-
"确保第一步领取三体数字藏品后,上传新头像,头像尽量为正方形并小于1024
|
|
|
|
| 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
|