diff options
| author | 2025-03-10 03:44:57 -0400 | |
|---|---|---|
| committer | 2025-03-10 03:44:57 -0400 | |
| commit | 243d1f1beb4e4eb75a524f1aff948c47761a4f1d (patch) | |
| tree | 54f7ada7698d946f410500ad14f62798ca646956 /gallery_dl/util.py | |
| parent | 889c7b8caec8fc0b9c7a583ed1d9cfa43518fc42 (diff) | |
New upstream version 1.29.1.upstream/1.29.1
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: |
