├── .idea ├── .gitignore ├── encodings.xml ├── inspectionProfiles │ └── Project_Default.xml ├── jiasule.iml ├── misc.xml ├── modules.xml └── vcs.xml ├── README.md ├── crack.py ├── environment ├── jiasule.js ├── old_code ├── README.md ├── crack.py ├── crack_qyxxgs.py ├── demo.py └── wc_js.js └── requirements.txt /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 14 | -------------------------------------------------------------------------------- /.idea/jiasule.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jiasule 2 | #最新破解工商信息公示网加速乐加密cookies 3 | ``` 4 | 本项目为学习破解Js加密而立,请勿用于违法用途,用于违法用途产生的后果与本人无关,本版本仅供学习参考所用,所有下载者应于24小时内学习完毕后删除。 5 | ``` 6 | # 使用方法 7 | 8 | ``` 9 | 运行crack.py,获得jsl_clearance与jsluid_h。 10 | 在请求中的cookies添加即可正常访问。 11 | 如发现bug或不能使用请在lssues中告知。 12 | ``` 13 | 14 | # 可用网站 15 | ``` 16 | 国家企业信用信息公示系统等使用此类方法的网站 17 | 18 | ``` 19 | 20 | #### 2019年5月28号修改 21 | 增加一种js返回情况的支持 22 | #### 2019年7月24号修改 23 | 修改__jsluid 为 __jsluid_h, 增加替换一种验证本地js的处理 24 | #### 2020年7月24号修改 25 | 网站更换验证方式,现已实现 26 | #### 2021年10月20号修改 27 | 网站更换验证方式,现已实现 28 | -------------------------------------------------------------------------------- /crack.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # -*- coding: utf-8 -*- 4 | 5 | """ 6 | @author: jiajia 7 | @file: crack.py 8 | @time: 2020/7/28 14:11 9 | """ 10 | import re 11 | 12 | import execjs 13 | import requests 14 | 15 | with open(r'jiasule.js', encoding='utf-8') as f: 16 | wc_js = f.read() 17 | ctx = execjs.compile(wc_js) 18 | 19 | url = 'http://www.gsxt.gov.cn/index.html' 20 | headers = { 21 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36" 22 | } 23 | 24 | response = requests.get(url, headers=headers) 25 | jsluid_h = response.headers['Set-Cookie'].split('=')[1].split(';')[0] 26 | data = response.text 27 | js = re.findall('', data)[0] 28 | jsl_cookie = ctx.call('jsl', js) 29 | jsl_clearance = re.findall('=(.*?);', jsl_cookie)[0] 30 | 31 | 32 | headers = { 33 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36", 34 | "Cookie": f"__jsluid_h={jsluid_h}; __jsl_clearance={jsl_clearance}" 35 | } 36 | response = requests.get(url, headers=headers) 37 | js = re.findall('', response.text)[0] 38 | go_init = re.findall("(var\s([a-zA-Z_0-9]*?)=[^;]+?\['ct'\][^;]*;)", js)[0] 39 | js = js.replace(go_init[0], go_init[0] + f"document.cookie = {go_init[1]}[0];") 40 | jsl_clearance = ctx.call('jsl', js) 41 | 42 | 43 | #### test ###### 44 | headers = { 45 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36", 46 | "Cookie": f"__jsluid_h={jsluid_h}; __jsl_clearance={jsl_clearance}" 47 | } 48 | response = requests.get(url, headers=headers) 49 | print(response.text) 50 | print(response) 51 | print("__jsluid_h:", jsluid_h) 52 | print("__jsl_clearance:", jsl_clearance) -------------------------------------------------------------------------------- /environment: -------------------------------------------------------------------------------- 1 | win10 64位 2 | python 3.6.7 3 | nodejs v10.15.0 4 | -------------------------------------------------------------------------------- /jiasule.js: -------------------------------------------------------------------------------- 1 | function jsl(js) { 2 | window = { 3 | navigator: { 4 | userAgent: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36" 5 | }, 6 | outerWidth: 1920, 7 | outerHeight: 1050, 8 | }; 9 | location = { 10 | reload: function() {} 11 | }; 12 | document = {}; 13 | eval(js); 14 | return document.cookie 15 | } 16 | -------------------------------------------------------------------------------- /old_code/README.md: -------------------------------------------------------------------------------- 1 | # jiasule 2 | #最新破解工商信息公示网加速乐加密cookies 3 | 4 | 本项目为学习破解Js加密而立,请勿用于违法用途,用于违法用途产生的后果与本人无关,本版本仅供学习参考所用,所有下载者应于24小时内学习完毕后删除。 5 | 6 | #使用方法 7 | 8 | 按照environment和requirements.txt配置好环境后,运行crack.py,获得jsl_clearance与jsluid。 9 | 在请求的header中的cookies添加即可正常访问。 10 | 11 | 如发现bug或不能使用请在lssues中告知。 12 | 13 | #调用思路 14 | 15 | 16 | 1.无cookies请求页面获得jsluid与返回的js代码。 17 | 2.运行得到的js代码。(经多次测试得出返回的js代码是相同的,只是每次的x值与y值是不同的,所以本项目在本地构建了一个js项目,每次调用传入x,y) 18 | 3.第二步运行后会得到一个解密后的js代码段(其中会返回多个版本),去除其中的本地运行会出错的代码,运行会得到会jsl_clearance。 19 | 4带上jsl_clearance与jsluid就可以愉快的访问了 20 | 21 | 22 | 23 | #可用网站 24 | 25 | 国家企业信用信息公示系统 26 | 27 | 中华人民共和国公安部 28 | 29 | 中国医采网 30 | 31 | ###2019年5月28号修改 32 | 增加一种js返回情况的支持 33 | 34 | ###2019年7月24号修改 35 | 修改__jsluid 为 __jsluid_h 36 | 增加替换一种验证本地js的处理 37 | 38 | -------------------------------------------------------------------------------- /old_code/crack.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | """ 3 | !/usr/bin/python3 4 | @File: crack.py 5 | @Author:jiajia 6 | @time: 2019/4/30 11:15 7 | """ 8 | import re 9 | import time 10 | 11 | import execjs 12 | import requests 13 | 14 | 15 | class Crack(object): 16 | """ 17 | 同一ip频繁使用: 18 | 出现正常200但是没有结果 19 | 第一次解密出来是错误的 20 | """ 21 | def __init__(self, url, test_url): 22 | with open(r'wc_js.js', encoding='utf-8') as f: 23 | wc_js = f.read() 24 | self.wc_js = execjs.compile(wc_js) 25 | self.url = url 26 | self.test_url = test_url 27 | 28 | # 固定user_agent,后台使用user-agent验证cookies, 之后的访问也需要使用这个 29 | self.headers = { 30 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36' 31 | } 32 | 33 | def acquire_js(self): 34 | """ 35 | 不带cookies请求首页,获得返回的js 36 | :return:页面中的js,和set_cookies中的jsluid 37 | """ 38 | response = requests.get(self.url, headers=self.headers) 39 | if response.status_code == 521: 40 | return response.text, response.headers['Set-Cookie'].split('=')[1].split(';')[0] 41 | else: 42 | print(response.text) 43 | print(self.headers) 44 | return None, None 45 | 46 | def first_decryption(self, first_js): 47 | """ 48 | 解密js,获得第二层加密的js 49 | :param first_js: 50 | :return: 51 | """ 52 | x = re.findall('var x="(.*?)"', first_js)[0] 53 | y = re.findall(',y="(.*?)"', first_js)[0] 54 | second_js = self.wc_js.call('once_js', x, y) 55 | # second_js = self.wc_js.call('get_js', x, y, z) 56 | return second_js 57 | 58 | def regex(self, js): 59 | regex = "!*window\[.*?\]" 60 | find = re.findall(regex, js) 61 | if find: 62 | for f in find: 63 | if '!' in f: 64 | if len(re.findall('!', f)) % 2 == 0: 65 | js = js.replace(f, 'false') 66 | else: 67 | js = js.replace(f, 'true') 68 | else: 69 | js = js.replace(f, 'undefined') 70 | js = js.replace('window.headless', 'undefined') 71 | return js 72 | 73 | def replace_url(self, js): 74 | # 替换1 75 | # 取出两个变量名 76 | _3d = re.findall("(var .{0,5}=)document\.createElement\('div'\);", js) 77 | _2b = re.findall("(var .{0,5}=).{0,5}\.match\(/https\?:\\\/\\\//\)\[0\];", js) 78 | 79 | # 替换成要访问的url 80 | js = re.sub("var .{0,5}=document\.createElement\('div'\);", _3d[0] + f'"{self.url.replace("http://", "")}";', 81 | js) 82 | js = re.sub("_.{0,5}\.innerHTML='';", "", js) 83 | js = re.sub("_.{0,5}=.{0,5}\.firstChild\.href;", "", js) 84 | js = re.sub("var .{0,5}=.{0,5}\.match\(/https\?:\\\/\\\//\)\[0\];", _2b[0] + '"http://";', js) 85 | js = re.sub("_.{0,5}=.{0,5}\.substr\(.{0,5}\.length\)\.toLowerCase\(\);", "", js) 86 | return js 87 | 88 | def second_decryption(self, second_js): 89 | """ 90 | 把第二层js准换成本地可以运行的js 91 | !!!此处可能会出错!!! 92 | :param second_js: 第一次解密的js 93 | :return: __jsl_clearance的值 94 | """ 95 | # 转义字符 96 | js = second_js.replace('\\\\', '\\') 97 | 98 | # 切割 99 | js = 'cookie' + js.split('document.cookie')[1] 100 | js = js.split('GMT;Path=/;')[0] + "'" 101 | 102 | if re.findall("(var .{0,5}=)document\.createElement\('div'\);", js): 103 | js = self.replace_url(js) 104 | 105 | # 替换可能出现的window 106 | js = self.regex(js) 107 | 108 | s = """ 109 | function cook() { 110 | %s 111 | return cookie 112 | } 113 | """ 114 | new_js = s % js 115 | ctx = execjs.compile(new_js) 116 | # 切割获得的__jsl_clearance 117 | jsl = ctx.call('cook') 118 | jsl = jsl.split(';')[0] 119 | jsl_clearance = jsl.split('=')[1] 120 | return jsl_clearance 121 | 122 | def test_cookies(self, jsluid, jsl_clearance): 123 | """ 124 | 带cookies访问,测试拿到的是否正确 125 | :param jsluid:cookies中的参数 126 | :param jsl_clearance: cookies中的参数 127 | :return: 128 | """ 129 | headers = self.headers.copy() 130 | headers['Cookie'] = f'__jsluid_h={jsluid}; __jsl_clearance={jsl_clearance};' 131 | response = requests.get(self.test_url, headers=headers) 132 | print(response.text) 133 | return response.status_code 134 | 135 | def run(self): 136 | while True: 137 | first_js, jsluid = self.acquire_js() 138 | second_js = self.first_decryption(first_js) 139 | try: 140 | jsl_clearance = self.second_decryption(second_js) 141 | except: 142 | print(second_js) 143 | continue 144 | else: 145 | code = self.test_cookies(jsluid, jsl_clearance) 146 | if code == 200: 147 | return jsluid, jsl_clearance 148 | else: 149 | print(code) 150 | print(second_js) 151 | continue 152 | 153 | 154 | if __name__ == '__main__': 155 | # # 企业信息公示系统 156 | url = "http://www.gsxt.gov.cn/index.html" 157 | test_url = "http://www.gsxt.gov.cn/index.html" 158 | 159 | # # 66代理 160 | # url = "http://www.66ip.cn/2.html" 161 | # test_url = "http://www.66ip.cn/2.html" 162 | 163 | # # 公安部网站 164 | # url = 'http://www.mps.gov.cn/' 165 | # test_url = 'http://www.mps.gov.cn/' 166 | 167 | ck = Crack(url, test_url) 168 | jsluid, jsl_clearance = ck.run() 169 | print('jsluid:', jsluid) 170 | print('jsl_clearance:', jsl_clearance) 171 | -------------------------------------------------------------------------------- /old_code/crack_qyxxgs.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | """ 3 | !/usr/bin/python3 4 | @File: crack.py 5 | @Author:jiajia 6 | @time: 2019/4/30 11:15 7 | """ 8 | import re 9 | import time 10 | 11 | import execjs 12 | import requests 13 | 14 | 15 | class Crack(object): 16 | """ 17 | 同一ip频繁使用: 18 | 出现正常200但是没有结果 19 | 第一次解密出来是错误的 20 | """ 21 | def __init__(self, url, test_url): 22 | with open(r'wc_js.js', encoding='utf-8') as f: 23 | wc_js = f.read() 24 | self.wc_js = execjs.compile(wc_js) 25 | self.url = url 26 | self.test_url = test_url 27 | 28 | # 固定user_agent,后台使用user-agent验证cookies, 之后的访问也需要使用这个 29 | self.headers = { 30 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36' 31 | } 32 | 33 | def acquire_js(self): 34 | """ 35 | 不带cookies请求首页,获得返回的js 36 | :return:页面中的js,和set_cookies中的jsluid 37 | """ 38 | response = requests.get(self.url, headers=self.headers) 39 | if response.status_code == 521: 40 | return response.text, response.headers['Set-Cookie'].split('=')[1].split(';')[0] 41 | else: 42 | print(response.text) 43 | print(self.headers) 44 | return None, None 45 | 46 | def first_decryption(self, first_js): 47 | """ 48 | 解密js,获得第二层加密的js 49 | :param first_js: 50 | :return: 51 | """ 52 | x = re.findall('var x="(.*?)"', first_js)[0] 53 | y = re.findall(',y="(.*?)"', first_js)[0] 54 | second_js = self.wc_js.call('once_js', x, y) 55 | # second_js = self.wc_js.call('get_js', x, y, z) 56 | return second_js 57 | 58 | def regex(self, js): 59 | regex = "!*window\[.*?\]" 60 | find = re.findall(regex, js) 61 | if find: 62 | for f in find: 63 | if '!' in f: 64 | if len(re.findall('!', f)) % 2 == 0: 65 | js = js.replace(f, 'false') 66 | else: 67 | js = js.replace(f, 'true') 68 | else: 69 | js = js.replace(f, 'undefined') 70 | js = js.replace('window.headless', 'undefined') 71 | return js 72 | 73 | def replace_url(self, js): 74 | # 替换1 75 | # 取出两个变量名 76 | _3d = re.findall("(var .{0,5}=)document\.createElement\('div'\);", js) 77 | _2b = re.findall("(var .{0,5}=).{0,5}\.match\(/https\?:\\\/\\\//\)\[0\];", js) 78 | 79 | # 替换成要访问的url 80 | js = re.sub("var .{0,5}=document\.createElement\('div'\);", _3d[0] + f'"{self.url.replace("http://", "")}";', 81 | js) 82 | js = re.sub("_.{0,5}\.innerHTML='';", "", js) 83 | js = re.sub("_.{0,5}=.{0,5}\.firstChild\.href;", "", js) 84 | js = re.sub("var .{0,5}=.{0,5}\.match\(/https\?:\\\/\\\//\)\[0\];", _2b[0] + '"http://";', js) 85 | js = re.sub("_.{0,5}=.{0,5}\.substr\(.{0,5}\.length\)\.toLowerCase\(\);", "", js) 86 | return js 87 | 88 | def second_decryption(self, second_js): 89 | """ 90 | 把第二层js准换成本地可以运行的js 91 | !!!此处可能会出错!!! 92 | :param second_js: 第一次解密的js 93 | :return: __jsl_clearance的值 94 | """ 95 | # 转义字符 96 | js = second_js.replace('\\\\', '\\') 97 | 98 | # 切割 99 | js = 'cookie' + js.split('document.cookie')[1] 100 | js = js.split('GMT;Path=/;')[0] + "'" 101 | 102 | if re.findall("(var .{0,5}=)document\.createElement\('div'\);", js): 103 | js = self.replace_url(js) 104 | 105 | # 替换可能出现的window 106 | js = self.regex(js) 107 | 108 | s = """ 109 | function cook() { 110 | %s 111 | return cookie 112 | } 113 | """ 114 | new_js = s % js 115 | ctx = execjs.compile(new_js) 116 | # 切割获得的__jsl_clearance 117 | jsl = ctx.call('cook') 118 | jsl = jsl.split(';')[0] 119 | jsl_clearance = jsl.split('=')[1] 120 | return jsl_clearance 121 | 122 | def get_first_JSESSIONID(self, jsluid, jsl_clearance): 123 | """ 124 | 带cookies访问,测试拿到的是否正确 125 | :param jsluid:cookies中的参数 126 | :param jsl_clearance: cookies中的参数 127 | :return: 128 | """ 129 | headers = self.headers.copy() 130 | headers['Cookie'] = f'__jsluid_h={jsluid}; __jsl_clearance={jsl_clearance};' 131 | response = requests.get(self.url, headers=headers) 132 | JSESSIONID = re.findall('JSESSIONID=(.*?);', response.headers['Set-Cookie'])[0] 133 | return JSESSIONID 134 | 135 | def get_JSESSIONID(self, jsluid, jsl_clearance, JSESSIONID): 136 | """ 137 | 每次请求都更换JSESSIONID 138 | :param jsluid: 139 | :param jsl_clearance: 140 | :param JSESSIONID: 141 | :return: 142 | """ 143 | url = 'http://www.gsxt.gov.cn/SearchItemCaptcha?t=' + str(int(time.time()*1000)) 144 | headers = self.headers.copy() 145 | headers['Cookie'] = f'__jsluid_h={jsluid}; __jsl_clearance={jsl_clearance};JSESSIONID={JSESSIONID}' 146 | response = requests.get(url, headers=headers) 147 | JSESSIONID = re.findall('JSESSIONID=(.*?);', response.headers['Set-Cookie'])[0] 148 | return JSESSIONID 149 | 150 | def test_cookies(self, jsluid, jsl_clearance, JSESSIONID): 151 | """ 152 | 带cookies访问,测试拿到的是否正确 153 | :param jsluid:cookies中的参数 154 | :param jsl_clearance: cookies中的参数 155 | :return: 156 | """ 157 | headers = self.headers.copy() 158 | headers['Cookie'] = f'__jsluid_h={jsluid}; __jsl_clearance={jsl_clearance};JSESSIONID={JSESSIONID}' 159 | response = requests.get(self.test_url, headers=headers) 160 | print(response.text) 161 | return response.status_code 162 | 163 | def run(self): 164 | while True: 165 | first_js, jsluid = self.acquire_js() 166 | second_js = self.first_decryption(first_js) 167 | try: 168 | jsl_clearance = self.second_decryption(second_js) 169 | except: 170 | print(second_js) 171 | continue 172 | else: 173 | JSESSIONID = self.get_first_JSESSIONID(jsluid, jsl_clearance) 174 | JSESSIONID = self.get_JSESSIONID(jsluid, jsl_clearance, JSESSIONID) 175 | code = self.test_cookies(jsluid, jsl_clearance, JSESSIONID) 176 | if code == 200: 177 | return jsluid, jsl_clearance, JSESSIONID 178 | else: 179 | print(code) 180 | print(second_js) 181 | continue 182 | 183 | def run1(self): 184 | 185 | first_js, jsluid = self.acquire_js() 186 | second_js = self.first_decryption(first_js) 187 | jsl_clearance = self.second_decryption(second_js) 188 | print(jsluid, jsl_clearance) 189 | JSESSIONID = self.get_first_JSESSIONID(jsluid, jsl_clearance) 190 | print(JSESSIONID) 191 | JSESSIONID = self.get_JSESSIONID(jsluid, jsl_clearance, JSESSIONID) 192 | code = self.test_cookies(jsluid, jsl_clearance, JSESSIONID) 193 | print(code) 194 | 195 | 196 | if __name__ == '__main__': 197 | url = "http://www.gsxt.gov.cn/index.html" 198 | test_url = "http://www.gsxt.gov.cn/corp-query-entprise-info-hot-search-list.html?province=100000" 199 | 200 | ck = Crack(url, test_url) 201 | jsluid, jsl_clearance, JSESSIONID = ck.run() 202 | print('__jsluid_h:', jsluid) 203 | print('__jsl_clearance:', jsl_clearance) 204 | print('JSESSIONID:', JSESSIONID) 205 | -------------------------------------------------------------------------------- /old_code/demo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # -*- coding: utf-8 -*- 4 | 5 | """ 6 | @author: jiajia 7 | @file: demo.py 8 | @time: 2020/7/28 11:21 9 | """ 10 | 11 | import re 12 | 13 | import execjs 14 | import requests 15 | from requests.utils import dict_from_cookiejar 16 | 17 | headers = { 18 | "User-Agent": "Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36" 19 | } 20 | r = requests.get('http://www.gsxt.gov.cn/index.html', headers=headers) 21 | cookie = dict_from_cookiejar(r.cookies) 22 | print(cookie) 23 | js = 'function jsl(){window = {navigator: {userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Geck' \ 24 | 'o) Chrome/83.0.4103.116 Safari/537.36"},outerWidth: 1920,outerHeight: 1050,};location = {reload:function () {' \ 25 | '}};document = {};' + re.findall('', r.text)[0] + ';return document.cookie}' 26 | print(js) 27 | ctx = execjs.compile(js) 28 | jsl_cookie = ctx.call('jsl') 29 | jsl_cookie = re.findall('=(.*?);', jsl_cookie)[0] 30 | cookie.update({"__jsl_clearance": jsl_cookie}) 31 | r = requests.get('http://www.gsxt.gov.cn/index.html', headers=headers, cookies=cookie) 32 | print(r.text) -------------------------------------------------------------------------------- /old_code/wc_js.js: -------------------------------------------------------------------------------- 1 | function get_z(x, y){ 2 | f = function(x, y) { 3 | var a = 0, 4 | b = 0, 5 | c = 0; 6 | x = x.split(""); 7 | y = y || 99; 8 | while ((a = x.shift()) && (b = a.charCodeAt(0) - 77.5)) c = (Math.abs(b) < 13 ? (b + 48.5) : parseInt(a, 36)) + y * c; 9 | return c 10 | }; 11 | x = x.replace(/@*$/,"").split("@"); 12 | z = f(y.match(/\w/g).sort(function(x, y) { 13 | return f(x) - f(y) 14 | }).pop()); 15 | return [x,y,z] 16 | 17 | } 18 | 19 | function get_js(x, y, z){ 20 | f = function(x, y) { 21 | var a = 0, 22 | b = 0, 23 | c = 0; 24 | x = x.split(""); 25 | y = y || 99; 26 | while ((a = x.shift()) && (b = a.charCodeAt(0) - 77.5)) c = (Math.abs(b) < 13 ? (b + 48.5) : parseInt(a, 36)) + y * c; 27 | return c 28 | }; 29 | x = eval(x); 30 | z = z +1; 31 | p = y.replace(/\b\w+\b/g, 32 | function(y) { 33 | return x[f(y, z) - 1] || ("_" + y) 34 | }); 35 | return p 36 | 37 | } 38 | 39 | 40 | function once_js(x, y) { 41 | f = function(x, y) { 42 | var a = 0, 43 | b = 0, 44 | c = 0; 45 | x = x.split(""); 46 | y = y || 99; 47 | while ((a = x.shift()) && (b = a.charCodeAt(0) - 77.5)) c = (Math.abs(b) < 13 ? (b + 48.5) : parseInt(a, 36)) + y * c; 48 | return c 49 | }, 50 | x = x.replace(/@*$/,"").split("@"); 51 | z = f(y.match(/\w/g).sort(function(x, y) { 52 | return f(x) - f(y) 53 | }).pop()); 54 | while (z++) try { 55 | g = y.replace(/\b\w+\b/g, 56 | function(y) { 57 | return x[f(y, z) - 1] || ("_" + y) 58 | }); 59 | return g 60 | } catch(_) {} 61 | } 62 | 63 | 64 | function demo() { 65 | return 123; 66 | 67 | } -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.20.0 2 | PyExecJS==1.5.1 --------------------------------------------------------------------------------