纳米AI

autobcb_admin (12020)08/28 22:26

纳米 ai 需要登录自己的账号
二维码导入(APP尚未完成该功能)
{
    "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
}
广告