最新的破解方法如下,采用python代码编写:

点击查看代码
import tkinter as tk
from tkinter import messagebox
import argparse
from Crypto.Cipher import AES
import gzip
import io
import json
import os
import re
import requests
import sys
import zstandard
from Crypto.Util.Padding import unpad
USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0"
HOST = "https://hub.vroid.com"
API_VERSION = "11"
MODEL_FILE_EXT = "glb"
VROID_BASE = r"(?:https?:\/\/)?hub\.vroid\.com\/(?P<lang>[a-z]{2}\/)?"
VROID_USER = VROID_BASE + r"users/(?P<user_id>\d+)"
VROID_MODEL = VROID_BASE + r"characters\/(?P<character_id>\d+)\/models\/(?P<model_id>\d+)"
def unpad(s):
return s[:-ord(s[len(s)-1:])]
def get_user_model_ids(user_id):
model_ids = []
api_url = f"{HOST}/api/users/{user_id}/character_models?antisocial_or_hate_usage=&characterization_allowed_user=&corporate_commercial_use=&credit=&modification=&personal_commercial_use=&political_or_religious_usage=&redistribution=&sexual_expression=&violent_expression="
page_num = 1
while api_url:
user_r = requests.get(api_url, headers={"User-Agent": USER_AGENT, "X-Api-Version": API_VERSION})
if not user_r.ok:
print(f"[user:{user_id}:page:{page_num}] got bad response from vroid hub, {user_r.status_code}")
break
user_j = user_r.json()
if "next" in user_j["_links"]:
api_url = HOST + user_j["_links"]["next"]["href"]
else:
api_url = None
for model in user_j["data"]:
model_ids.append(model["id"])
print(f"[user:{user_id}] found {len(model_ids)} models")
return model_ids
def download_preview_model(model_id):
model_preview_url = f"{HOST}/api/character_models/{model_id}/optimized_preview"
model_r = requests.get(model_preview_url, allow_redirects=True, headers={"User-Agent": USER_AGENT, "X-Api-Version": API_VERSION})
if not model_r.ok:
print(f"[model:{model_id}:preview] got bad response from vroid hub, {model_r.status_code}")
print(f"[model:{model_id}:preview] {model_r.content.decode()}")
return None
return io.BytesIO(model_r.content)
def getbyteformfile(file_path):
with open(file_path, 'rb') as file:
file_content = file.read()
model_bytes = io.BytesIO(file_content)
return model_bytes
def decrypt_decompress_model(model_id, model_bytes, model_filename):
if not os.path.isfile(model_filename):
with open(model_filename, "wb") as dec_vrm:
iv_bytes = model_bytes.read(16)
key_bytes = model_bytes.read(32)
key_context = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)
enc_data = model_bytes.read()
dec_data = unpad(key_context.decrypt(enc_data))[4:]
dctx = zstandard.ZstdDecompressor()
with dctx.stream_writer(dec_vrm) as decompressor:
decompressor.write(dec_data)
print(f"[model:{model_id}] wrote decrypted and decompressed model '{os.path.basename(model_filename)}'")
else:
print(f"[model:{model_id}] '{os.path.basename(model_filename)}' already exists")
def download_model_from_vroid(model_id, subdir=None):
model_path_base = os.path.join(subdir if subdir else "", model_id)
model_api_url = f"{HOST}/api/character_models/{model_id}"
json_path = f"{model_path_base}.info.json"
model_api_r = requests.get(model_api_url, headers={"User-Agent": USER_AGENT, "X-Api-Version": API_VERSION})
if not model_api_r.ok:
print(f"[model:{model_id}:api] got bad response from vroid hub, {model_api_r.status_code}")
return
model_api_j = model_api_r.json()["data"]
if not os.path.isfile(json_path):
with open(json_path, "w") as json_file:
json_file.write(json.dumps(model_api_j))
print(f"[model:{model_id}:api] wrote '{os.path.basename(json_path)}'")
else:
print(f"[model:{model_id}:api] '{os.path.basename(json_path)}' already exists")
if not "conversion_state" in model_api_j["character_model"]["latest_character_model_version"]:
print(f"[model:{model_id}:api] warning: JSON response implies model preview does not exist, expecting 404")
elif model_api_j["character_model"]["latest_character_model_version"]["conversion_state"]["current_state"] != "completed":
print(f"[model:{model_id}:api] warning: JSON response implies model preview is not ready, expecting 404")
enc_vrm = download_preview_model(model_id)
if not enc_vrm:
return
decrypt_decompress_model(model_id, enc_vrm, f"{model_path_base}.{MODEL_FILE_EXT}")
def download_user_from_vroid(user_id):
user_api_url = f"{HOST}/api/users/{user_id}"
user_api_r = requests.get(user_api_url, headers={"User-Agent": USER_AGENT, "X-Api-Version": API_VERSION})
if not user_api_r.ok:
print(f"[user:{user_id}:api] got bad response from vroid hub, user might not exist, {user_api_r.status_code}")
return
user_api_j = user_api_r.json()
username = user_api_j["data"]["user"]["name"]
user_base_path = os.path.join("", f"{username} ({user_id})")
if not os.path.isdir(user_base_path):
os.makedirs(user_base_path)
json_path = f"{user_base_path}.info.json"
with open(json_path, "w") as json_file:
json_file.write(json.dumps(user_api_j["data"]))
print(f"[user:{user_id}:api] wrote '{os.path.basename(json_path)}'")
model_ids = get_user_model_ids(user_id)
for model_id in model_ids:
download_model_from_vroid(model_id, user_base_path)
def on_confirm():
url = entry.get()
vroid_usr_m = re.search(VROID_USER, url)
model_m = re.search(VROID_MODEL, url)
if vroid_usr_m:
user_id = vroid_usr_m.group("user_id")
download_user_from_vroid(user_id)
messagebox.showinfo("系统", f"提取成功")
elif model_m:
model_id = model_m.group("model_id")
download_model_from_vroid(model_id)
messagebox.showinfo("系统", f"提取成功")
else:
messagebox.showinfo("系统", f"错误")
# 创建主窗口
root = tk.Tk()
root.title("vroid hub model提取器")
# 创建标签
label = tk.Label(root, text="请输入URL:")
label.pack(pady=10)
# 创建输入框
entry = tk.Entry(root, width=50)
entry.pack(pady=10)
# 创建确认按钮
confirm_button = tk.Button(root, text="确认", command=on_confirm)
confirm_button.pack(pady=10)
# 运行主循环
root.mainloop()保存为vrmcrack.py安装好python环境
安装依赖:
pip install pycryptodome requests zstandard
执行python vrmcrack.py
网友回复
如何将linux服务器的文件目录映射到windows电脑磁盘?
Docling 与 MarkItDown 两个库有啥不同?
豆包收费后国产其他ai软件也会跟进收费吗?
JPEG 与 HEIF图片格式区别?
centos7版本太旧无法安装python3.11,如何在docker中运行python3.11?
python如何做个RPA按键精灵的程序?
写一个windows的cmd的python代码如何在命令行中捕获获取复制粘贴的图片?
如何将别人爆款的抖音短视频短剧文案提取为seedance2的提示词?
阿里云域名dns云解析10万次日限额如何应对?
windows电脑如何提交上架ipa苹果应用?


