cynika commited on
Commit
da52b9e
1 Parent(s): e097190
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.1
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 up_card
7
 
8
  sid_map = {
9
  "SHN48荣耀时刻": 1,
@@ -24,29 +26,81 @@ sid_map = {
24
 
25
 
26
  def qr(ava_image):
27
- if ava_image is not None:
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 login_up_nft(ava_image, info, sid):
34
- if info is not None:
35
- result, uid, key, code = get_uid_key(info)
36
- if result:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  bytes_object = io.BytesIO()
38
  ava_image.save(bytes_object, format='PNG')
39
  img_data = bytes_object.getvalue()
40
- sid_id = sid_map[sid]
41
- result, code = up_card(uid, key, img_data, sid_id)
42
- return code
 
 
 
 
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*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
- """第二步完成后,选择拥有卡组(三体的不用选择),3-15s内点击按钮<验证并提交头像>等待完成显示结果(成功可能需要时间审核)""")
 
72
  with gr.Row():
73
  sid_drop = gr.Dropdown(label="卡组", choices=list(sid_map.keys()), value="三体动画")
74
- text_button = gr.Button("验证并提交头像")
75
- code_output = gr.Textbox(placeholder="提交结果")
 
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
- text_button.click(login_up_nft, inputs=[image_ava, login_info, sid_drop], outputs=[code_output])
 
 
 
 
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 get_one_card_id(UID, ACCESS_KEY, sid):
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
- for round in data['data']['round_list']:
74
- for card in round['card_list']:
75
- if card['card_type'] == 2 and card['card_id_list']:
76
- print(card['card_id_list'][0]['card_id'])
77
- print("=================================")
78
- print(f"找到付费卡 card_id: {card['card_id_list'][0]['card_id']}\n这个id属于{card['card_name']}")
79
- print("=================================")
80
- return card['card_id_list'][0]['card_id']
81
- print('没有付费卡片')
82
- for i in data["data"]["pre_list"]:
83
- if card_id_list := i.get("card_id_list"):
84
- for j in card_id_list:
85
- if card_id := j.get("card_id"):
86
- print("=================================")
87
- print(f"找到预约卡card_id: {card_id}\n这个 id 属于{i.get('card_name')}")
88
- print("=================================")
89
- return card_id
90
- else:
91
- print() # 有值的 card_id_list 中没找到 card_id ,可能是没领三体卡吧
92
- else:
93
- print() # 卡片信息中没找到有值的 card_id_list ,可能是没有这张三体卡吧
 
 
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 up_card(uid, key, img_data, sid):
129
- UID = int(uid)
130
  access_key = str(key)
131
  sid = str(sid)
132
- result = False
133
- code = "超时"
134
-
135
- card_id = get_one_card_id(UID, access_key, sid) # 根据你所取得的卡card_id进行更改
136
- if not card_id:
137
- code = "没找到 card_id ,请确认是否已经领取卡片"
138
- # img_url = upload_image(BG_PATH)
139
- # set_bg_img(img_url, card_id)
140
- else:
141
- result, code = set_face(card_id, access_key, img_data)
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