最新的破解方法如下,采用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
网友回复
腾讯混元模型广场里都是混元模型的垂直小模型,如何api调用?
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?