aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/util.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-03-10 03:44:57 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2025-03-10 03:44:57 -0400
commit243d1f1beb4e4eb75a524f1aff948c47761a4f1d (patch)
tree54f7ada7698d946f410500ad14f62798ca646956 /gallery_dl/util.py
parent889c7b8caec8fc0b9c7a583ed1d9cfa43518fc42 (diff)
New upstream version 1.29.1.upstream/1.29.1
Diffstat (limited to 'gallery_dl/util.py')
-rw-r--r--gallery_dl/util.py38
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: