纳米AI
autobcb_admin (12020)08/28 22:26
纳米 ai 需要登录自己的账号
{
"name": "纳米AI",
"html": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"UTF-8\">\n <title>纳米AI TTS<\/title>\n<\/head>\n<body><\/body>\n<script src=\"https:\/\/vc.jd.com\/web\/js\/jquery-3.1.1.min.js\"><\/script>\n<script>\n var isCookieJar = true;\n\n class FlutterJSBridge {\n constructor() { this.init(); }\n init() {\n if (window.flutter_inappwebview) {\n this.isReady = true;\n this.CookieJar();\n } else {\n window.addEventListener('flutterInAppWebViewPlatformReady', () => {\n this.isReady = true;\n this.CookieJar();\n });\n }\n }\n async CookieJar() {\n try {\n await window.flutter_inappwebview.callHandler('CookieJar', isCookieJar);\n } catch (error) {\n console.error('初始化失败:', error);\n }\n }\n async startBrowser(url,title,header) {\n try {\n return await window.flutter_inappwebview.callHandler('startBrowser',url,title,header);\n } catch (error) {\n return \"\";\n }\n }\n\n async getbuildNumber() {\n try { return await window.flutter_inappwebview.callHandler('buildNumber'); }\n catch (error) { return 0; }\n }\n async getversion() {\n try { return await window.flutter_inappwebview.callHandler('version'); }\n catch (error) { return \"0.0.0\"; }\n }\n async getDeviceid() {\n try { return await window.flutter_inappwebview.callHandler('id'); }\n catch (error) { return \"\"; }\n }\n async getDevice() {\n try { return await window.flutter_inappwebview.callHandler('device'); }\n catch (error) { return \"\"; }\n }\n async log(str) {\n try { return await window.flutter_inappwebview.callHandler('log', str); }\n catch (error) { return false; }\n }\n async showToast(str) {\n try { return await window.flutter_inappwebview.callHandler('showToast', str); }\n catch (error) { return false; }\n }\n async showLongToast(str) {\n try { return await window.flutter_inappwebview.callHandler('showLongToast', str); }\n catch (error) { return false; }\n }\n async getWebViewUA() {\n try { return await window.flutter_inappwebview.callHandler('getWebViewUA'); }\n catch (error) { return \"\"; }\n }\n async base64encode(str) {\n try { return await window.flutter_inappwebview.callHandler('base64encode', str); }\n catch (error) { return \"\"; }\n }\n async base64decode(str) {\n try { return await window.flutter_inappwebview.callHandler('base64decode', str); }\n catch (error) { return \"\"; }\n }\n }\n\n class Http {\n constructor() {}\n async Get(url, headers, followRedirects) {\n try {\n return await window.flutter_inappwebview.callHandler('http', \"get\", url, \"\", JSON.stringify(headers), followRedirects, \"\");\n } catch (error) { return null; }\n }\n async Head(url, headers, followRedirects) {\n try {\n return await window.flutter_inappwebview.callHandler('http', \"head\", url, \"\", JSON.stringify(headers), followRedirects, \"\");\n } catch (error) { return null; }\n }\n async Post(url, headers, body, contenttype, followRedirects) {\n try {\n return await window.flutter_inappwebview.callHandler('http', \"post\", url, body, JSON.stringify(headers), followRedirects, contenttype);\n } catch (error) { return null; }\n }\n }\n\n class Cache {\n constructor() {}\n async get(key) {\n try { return await window.flutter_inappwebview.callHandler('cache.get', key); }\n catch (error) { return null; }\n }\n async set(key, value) {\n try { return await window.flutter_inappwebview.callHandler('cache.set', key, value); }\n catch (error) { return null; }\n }\n async remove(key) {\n try { return await window.flutter_inappwebview.callHandler('cache.remove', key); }\n catch (error) { return null; }\n }\n async getLoginInfo() {\n return await this.get(\"LoginInfo\");\n }\n async putLoginInfo(info) {\n return await this.set(\"LoginInfo\", info);\n }\n }\n\n class Cookie {\n constructor() {}\n async get(url) {\n try { return await window.flutter_inappwebview.callHandler('cookie.get', url); }\n catch (error) { return null; }\n }\n async remove(url) {\n try { return await window.flutter_inappwebview.callHandler('cookie.remove', url); }\n catch (error) { return null; }\n }\n async set(url, value) {\n try { return await window.flutter_inappwebview.callHandler('cookie.set', url, value); }\n catch (error) { return null; }\n }\n async setCookie(url, key, value) {\n try { return await window.flutter_inappwebview.callHandler('cookie.setcookie', url, key, value); }\n catch (error) { return null; }\n }\n async getCookie(url, value) {\n try { return await window.flutter_inappwebview.callHandler('cookie.getCookie', url, value); }\n catch (error) { return null; }\n }\n }\n\n const flutterBridge = new FlutterJSBridge();\n const cache = new Cache();\n const http = new Http();\n const cookie = new Cookie();\n\n \/\/ ========== MD5函数 ==========\n function md5(string) {\n function md5cycle(x, k) {\n var a = x[0], b = x[1], c = x[2], d = x[3];\n a = ff(a, b, c, d, k[0], 7, -680876936);\n d = ff(d, a, b, c, k[1], 12, -389564586);\n c = ff(c, d, a, b, k[2], 17, 606105819);\n b = ff(b, c, d, a, k[3], 22, -1044525330);\n a = ff(a, b, c, d, k[4], 7, -176418897);\n d = ff(d, a, b, c, k[5], 12, 1200080426);\n c = ff(c, d, a, b, k[6], 17, -1473231341);\n b = ff(b, c, d, a, k[7], 22, -45705983);\n a = ff(a, b, c, d, k[8], 7, 1770035416);\n d = ff(d, a, b, c, k[9], 12, -1958414417);\n c = ff(c, d, a, b, k[10], 17, -42063);\n b = ff(b, c, d, a, k[11], 22, -1990404162);\n a = ff(a, b, c, d, k[12], 7, 1804603682);\n d = ff(d, a, b, c, k[13], 12, -40341101);\n c = ff(c, d, a, b, k[14], 17, -1502002290);\n b = ff(b, c, d, a, k[15], 22, 1236535329);\n a = gg(a, b, c, d, k[1], 5, -165796510);\n d = gg(d, a, b, c, k[6], 9, -1069501632);\n c = gg(c, d, a, b, k[11], 14, 643717713);\n b = gg(b, c, d, a, k[0], 20, -373897302);\n a = gg(a, b, c, d, k[5], 5, -701558691);\n d = gg(d, a, b, c, k[10], 9, 38016083);\n c = gg(c, d, a, b, k[15], 14, -660478335);\n b = gg(b, c, d, a, k[4], 20, -405537848);\n a = gg(a, b, c, d, k[9], 5, 568446438);\n d = gg(d, a, b, c, k[14], 9, -1019803690);\n c = gg(c, d, a, b, k[3], 14, -187363961);\n b = gg(b, c, d, a, k[8], 20, 1163531501);\n a = gg(a, b, c, d, k[13], 5, -1444681467);\n d = gg(d, a, b, c, k[2], 9, -51403784);\n c = gg(c, d, a, b, k[7], 14, 1735328473);\n b = gg(b, c, d, a, k[12], 20, -1926607734);\n a = hh(a, b, c, d, k[5], 4, -378558);\n d = hh(d, a, b, c, k[8], 11, -2022574463);\n c = hh(c, d, a, b, k[11], 16, 1839030562);\n b = hh(b, c, d, a, k[14], 23, -35309556);\n a = hh(a, b, c, d, k[1], 4, -1530992060);\n d = hh(d, a, b, c, k[4], 11, 1272893353);\n c = hh(c, d, a, b, k[7], 16, -155497632);\n b = hh(b, c, d, a, k[10], 23, -1094730640);\n a = hh(a, b, c, d, k[13], 4, 681279174);\n d = hh(d, a, b, c, k[0], 11, -358537222);\n c = hh(c, d, a, b, k[3], 16, -722521979);\n b = hh(b, c, d, a, k[6], 23, 76029189);\n a = hh(a, b, c, d, k[9], 4, -640364487);\n d = hh(d, a, b, c, k[12], 11, -421815835);\n c = hh(c, d, a, b, k[15], 16, 530742520);\n b = hh(b, c, d, a, k[2], 23, -995338651);\n a = ii(a, b, c, d, k[0], 6, -198630844);\n d = ii(d, a, b, c, k[7], 10, 1126891415);\n c = ii(c, d, a, b, k[14], 15, -1416354905);\n b = ii(b, c, d, a, k[5], 21, -57434055);\n a = ii(a, b, c, d, k[12], 6, 1700485571);\n d = ii(d, a, b, c, k[3], 10, -1894986606);\n c = ii(c, d, a, b, k[10], 15, -1051523);\n b = ii(b, c, d, a, k[1], 21, -2054922799);\n a = ii(a, b, c, d, k[8], 6, 1873313359);\n d = ii(d, a, b, c, k[15], 10, -30611744);\n c = ii(c, d, a, b, k[6], 15, -1560198380);\n b = ii(b, c, d, a, k[13], 21, 1309151649);\n a = ii(a, b, c, d, k[4], 6, -145523070);\n d = ii(d, a, b, c, k[11], 10, -1120210379);\n c = ii(c, d, a, b, k[2], 15, 718787259);\n b = ii(b, c, d, a, k[9], 21, -343485551);\n x[0] = add32(a, x[0]);\n x[1] = add32(b, x[1]);\n x[2] = add32(c, x[2]);\n x[3] = add32(d, x[3]);\n }\n function cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32((a << s) | (a >>> (32 - s)), b);\n }\n function ff(a, b, c, d, x, s, t) { return cmn((b & c) | ((~b) & d), a, b, x, s, t); }\n function gg(a, b, c, d, x, s, t) { return cmn((b & d) | (c & (~d)), a, b, x, s, t); }\n function hh(a, b, c, d, x, s, t) { return cmn(b ^ c ^ d, a, b, x, s, t); }\n function ii(a, b, c, d, x, s, t) { return cmn(c ^ (b | (~d)), a, b, x, s, t); }\n function md51(s) {\n var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i;\n for (i = 64; i <= s.length; i += 64) md5cycle(state, md5blk(s.substring(i - 64, i)));\n s = s.substring(i - 64);\n var tail = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];\n for (i = 0; i < s.length; i++) tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) { md5cycle(state, tail); for (i = 0; i < 16; i++) tail[i] = 0; }\n tail[14] = n * 8;\n md5cycle(state, tail);\n return state;\n }\n function md5blk(s) {\n var md5blks = [], i;\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n }\n var hex_chr = '0123456789abcdef'.split('');\n function rhex(n) {\n var s = '', j = 0;\n for (; j < 4; j++) s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n return s;\n }\n function hex(x) {\n for (var i = 0; i < x.length; i++) x[i] = rhex(x[i]);\n return x.join('');\n }\n function add32(a, b) { return (a + b) & 0xFFFFFFFF; }\n return hex(md51(string));\n }\n\n \/\/ ========== 构建请求头 ==========\n async function buildHeaders() {\n try {\n \/\/ 从缓存获取用户填写的Cookie\n const loginInfo = await cache.getLoginInfo();\n let userCookie = '';\n if (loginInfo) {\n try {\n const info = JSON.parse(loginInfo);\n userCookie = info.cookie || info.Cookie || '';\n } catch (e) {}\n }\n\n \/\/ 获取UA\n let ua = await flutterBridge.getWebViewUA();\n if (!ua) ua = 'Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36';\n\n \/\/ 生成时间戳\n const getTime = (o) => new Date(Date.now() + o * 36e5).toISOString().replace('Z', `+${o.toString().padStart(2, '0')}:00`);\n const time = getTime(8);\n\n \/\/ 从Cookie提取关键信息\n let mid = '';\n let authToken = '';\n if (userCookie) {\n const nmidMatch = userCookie.match(\/nmid=([^;]+)\/);\n const guidMatch = userCookie.match(\/__guid=([^;]+)\/);\n mid = nmidMatch ? nmidMatch[1] : (guidMatch ? guidMatch[1] : '');\n\n const authMatch = userCookie.match(\/Auth-Token=([^;]+)\/);\n authToken = authMatch ? authMatch[1] : '';\n }\n\n \/\/ 如果没有mid,生成一个随机的\n if (!mid) {\n mid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.replace(\/x\/g, () => Math.floor(Math.random() * 16).toString(16));\n }\n\n const um = md5(ua);\n\n \/\/ 构建请求头\n const headers = {\n 'User-Agent': ua,\n 'device-platform': 'Web',\n 'timestamp': time,\n 'zm-ver': '1.2',\n 'access-token': mid,\n 'zm-ua': um,\n 'zm-token': md5('Web' + time + '1.2' + mid + um),\n 'Content-Type': 'application\/x-www-form-urlencoded',\n 'Origin': 'https:\/\/bot.n.cn',\n 'Referer': 'https:\/\/bot.n.cn\/'\n };\n\n if (userCookie) {\n headers['Cookie'] = userCookie;\n }\n\n if (authToken) {\n headers['Auth-Token'] = authToken;\n }\n\n return headers;\n } catch (error) {\n await flutterBridge.log('构建请求头失败: ' + error.message);\n return ;\n }\n }\n\n \/\/ ========== 生成音频请求 ==========\n async function getttsurl(speakText, speechRate) {\n try {\n let selectedId = await cache.get('tts');\n if (!selectedId) selectedId = 'DeepSeek';\n\n const headers = await buildHeaders();\n const encoded = encodeURIComponent(speakText);\n\n await flutterBridge.log(`TTS请求: ${speakText.substring(0, 30)}... 模型: ${selectedId}`);\n\n return JSON.stringify({\n method: 'post',\n url: `https:\/\/bot.n.cn\/api\/tts\/v1?roleid=${selectedId}`,\n headers: headers,\n body: `text=${encoded}&set_speed=${speechRate \/ 10}&audio_type=mp3&format=stream`\n });\n } catch (error) {\n await flutterBridge.log('getttsurl错误: ' + error.message);\n return JSON.stringify({\n error: error.message\n });\n }\n }\n\n async function nlogin() {\n flutterBridge.startBrowser(\"https:\/\/bot.n.cn\",\"登录\",JSON.stringify({\n \"User-Agent\":\"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/151.0.0.0 Safari\/537.36 Edg\/151.0.0.0\"\n }));\n }\n\n \/\/ ========== 登录\/设置界面 ==========\n async function getloginurl() {\n const loginInfo = await cache.getLoginInfo();\n let currentCookie = '';\n if (loginInfo) {\n try {\n const info = JSON.parse(loginInfo);\n currentCookie = info.cookie || '';\n } catch (e) {}\n }\n\n var login = [\n {\n \"name\": \"登录\",\n \"type\": \"button\",\n \"action\": \"nlogin()\"\n },\n {\n \"name\": \"💡 获取教程\",\n \"type\": \"button\",\n \"action\": \"showCookieHelp()\"\n },\n {\n \"name\": \"▱▱▱▱ 模型选择 ▱▱▱▱\",\n \"type\": \"button\",\n \"action\": \"gettts()\"\n },\n {\n \"name\": \"DeepSeek\",\n \"type\": \"button\",\n \"action\": \"settts('DeepSeek')\",\n \"style\": { \"layout_wrapBefore\": true, \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"豆包\",\n \"type\": \"button\",\n \"action\": \"settts('doubao')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"智脑\",\n \"type\": \"button\",\n \"action\": \"settts('zhinao')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"通义\",\n \"type\": \"button\",\n \"action\": \"settts('tongyi')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"混元\",\n \"type\": \"button\",\n \"action\": \"settts('hunyuan')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"文心\",\n \"type\": \"button\",\n \"action\": \"settts('wenxin')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"Max\",\n \"type\": \"button\",\n \"action\": \"settts('MiniMax')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"智谱\",\n \"type\": \"button\",\n \"action\": \"settts('zhipu')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"商汤\",\n \"type\": \"button\",\n \"action\": \"settts('shangtang')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"零一\",\n \"type\": \"button\",\n \"action\": \"settts('lingyi')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"小应\",\n \"type\": \"button\",\n \"action\": \"settts('baixiaoying')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"星火\",\n \"type\": \"button\",\n \"action\": \"settts('xunfei')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"星辰\",\n \"type\": \"button\",\n \"action\": \"settts('stepspark')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n },\n {\n \"name\": \"Kimi\",\n \"type\": \"button\",\n \"action\": \"settts('Kimi')\",\n \"style\": { \"layout_flexBasisPercent\": 0.2 }\n }\n ];\n return JSON.stringify(login);\n }\n\n \/\/ ========== Cookie获取教程 ==========\n async function showCookieHelp() {\n const help = \"点击登录按钮登录自己的账号即可\"\n await flutterBridge.showLongToast(help);\n }\n\n \/\/ ========== 保存设置 ==========\n async function login() {\n try {\n const loginInfo = await cache.getLoginInfo();\n if (loginInfo) {\n await flutterBridge.showToast('配置已保存');\n }\n } catch (error) {\n await flutterBridge.showToast('保存失败: ' + error.message);\n }\n }\n\n async function settts(v) {\n await cache.set(\"tts\", v);\n await flutterBridge.showToast(\"成功切换:\" + v);\n }\n\n async function gettts() {\n var get = await cache.get(\"tts\");\n if (!get) get = 'DeepSeek';\n await flutterBridge.showToast(\"当前接口:\" + get);\n }\n\n<\/script>\n<\/html>",
"login": true
}