aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/util.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-03-10 03:45:04 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2025-03-10 03:45:04 -0400
commitb4181aecfa495a0926a9c065bf54897d64b14fbc (patch)
tree1096876572bf7f51488a1a57cb9a5267e571947c /gallery_dl/util.py
parent59733b48db6fe610ee4024ce1e93d10e76538087 (diff)
parent243d1f1beb4e4eb75a524f1aff948c47761a4f1d (diff)
Update upstream source from tag 'upstream/1.29.1'
Update to upstream version '1.29.1' with Debian dir 67c32bd8f39b0155ec16fb6af065feb7f1333f75
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: