├── canvas相关环境补充 ├── 01.png ├── 02.png ├── 03.png ├── 04.png ├── 05.png ├── 06.png ├── 07.png ├── 最后canvas画的图.png ├── demo.js └── readme.md ├── 调试 ├── 浏览器调试用 │ ├── canvas_demo.js │ ├── demo.html │ └── douyin.js └── 20210405网页原始代码 │ ├── demo02.js │ └── demo01.js ├── package.json ├── server.js ├── README.md ├── get_data.js ├── demo.py └── douyin.js /canvas相关环境补充/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/01.png -------------------------------------------------------------------------------- /canvas相关环境补充/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/02.png -------------------------------------------------------------------------------- /canvas相关环境补充/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/03.png -------------------------------------------------------------------------------- /canvas相关环境补充/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/04.png -------------------------------------------------------------------------------- /canvas相关环境补充/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/05.png -------------------------------------------------------------------------------- /canvas相关环境补充/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/06.png -------------------------------------------------------------------------------- /canvas相关环境补充/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/07.png -------------------------------------------------------------------------------- /canvas相关环境补充/最后canvas画的图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skygongque/douyin_signature/HEAD/canvas相关环境补充/最后canvas画的图.png -------------------------------------------------------------------------------- /调试/浏览器调试用/canvas_demo.js: -------------------------------------------------------------------------------- 1 | var canvas = document.createElement.apply(document,["canvas"]) 2 | canvas.width = 48; 3 | canvas.height = 16; 4 | var CanvasRC2D = canvas.getContext.apply(canvas,["2d"]) 5 | CanvasRC2D.fillText.apply(CanvasRC2D,["龘ฑภ경", 2, 12]) 6 | CanvasRC2D.arc.apply(CanvasRC2D,[8, 8, 8, 0, 2]) 7 | CanvasRC2D.stroke.apply(CanvasRC2D,[]) 8 | canvas.toDataURL.apply(canvas,[]) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "douyin7.27", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "douyin.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.17.1", 14 | "superagent": "^6.1.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /调试/浏览器调试用/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 | hello 12 | 13 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const douyin = require('./douyin'); 2 | const express = require('express'); 3 | const app = express(); 4 | 5 | app.get('/sign',function(req,res){ 6 | res.send(douyin.get_sign('123',"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36")); 7 | }) 8 | 9 | 10 | app.listen(3000,()=>{ 11 | console.log('开启服务,http://localhost:3000/sign'); 12 | }) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # douyin web signature 2 | 此项目仅用于科研学习,请勿用于商业用途否则造成的后果与作者无关 3 | This project is only used for research and study, please do not use it for commercial purposes, otherwise the consequences will not be related to the author. 4 | # usage 5 | ## install dependencies 6 | ``` 7 | npm install 8 | ``` 9 | ## run service 10 | ``` 11 | node server.js 12 | ``` 13 | 14 | ## python 调用示例 15 | 使用抖音app**分享用户的主页链接**,获得`sec_uid`即可下载该用户所用视频 16 | 比如链接: 17 | ``` 18 | https://www.iesdouyin.com/share/user/4199772083203972?with_sec_did=1&u_code=15b9142gf&sec_uid=MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz&did=MS4wLjABAAAA0hyr7tsAlRz53naAmyXnRMG7BoOdR7Qpq4QaNQhQbkj818m3LI5hocFqxMINgJX2&iid=MS4wLjABAAAAWegZGjqsb5FToq_3kcQazow83KPq2lkouu-JE1QPKxgc_8-Hu0yudigPVKsqRWl_×tamp=1618028058&utm_source=copy&utm_campaign=client_share&utm_medium=android&share_app_name=douyin 19 | ``` 20 | `sec_uid`为MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 21 | 22 | [python 调用示例](./demo.py) 23 | 24 | ## others 25 | 1. 使用`sec_uid`代替`uid`来区分用户,需要得到用户的`sec_id`以获取该用户的所有作品 26 | 2. `uid` `useragent` `sec_uid` 和`signature`并没有绑定 27 | 3. 这个版本校验较弱可能只是过渡版本,可能很快失效 28 | 29 | ## 浏览器环境补充 30 | [canvas相关环境补充](./canvas相关环境补充/readme.md) 31 | -------------------------------------------------------------------------------- /调试/20210405网页原始代码/demo02.js: -------------------------------------------------------------------------------- 1 | var test = Function(function (t) { 2 | return 'e(e,a,r){(b[e]||(b[e]=t("x,y","x "+e+" y")(r,a)}a(e,a,r){(k[r]||(k[r]=t("x,y","new x[y]("+Array(r+1).join(",x[y]")(1)+")")(e,a)}r(e,a,r){n,t,s={},b=s.d=r?r.d+1:0;for(s["$"+b]=s,t=0;t>>065:h=,y=,[y]=h66:u(e(t[b],,67:y=,d=,u((g=).x===c?r(g.y,y,k):g.apply(d,y68:u(e((g=t[b])<"<"?(b--,f):g+g,,70:u(!1)71:n72:+f73:u(parseInt(f,3675:if(){bcase 74:g=<<16>>16g76:u(k[])77:y=,u([y])78:g=,u(a(v,x-=g+1,g79:g=,u(k["$"+g])81:h=,[f]=h82:u([f])83:h=,k[]=h84:!085:void 086:u(v[x-1])88:h=,y=,h,y89:u({e{r(e.y,arguments,k)}e.y=f,e.x=c,e})90:null91:h93:h=0:;default:u((g<<16>>16)-16)}}n=this,t=n.Function,s=Object.keys||(e){a={},r=0;for(c in e)a[r]=c;a=r,a},b={},k={};r' 3 | .replace(/[-]/g, function (m) { 4 | return t[m.charCodeAt(0) & 15] 5 | }) 6 | }( 7 | "v[x++]=v[--x]t.charCodeAt(b++)-32function return ))++.substrvar .length(),b+=;break;case ;break}" 8 | .split(""))) 9 | 10 | console.log(test.toString()) -------------------------------------------------------------------------------- /get_data.js: -------------------------------------------------------------------------------- 1 | const douyin = require('./douyin'); 2 | const superagent = require('superagent'); 3 | 4 | 5 | async function get_data(sec_uid, signature,ua, max_cursor) { 6 | try { 7 | // https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAAqkmT10848xR-jRFw3uWmciryPwSXzWKKZR14hKoqVTU&count=21&max_cursor=0&aid=1128&_signature=VPDj2gAANJ1dvJnPy3yUrVTw48&dytk= 8 | // var url = `https://www.iesdouyin.com/web/api/v2/aweme/post/?user_id=${uid}&sec_uid=&count=21&max_cursor=${max_cursor}&aid=1128&_signature=${signature}&dytk=df4a9c279a56fe0d2bca0d3d98d36320` 9 | var url = `https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=${sec_uid}&count=21&max_cursor=${max_cursor}&aid=1128&_signature=${signature}&dytk=` 10 | var res = await superagent.get(url) 11 | .set({ 12 | 'user-agent':ua 13 | }) 14 | .timeout({ 15 | response: 5000, // Wait 5 seconds for the server to start sending, 16 | deadline: 10000, // but allow 10 seconds for the file to finish loading. 17 | }) 18 | .retry(2); 19 | return res.body; 20 | } catch (e) { 21 | console.log(e) 22 | return null; 23 | } 24 | }; 25 | 26 | !async function main() { 27 | // 使用sec_uid代替uid来区分用户 28 | var sec_uid = "MS4wLjABAAAAshzXgVS8HqF8PomFlCATZjkjC48Az0d8tk28RXRgrbA" 29 | var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" 30 | // var uid = "102064772608" 31 | // uid useragent sec_uid 和signature并没有绑定 32 | var signature = douyin.get_sign('1234567',ua) 33 | console.log(signature) 34 | var data = await get_data(sec_uid,signature,ua,0); 35 | console.log(JSON.stringify(data)); 36 | }() -------------------------------------------------------------------------------- /canvas相关环境补充/demo.js: -------------------------------------------------------------------------------- 1 | document = { 2 | createElement: function() { 3 | return canvas 4 | } 5 | }; 6 | canvas = { 7 | getContext: function getContext() { 8 | return CanvasRenderingContext2D 9 | }, 10 | toDataURL: function toDataURL() { 11 | return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAYAAABQrvyxAAACyUlEQVRIS8XWTYhVZRgH8N8dkPFqJqgI4sKmTUSgaBCKihCI5dZFUEaLwHAThjujEnXjpkAUHSRc+AEtFJIWKWRBSR9QENgiggplNqkTlXBnhjveeM6cF955PXccFJ2zuPec99zz3v/X87+3ZfrRK67jslWvxb103vCxx770DN5sApSAloBLco+SzFKcxbZClmG8gw7uIdCkfnq+BDsXbmzEizhYg2p0oEn1PEK5II/SgTKPbXyE89iBt+oPDDcpWz7cbwZysq/h9Vqd9/E2fkWsn0GsJeVi/1DvE6xJQLJoNA1T7PN0wx73zMBMDsTGTXMQ1n6TAfkJ63ACr+IcDmekUr6D0FUkdb+uc18SCPCba4ILitlodGA2ik8R7Rmw2E4ThnR9oVsRjJyuxL/4FLdwJCOQE07O5CBjQONIRINk7l4iOOMQB4mkdn6eajWgM2mhYU855KhRXRMO6DqKD/Ay3sWygkCKUE6qJPAegmis3+5T0I0EEtj8PUVn+r2e+Zb52HqjPqti8ptFnnPHPhzH6lq5+KIcbOwX4AJkAtjkQK50Pi9pfWfEKR/ifjVaOjC1wcLq9ZoPXbTLZfyi7Vljlep/4nSd8ZzA9bpNokUuzYJASTSBT3Mzcr8qbO77CNBSk0ZNGrPHoO+r1plnta4YxhxcTiAAbMcPs3QgXLpSC1EmKfbd38+B/jMQ4NvuWoTlPnfNKfyIES3P142U12Y/B6oI1Kj6RSgcOIZX6lqe0YHyL0Su/tT5gJ5JbSt03PSfrl34vco//2i522fgHma5/M1Ie20KZ0oHEsj5Fhireqijra2j4wlL3HHMGrv9bC2+tKUGf1vLxMOgfNBnp89AT8sGq3xrHE/WVRo0ojQHvWSHK/Y6ab83qhz/gZsYr34V5uAoCQwYstV1F6zzlXlaxg0aMeQvq7zgqu+qno+WuYG/5xJ86PU//5znHgwZKlQAAAAASUVORK5CYII=" 12 | }, 13 | } 14 | 15 | CanvasRenderingContext2D = { 16 | arc: function arc() {}, 17 | stroke: function stroke() {}, 18 | fillText: function fillText() {}, 19 | } 20 | 21 | var canvas = document.createElement.apply(document,["canvas"]) 22 | canvas.width = 48; 23 | canvas.height = 16; 24 | var CanvasRC2D = canvas.getContext.apply(canvas,["2d"]) 25 | CanvasRC2D.fillText.apply(CanvasRC2D,["龘ฑภ경", 2, 12]) 26 | CanvasRC2D.arc.apply(CanvasRC2D,[8, 8, 8, 0, 2]) 27 | CanvasRC2D.stroke.apply(CanvasRC2D,[]) 28 | console.log(canvas.toDataURL.apply(canvas,[])) -------------------------------------------------------------------------------- /canvas相关环境补充/readme.md: -------------------------------------------------------------------------------- 1 | # canvas相关环境监测 2 | ![](./01.png) 3 | ![](./02.png) 4 | ![](./03.png) 5 | ![](./04.png) 6 | ![](./05.png) 7 | ![](./06.png) 8 | ![](./07.png) 9 | 10 | 以上代码与如下代码功能上相似,以下代码可以直接在浏览器控制台输出 11 | ``` 12 | var canvas = document.createElement.apply(document,["canvas"]) 13 | canvas.width = 48; 14 | canvas.height = 16; 15 | var CanvasRC2D = canvas.getContext.apply(canvas,["2d"]) 16 | CanvasRC2D.fillText.apply(CanvasRC2D,["龘ฑภ경", 2, 12]) 17 | CanvasRC2D.arc.apply(CanvasRC2D,[8, 8, 8, 0, 2]) 18 | CanvasRC2D.stroke.apply(CanvasRC2D,[]) 19 | canvas.toDataURL.apply(canvas,[]) 20 | ``` 21 | 22 | 因此签名算法中canvas相关的环境可以这样补充 23 | ``` 24 | document = { 25 | createElement: function() { 26 | return canvas 27 | } 28 | }; 29 | canvas = { 30 | getContext: function getContext() { 31 | return CanvasRenderingContext2D 32 | }, 33 | toDataURL: function toDataURL() { 34 | return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAYAAABQrvyxAAACyUlEQVRIS8XWTYhVZRgH8N8dkPFqJqgI4sKmTUSgaBCKihCI5dZFUEaLwHAThjujEnXjpkAUHSRc+AEtFJIWKWRBSR9QENgiggplNqkTlXBnhjveeM6cF955PXccFJ2zuPec99zz3v/X87+3ZfrRK67jslWvxb103vCxx770DN5sApSAloBLco+SzFKcxbZClmG8gw7uIdCkfnq+BDsXbmzEizhYg2p0oEn1PEK5II/SgTKPbXyE89iBt+oPDDcpWz7cbwZysq/h9Vqd9/E2fkWsn0GsJeVi/1DvE6xJQLJoNA1T7PN0wx73zMBMDsTGTXMQ1n6TAfkJ63ACr+IcDmekUr6D0FUkdb+uc18SCPCba4ILitlodGA2ik8R7Rmw2E4ThnR9oVsRjJyuxL/4FLdwJCOQE07O5CBjQONIRINk7l4iOOMQB4mkdn6eajWgM2mhYU855KhRXRMO6DqKD/Ay3sWygkCKUE6qJPAegmis3+5T0I0EEtj8PUVn+r2e+Zb52HqjPqti8ptFnnPHPhzH6lq5+KIcbOwX4AJkAtjkQK50Pi9pfWfEKR/ifjVaOjC1wcLq9ZoPXbTLZfyi7Vljlep/4nSd8ZzA9bpNokUuzYJASTSBT3Mzcr8qbO77CNBSk0ZNGrPHoO+r1plnta4YxhxcTiAAbMcPs3QgXLpSC1EmKfbd38+B/jMQ4NvuWoTlPnfNKfyIES3P142U12Y/B6oI1Kj6RSgcOIZX6lqe0YHyL0Su/tT5gJ5JbSt03PSfrl34vco//2i522fgHma5/M1Ie20KZ0oHEsj5Fhireqijra2j4wlL3HHMGrv9bC2+tKUGf1vLxMOgfNBnp89AT8sGq3xrHE/WVRo0ojQHvWSHK/Y6ab83qhz/gZsYr34V5uAoCQwYstV1F6zzlXlaxg0aMeQvq7zgqu+qno+WuYG/5xJ86PU//5znHgwZKlQAAAAASUVORK5CYII=" 35 | }, 36 | } 37 | 38 | CanvasRenderingContext2D = { 39 | arc: function arc() {}, 40 | stroke: function stroke() {}, 41 | fillText: function fillText() {}, 42 | } 43 | ``` 44 | 45 | 另外再加上基本的window,navigator.useragent等环境就是该签名算法检测的完整浏览器环境 -------------------------------------------------------------------------------- /调试/20210405网页原始代码/demo01.js: -------------------------------------------------------------------------------- 1 | var e = {}; 2 | Function(function (t) { 3 | return 'e(e,a,r){(b[e]||(b[e]=t("x,y","x "+e+" y")(r,a)}a(e,a,r){(k[r]||(k[r]=t("x,y","new x[y]("+Array(r+1).join(",x[y]")(1)+")")(e,a)}r(e,a,r){n,t,s={},b=s.d=r?r.d+1:0;for(s["$"+b]=s,t=0;t>>065:h=,y=,[y]=h66:u(e(t[b],,67:y=,d=,u((g=).x===c?r(g.y,y,k):g.apply(d,y68:u(e((g=t[b])<"<"?(b--,f):g+g,,70:u(!1)71:n72:+f73:u(parseInt(f,3675:if(){bcase 74:g=<<16>>16g76:u(k[])77:y=,u([y])78:g=,u(a(v,x-=g+1,g79:g=,u(k["$"+g])81:h=,[f]=h82:u([f])83:h=,k[]=h84:!085:void 086:u(v[x-1])88:h=,y=,h,y89:u({e{r(e.y,arguments,k)}e.y=f,e.x=c,e})90:null91:h93:h=0:;default:u((g<<16>>16)-16)}}n=this,t=n.Function,s=Object.keys||(e){a={},r=0;for(c in e)a[r]=c;a=r,a},b={},k={};r' 4 | .replace(/[-]/g, function (m) { 5 | return t[m.charCodeAt(0) & 15] 6 | }) 7 | }( 8 | "v[x++]=v[--x]t.charCodeAt(b++)-32function return ))++.substrvar .length(),b+=;break;case ;break}" 9 | .split("")))()( 10 | 'gr$Daten Иb/s!l y͒yĹg,(lfi~ah`{mv,-n|jqewVxp{rvmmx,&effkx[!cs"l".Pq%widthl"@q&heightl"vr*getContextx$"2d[!cs#l#,*;?|u.|uc{uq$fontl#vr(fillTextx$$龘ฑภ경2<[#c}l#2q*shadowBlurl#1q-shadowOffsetXl#$$limeq+shadowColorl#vr#arcx88802[%c}l#vr&strokex[ c}l"v,)}eOmyoZB]mx[ cs!0s$l$Pb>>s!0s%yA0s"l"l!r&lengthb&l!l Bd>&+l!l &+l!l 6d>&+l!l &+ s,y=o!o!]/q"13o!l q"10o!],l 2d>& s.{s-yMo!o!]0q"13o!]*Ld>>b|s!o!l q"10o!],l!& s/yIo!o!].q"13o!],o!]*Jd>>b|&o!]+l &+ s0l-l!&l-l!i\'1z141z4b/@d|]', '-', item['desc']) 88 | if file_name == None or file_name == "": 89 | file_name = str(int(time.time()*1000)) 90 | downloadFILE(item['src'], file_name+'.mp4') 91 | except Exception as e: 92 | with open('error.log','a',encoding='utf-8') as f: 93 | f.write('error at'+ item['src']+ str(e)+'\n') 94 | f.close() 95 | 96 | if __name__ == "__main__": 97 | # sec_uid=MS4wLjABAAAAhELKHHFsEbZLtSChS8qdlUcXkwEMHrc7Y2rygE8MJTw 98 | main("MS4wLjABAAAAhELKHHFsEbZLtSChS8qdlUcXkwEMHrc7Y2rygE8MJTw") 99 | # main('MS4wLjABAAAA8cCaZ5AGaJ9dtpdnEzVrWkk_ir4rez3M-cZT5EE3Doc') 100 | # main("MS4wLjABAAAAshzXgVS8HqF8PomFlCATZjkjC48Az0d8tk28RXRgrbA") 101 | -------------------------------------------------------------------------------- /调试/浏览器调试用/douyin.js: -------------------------------------------------------------------------------- 1 | var e = {}; 2 | (function anonymous() { 3 | function e(e, a, r) { 4 | return (b[e] || (b[e] = t("x,y", "return x " + e + " y")))(r, a) 5 | } 6 | 7 | function a(e, a, r) { 8 | return (k[r] || (k[r] = t("x,y", "return new x[y](" + Array(r + 1).join(",x[++y]").substr(1) + ")")))(e, a) 9 | } 10 | 11 | function r(e, a, r) { 12 | var n, t, s = {}, 13 | b = s.d = r ? r.d + 1 : 0; 14 | for (s["$" + b] = s, t = 0; t < b; t++) s[n = "$" + t] = r[n]; 15 | for (t = 0, b = s.length = a.length; t < b; t++) s[t] = a[t]; 16 | return c(e, 0, s) 17 | } 18 | 19 | function c(t, b, k) { 20 | function u(e) { 21 | v[x++] = e 22 | } 23 | 24 | function f() { 25 | return g = t.charCodeAt(b++) - 32, t.substring(b, b += g) 26 | } 27 | 28 | function l() { 29 | try { 30 | y = c(t, b, k) 31 | } catch (e) { 32 | h = e, y = l 33 | } 34 | } 35 | for (var h, y, d, g, v = [], x = 0;;) switch (g = t.charCodeAt(b++) - 32) { 36 | case 1: 37 | u(!v[--x]); 38 | break; 39 | case 4: 40 | v[x++] = f(); 41 | break; 42 | case 5: 43 | u(function (e) { 44 | var a = 0, 45 | r = e.length; 46 | return function () { 47 | var c = a < r; 48 | return c && u(e[a++]), c 49 | } 50 | }(v[--x])); 51 | break; 52 | case 6: 53 | y = v[--x], u(v[--x](y)); 54 | break; 55 | case 56 | 8: 57 | if (g = t.charCodeAt(b++) - 32, l(), b += g, g = t.charCodeAt(b++) - 32, y === c) b += g; 58 | else if (y !== l) return y; 59 | break; 60 | case 9: 61 | v[x++] = c; 62 | break; 63 | case 10: 64 | u(s(v[--x])); 65 | break; 66 | case 11: 67 | y = v[--x], u(v[--x] + y); 68 | break; 69 | case 12: 70 | for (y = f(), d = [], g = 0; g < y.length; g++) d[g] = y.charCodeAt(g) ^ g + y.length; 71 | u(String.fromCharCode.apply(null, d)); 72 | break; 73 | case 13: 74 | y = v[--x], h = delete v[--x][y]; 75 | break; 76 | case 14: 77 | v[x++] = t.charCodeAt(b++) - 32; 78 | break; 79 | case 59: 80 | u((g = t.charCodeAt(b++) - 32) ? (y = x, v.slice(x -= g, y)) : []); 81 | break; 82 | case 61: 83 | u(v[--x][t.charCodeAt(b++) - 32]); 84 | break; 85 | case 62: 86 | g = v[--x], k[0] = 65599 * k[0] + k[1].charCodeAt(g) >>> 0; 87 | break; 88 | case 65: 89 | h = v[--x], y = v[--x], v[--x][y] = h; 90 | break; 91 | case 66: 92 | u(e(t[b++], v[--x], v[--x])); 93 | break; 94 | case 67: 95 | // canvas检测行 96 | y = v[--x], d = v[--x], u((g = v[--x]).x === c ? r(g.y, y, k) : g.apply(d, y)); 97 | break; 98 | case 68: 99 | u(e((g = t[b++]) < "<" ? (b--, f()) : g + g, v[--x], v[--x])); 100 | break; 101 | case 70: 102 | u(!1); 103 | break; 104 | case 71: 105 | v[x++] = n; 106 | break; 107 | case 72: 108 | v[x++] = +f(); 109 | break; 110 | case 73: 111 | u(parseInt(f(), 36)); 112 | break; 113 | case 75: 114 | if (v[--x]) { 115 | b++; 116 | break 117 | } 118 | case 74: 119 | g = t.charCodeAt(b++) - 32 << 16 >> 16, b += g; 120 | break; 121 | case 76: 122 | u(k[t.charCodeAt(b++) - 32]); 123 | break; 124 | case 77: 125 | y = v[--x], u(v[--x][y]); 126 | break; 127 | case 78: 128 | g = t.charCodeAt(b++) - 32, u(a(v, x -= g + 1, g)); 129 | break; 130 | case 79: 131 | g = t.charCodeAt(b++) - 32, u(k["$" + g]); 132 | break; 133 | case 81: 134 | h = v[--x], v[--x][f()] = h; 135 | break; 136 | case 82: 137 | u(v[--x][f()]); 138 | break; 139 | case 83: 140 | h = v[--x], k[t.charCodeAt(b++) - 32] = h; 141 | break; 142 | case 84: 143 | v[x++] = !0; 144 | break; 145 | case 85: 146 | v[x++] = void 0; 147 | break; 148 | case 86: 149 | u(v[x - 1]); 150 | break; 151 | case 88: 152 | h = v[--x], y = v[--x], v[x++] = h, v[x++] = y; 153 | break; 154 | case 89: 155 | u(function () { 156 | function e() { 157 | return r(e.y, arguments, k) 158 | } 159 | return e.y = f(), e.x = c, e 160 | }()); 161 | break; 162 | case 90: 163 | v[x++] = null; 164 | break; 165 | case 91: 166 | v[x++] = h; 167 | break; 168 | case 93: 169 | h = v[--x]; 170 | break; 171 | case 0: 172 | return v[--x]; 173 | default: 174 | u((g << 16 >> 16) - 16) 175 | } 176 | } 177 | var n = this, 178 | t = n.Function, 179 | s = Object.keys || function (e) { 180 | var a = {}, 181 | r = 0; 182 | for (var 183 | c in e) a[r++] = c; 184 | return a.length = r, a 185 | }, 186 | b = {}, 187 | k = {}; 188 | return r 189 | }) 190 | ()( 191 | 'gr$Daten Иb/s!l y͒yĹg,(lfi~ah`{mv,-n|jqewVxp{rvmmx,&effkx[!cs"l".Pq%widthl"@q&heightl"vr*getContextx$"2d[!cs#l#,*;?|u.|uc{uq$fontl#vr(fillTextx$$龘ฑภ경2<[#c}l#2q*shadowBlurl#1q-shadowOffsetXl#$$limeq+shadowColorl#vr#arcx88802[%c}l#vr&strokex[ c}l"v,)}eOmyoZB]mx[ cs!0s$l$Pb>>s!0s%yA0s"l"l!r&lengthb&l!l Bd>&+l!l &+l!l 6d>&+l!l &+ s,y=o!o!]/q"13o!l q"10o!],l 2d>& s.{s-yMo!o!]0q"13o!]*Ld>>b|s!o!l q"10o!],l!& s/yIo!o!].q"13o!],o!]*Jd>>b|&o!]+l &+ s0l-l!&l-l!i\'1z141z4b/@d>> 0; 137 | break; 138 | case 65: 139 | h = v[--x], 140 | y = v[--x], 141 | v[--x][y] = h; 142 | break; 143 | case 66: 144 | u(e(t[b++], v[--x], v[--x])); 145 | break; 146 | case 67: 147 | y = v[--x], 148 | d = v[--x] 149 | u((g = v[--x]).x === c ? r(g.y, y, k) : g.apply(d, y)); 150 | break; 151 | case 68: 152 | u(e((g = t[b++]) < "<" ? (b--, 153 | f()) : g + g, v[--x], v[--x])); 154 | break; 155 | case 70: 156 | u(!1); 157 | break; 158 | case 71: 159 | v[x++] = n; 160 | break; 161 | case 72: 162 | v[x++] = +f(); 163 | break; 164 | case 73: 165 | u(parseInt(f(), 36)); 166 | break; 167 | case 75: 168 | if (v[--x]) { 169 | b++; 170 | break 171 | } 172 | case 74: 173 | g = t.charCodeAt(b++) - 32 << 16 >> 16, 174 | b += g; 175 | break; 176 | case 76: 177 | u(k[t.charCodeAt(b++) - 32]); 178 | break; 179 | case 77: 180 | y = v[--x], 181 | u(v[--x][y]); 182 | break; 183 | case 78: 184 | g = t.charCodeAt(b++) - 32, 185 | u(a(v, x -= g + 1, g)); 186 | break; 187 | case 79: 188 | g = t.charCodeAt(b++) - 32, 189 | u(k["$" + g]); 190 | break; 191 | case 81: 192 | h = v[--x] 193 | v[--x][f()] = h; 194 | break; 195 | case 82: 196 | u(v[--x][f()]); 197 | break; 198 | case 83: 199 | h = v[--x] 200 | k[t.charCodeAt(b++) - 32] = h; 201 | break; 202 | case 84: 203 | v[x++] = !0; 204 | break; 205 | case 85: 206 | v[x++] = void 0; 207 | break; 208 | case 86: 209 | u(v[x - 1]); 210 | break; 211 | case 88: 212 | h = v[--x], 213 | y = v[--x], 214 | v[x++] = h, 215 | v[x++] = y; 216 | break; 217 | case 89: 218 | u(function() { 219 | function e() { 220 | return r(e.y, arguments, k) 221 | } 222 | return e.y = f(), 223 | e.x = c, 224 | e 225 | }()); 226 | break; 227 | case 90: 228 | v[x++] = null; 229 | break; 230 | case 91: 231 | v[x++] = h; 232 | break; 233 | case 93: 234 | h = v[--x]; 235 | break; 236 | case 0: 237 | return v[--x]; 238 | default: 239 | u((g << 16 >> 16) - 16) 240 | } 241 | } 242 | var n = this 243 | , t = n.Function 244 | , s = Object.keys || function(e) { 245 | var a = {} 246 | , r = 0; 247 | for (var c in e) 248 | a[r++] = c; 249 | return a.length = r, 250 | a 251 | } 252 | , b = {} 253 | , k = {}; 254 | return r 255 | } 256 | ) 257 | ()('gr$Daten Иb/s!l y͒yĹg,(lfi~ah`{mv,-n|jqewVxp{rvmmx,&effkx[!cs"l".Pq%widthl"@q&heightl"vr*getContextx$"2d[!cs#l#,*;?|u.|uc{uq$fontl#vr(fillTextx$$龘ฑภ경2<[#c}l#2q*shadowBlurl#1q-shadowOffsetXl#$$limeq+shadowColorl#vr#arcx88802[%c}l#vr&strokex[ c}l"v,)}eOmyoZB]mx[ cs!0s$l$Pb>>s!0s%yA0s"l"l!r&lengthb&l!l Bd>&+l!l &+l!l 6d>&+l!l &+ s,y=o!o!]/q"13o!l q"10o!],l 2d>& s.{s-yMo!o!]0q"13o!]*Ld>>b|s!o!l q"10o!],l!& s/yIo!o!].q"13o!],o!]*Jd>>b|&o!]+l &+ s0l-l!&l-l!i\'1z141z4b/@d