diff options
Diffstat (limited to 'gallery_dl/util.py')
| -rw-r--r-- | gallery_dl/util.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gallery_dl/util.py b/gallery_dl/util.py index 7034c0c..06a580b 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -48,6 +48,19 @@ def bdecode(data, alphabet="0123456789"): return num +def decrypt_xor(encrypted, key, base64=True, fromhex=False): + if base64: + encrypted = binascii.a2b_base64(encrypted) + if fromhex: + encrypted = bytes.fromhex(encrypted.decode()) + + div = len(key) + return bytes([ + encrypted[i] ^ key[i % div] + for i in range(len(encrypted)) + ]).decode() + + def advance(iterable, num): """"Advance 'iterable' by 'num' steps""" iterator = iter(iterable) @@ -356,6 +369,31 @@ def extract_headers(response): return data +def detect_challenge(response): + server = response.headers.get("server") + if not server: + return + + elif server.startswith("cloudflare"): + if response.status_code not in (403, 503): + return + + mitigated = response.headers.get("cf-mitigated") + if mitigated and mitigated.lower() == "challenge": + return "Cloudflare challenge" + + content = response.content + if b"_cf_chl_opt" in content or b"jschl-answer" in content: + return "Cloudflare challenge" + elif b'name="captcha-bypass"' in content: + return "Cloudflare CAPTCHA" + + elif server.startswith("ddos-guard"): + if response.status_code == 403 and \ + b"/ddos-guard/js-challenge/" in response.content: + return "DDoS-Guard challenge" + + @functools.lru_cache(maxsize=None) def git_head(): try: |
