├── .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 |
4 |
5 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.idea/jiasule.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
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
--------------------------------------------------------------------------------