Important bugfix in javascript parser
This commit is contained in:
parent
490a68982a
commit
a5ef80d78b
4 changed files with 56 additions and 10 deletions
|
@ -4,12 +4,12 @@ import logging
|
||||||
import lxml.html
|
import lxml.html
|
||||||
from requests import Response
|
from requests import Response
|
||||||
from cloudscraper import CloudScraper
|
from cloudscraper import CloudScraper
|
||||||
from typing import Optional, Union
|
from typing import Optional, Union, Dict
|
||||||
|
|
||||||
from . import atjsparse
|
from . import atjsparse
|
||||||
from .aterrors import CredentialsError, CloudflareError
|
from .aterrors import CredentialsError, CloudflareError
|
||||||
|
|
||||||
REQUA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Goanna/4.8 Firefox/68.0 PaleMoon/29.4.0.2'
|
REQUA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 OPR/85.0.4341.47'
|
||||||
|
|
||||||
class AternosConnect:
|
class AternosConnect:
|
||||||
|
|
||||||
|
@ -86,13 +86,29 @@ class AternosConnect:
|
||||||
num //= base
|
num //= base
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def add_headers(self, headers:Optional[Dict[str,str]]=None):
|
||||||
|
|
||||||
|
headers = headers or {}
|
||||||
|
headers.update({
|
||||||
|
'host': 'aternos.org',
|
||||||
|
'user-agent': REQUA,
|
||||||
|
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Opera";v="86"',
|
||||||
|
'sec-ch-ua-mobile': '?0',
|
||||||
|
'sec-ch-ua-platform': '"Linux"',
|
||||||
|
'sec-fetch-dest': 'document',
|
||||||
|
'sec-fetch-mode': 'navigate',
|
||||||
|
'sec-fetch-site': 'same-origin',
|
||||||
|
'sec-fetch-user': '?1',
|
||||||
|
'upgrade-insecure-requests': '1'
|
||||||
|
})
|
||||||
|
|
||||||
def request_cloudflare(
|
def request_cloudflare(
|
||||||
self, url:str, method:str,
|
self, url:str, method:str,
|
||||||
params:Optional[dict]=None, data:Optional[dict]=None,
|
params:Optional[dict]=None, data:Optional[dict]=None,
|
||||||
headers:Optional[dict]=None, reqcookies:Optional[dict]=None,
|
headers:Optional[dict]=None, reqcookies:Optional[dict]=None,
|
||||||
sendtoken:bool=False, redirect:bool=True, retry:int=0) -> Response:
|
sendtoken:bool=False, redirect:bool=True, retry:int=0) -> Response:
|
||||||
|
|
||||||
if retry > 2:
|
if retry > 3:
|
||||||
raise CloudflareError('Unable to bypass Cloudflare protection')
|
raise CloudflareError('Unable to bypass Cloudflare protection')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -105,9 +121,8 @@ class AternosConnect:
|
||||||
|
|
||||||
params = params or {}
|
params = params or {}
|
||||||
data = data or {}
|
data = data or {}
|
||||||
headers = headers or {}
|
|
||||||
reqcookies = reqcookies or {}
|
reqcookies = reqcookies or {}
|
||||||
headers['User-Agent'] = REQUA
|
self.add_headers(headers)
|
||||||
|
|
||||||
if sendtoken:
|
if sendtoken:
|
||||||
params['TOKEN'] = self.token
|
params['TOKEN'] = self.token
|
||||||
|
@ -143,7 +158,8 @@ class AternosConnect:
|
||||||
url, method,
|
url, method,
|
||||||
params, data,
|
params, data,
|
||||||
headers, reqcookies,
|
headers, reqcookies,
|
||||||
sendtoken, redirect
|
sendtoken, redirect,
|
||||||
|
retry - 1
|
||||||
)
|
)
|
||||||
|
|
||||||
logging.info(
|
logging.info(
|
||||||
|
|
|
@ -20,5 +20,10 @@ def atob(s:str) -> str:
|
||||||
|
|
||||||
def exec(f:str) -> Any:
|
def exec(f:str) -> Any:
|
||||||
ctx = js2py.EvalJs({'atob': atob})
|
ctx = js2py.EvalJs({'atob': atob})
|
||||||
|
ctx.execute('window.document = { };')
|
||||||
|
ctx.execute('window.Map = function(_i){ };')
|
||||||
|
ctx.execute('window.setTimeout = function(_f,_t){ };')
|
||||||
|
ctx.execute('window.setInterval = function(_f,_t){ };')
|
||||||
|
ctx.execute('window.encodeURIComponent = function(_s){ };')
|
||||||
ctx.execute(to_ecma5_function(f))
|
ctx.execute(to_ecma5_function(f))
|
||||||
return ctx
|
return ctx
|
||||||
|
|
|
@ -27,10 +27,12 @@ class TestJs2Py(unittest.TestCase):
|
||||||
'CuUcmZ27Fb8bVBNw12Vj',
|
'CuUcmZ27Fb8bVBNw12Vj',
|
||||||
'YPPe8Ph7vzYaZ9PF9oQP',
|
'YPPe8Ph7vzYaZ9PF9oQP',
|
||||||
'UfLlemvKEE16ltk0hZNM',
|
'UfLlemvKEE16ltk0hZNM',
|
||||||
'q6pYdP6r7xiVHhbotvlN',
|
'S1Oban9UGRXVIepREw9q',
|
||||||
'q6pYdP6r7xiVHhbotvlN',
|
'S1Oban9UGRXVIepREw9q',
|
||||||
'XAIbksgkVX9JYboMDI7D',
|
'KYDDyT1DWOJTZpNtJWhM',
|
||||||
'sBImgVg6RL98W1khPYMl'
|
'lZPFwRqIGIf8JKk1LG02',
|
||||||
|
'KbxzYCJUrFjWzbeZcAmE',
|
||||||
|
'KbxzYCJUrFjWzbeZcAmE'
|
||||||
]
|
]
|
||||||
|
|
||||||
def test_base64(self) -> None:
|
def test_base64(self) -> None:
|
||||||
|
@ -45,6 +47,27 @@ class TestJs2Py(unittest.TestCase):
|
||||||
f = atjsparse.to_ecma5_function(token)
|
f = atjsparse.to_ecma5_function(token)
|
||||||
self.assertEqual(f, '(function(){window["AJAX_TOKEN"]=("2r" + "KO" + "A1" + "IFdBcHhEM" + "61" + "6cb");})()')
|
self.assertEqual(f, '(function(){window["AJAX_TOKEN"]=("2r" + "KO" + "A1" + "IFdBcHhEM" + "61" + "6cb");})()')
|
||||||
|
|
||||||
|
def test_ecma6parse(self) -> None:
|
||||||
|
|
||||||
|
code = '''
|
||||||
|
window.t0 =
|
||||||
|
window['document']&&
|
||||||
|
!window[["p","Ma"].reverse().join('')]||
|
||||||
|
!window[["ut","meo","i","etT","s"].reverse().join('')];'''
|
||||||
|
|
||||||
|
part1 = '''window.t1 = Boolean(window['document']);'''
|
||||||
|
part2 = '''window.t2 = Boolean(!window[["p","Ma"].reverse().join('')]);'''
|
||||||
|
part3 = '''window.t3 = Boolean(!window[["ut","meo","i","etT","s"].reverse().join('')]);'''
|
||||||
|
|
||||||
|
ctx0 = atjsparse.exec(code)
|
||||||
|
ctx1 = atjsparse.exec(part1)
|
||||||
|
ctx2 = atjsparse.exec(part2)
|
||||||
|
ctx3 = atjsparse.exec(part3)
|
||||||
|
|
||||||
|
self.assertEqual(ctx1.window['t1'], True)
|
||||||
|
self.assertEqual(ctx2.window['t2'], False)
|
||||||
|
self.assertEqual(ctx3.window['t3'], False)
|
||||||
|
|
||||||
def test_exec(self) -> None:
|
def test_exec(self) -> None:
|
||||||
|
|
||||||
for i, f in enumerate(self.tests):
|
for i, f in enumerate(self.tests):
|
||||||
|
|
|
@ -15,3 +15,5 @@
|
||||||
(() => {window["AJAX_TOKEN"]=window['document']&&window["Map"]&&window[["out","e","Tim","et","s"].reverse().join('')]?["pREw9q","XVIe","UGR","S1Oban9"].reverse().join(''):["dYp6q","Vix7r6P","tobhH","Nlv"].map(s => s.split('').reverse().join('')).join('');})();
|
(() => {window["AJAX_TOKEN"]=window['document']&&window["Map"]&&window[["out","e","Tim","et","s"].reverse().join('')]?["pREw9q","XVIe","UGR","S1Oban9"].reverse().join(''):["dYp6q","Vix7r6P","tobhH","Nlv"].map(s => s.split('').reverse().join('')).join('');})();
|
||||||
(() => {window[["OKEN", "T", "_", "AJAX"].reverse().join("")] = window["document"] && window["Map"] && window["set" + "T" + "im" + "e" + "o" + "u" + "t"] ? ["DYK", "OWD1TyD", "TJ", "JtNpZ", "MhW"].map((s) => s.split("").reverse().join("")).join("") : "XAIbksgkVX9JYboMDI7D";})();
|
(() => {window[["OKEN", "T", "_", "AJAX"].reverse().join("")] = window["document"] && window["Map"] && window["set" + "T" + "im" + "e" + "o" + "u" + "t"] ? ["DYK", "OWD1TyD", "TJ", "JtNpZ", "MhW"].map((s) => s.split("").reverse().join("")).join("") : "XAIbksgkVX9JYboMDI7D";})();
|
||||||
(() => {window[["XAJA","T_","NEKO"].map(s => s.split('').reverse().join('')).join('')]=window['document']&&window[["ap","M"].reverse().join('')]&&window[["es","iTt","oem","u","t"].map(s => s.split('').reverse().join('')).join('')]?["Kk1LG02","If8J","lZPFwRqIG"].reverse().join(''):("sBI" + "mgV" + "g6RL98W1" + "khPY" + "Ml");})();
|
(() => {window[["XAJA","T_","NEKO"].map(s => s.split('').reverse().join('')).join('')]=window['document']&&window[["ap","M"].reverse().join('')]&&window[["es","iTt","oem","u","t"].map(s => s.split('').reverse().join('')).join('')]?["Kk1LG02","If8J","lZPFwRqIG"].reverse().join(''):("sBI" + "mgV" + "g6RL98W1" + "khPY" + "Ml");})();
|
||||||
|
(() => {window[["N","KE","_TO","X","JA","A"].reverse().join('')]=window['document']&&!window[["p","Ma"].reverse().join('')]||!window[["ut","meo","i","etT","s"].reverse().join('')]?("1UY5" + "1inS" + "kzlSO" + "QmKU0mK"):"KbxzYCJUrFjWzbeZcAmE";})();
|
||||||
|
(() => {window[["EN", "TOK", "AJAX_"].reverse().join('')] = window['document'] && window["Map"] && window[("s" + "et" + "Tim" + "e" + "o" + "ut")] ? "KbxzYCJUrFjWzbeZcAmE" : ["mK", "SOQmKU0", "zl", "1inSk", "1UY5"].reverse().join('');})();
|
||||||
|
|
Reference in a new issue