aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/common.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/common.py')
-rw-r--r--gallery_dl/extractor/common.py80
1 files changed, 48 insertions, 32 deletions
diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py
index df70571..32c8e67 100644
--- a/gallery_dl/extractor/common.py
+++ b/gallery_dl/extractor/common.py
@@ -15,6 +15,7 @@ import sys
import time
import netrc
import queue
+import random
import getpass
import logging
import datetime
@@ -37,6 +38,7 @@ class Extractor():
archive_fmt = ""
root = ""
cookies_domain = ""
+ cookies_index = 0
referer = True
ciphers = None
tls12 = True
@@ -196,6 +198,10 @@ class Extractor():
server = response.headers.get("Server")
if server and server.startswith("cloudflare") and \
code in (403, 503):
+ mitigated = response.headers.get("cf-mitigated")
+ if mitigated and mitigated.lower() == "challenge":
+ self.log.warning("Cloudflare challenge")
+ break
content = response.content
if b"_cf_chl_opt" in content or b"jschl-answer" in content:
self.log.warning("Cloudflare challenge")
@@ -439,45 +445,55 @@ class Extractor():
cookies = self.config("cookies")
if cookies:
- if isinstance(cookies, dict):
- self.cookies_update_dict(cookies, self.cookies_domain)
+ select = self.config("cookies-select")
+ if select:
+ if select == "rotate":
+ cookies = cookies[self.cookies_index % len(cookies)]
+ Extractor.cookies_index += 1
+ else:
+ cookies = random.choice(cookies)
+ self.cookies_load(cookies)
+
+ def cookies_load(self, cookies):
+ if isinstance(cookies, dict):
+ self.cookies_update_dict(cookies, self.cookies_domain)
+
+ elif isinstance(cookies, str):
+ path = util.expand_path(cookies)
+ try:
+ with open(path) as fp:
+ util.cookiestxt_load(fp, self.cookies)
+ except Exception as exc:
+ self.log.warning("cookies: %s", exc)
+ else:
+ self.log.debug("Loading cookies from '%s'", cookies)
+ self.cookies_file = path
- elif isinstance(cookies, str):
- path = util.expand_path(cookies)
+ elif isinstance(cookies, (list, tuple)):
+ key = tuple(cookies)
+ cookiejar = _browser_cookies.get(key)
+
+ if cookiejar is None:
+ from ..cookies import load_cookies
+ cookiejar = self.cookies.__class__()
try:
- with open(path) as fp:
- util.cookiestxt_load(fp, self.cookies)
+ load_cookies(cookiejar, cookies)
except Exception as exc:
self.log.warning("cookies: %s", exc)
else:
- self.log.debug("Loading cookies from '%s'", cookies)
- self.cookies_file = path
-
- elif isinstance(cookies, (list, tuple)):
- key = tuple(cookies)
- cookiejar = _browser_cookies.get(key)
-
- if cookiejar is None:
- from ..cookies import load_cookies
- cookiejar = self.cookies.__class__()
- try:
- load_cookies(cookiejar, cookies)
- except Exception as exc:
- self.log.warning("cookies: %s", exc)
- else:
- _browser_cookies[key] = cookiejar
- else:
- self.log.debug("Using cached cookies from %s", key)
+ _browser_cookies[key] = cookiejar
+ else:
+ self.log.debug("Using cached cookies from %s", key)
- set_cookie = self.cookies.set_cookie
- for cookie in cookiejar:
- set_cookie(cookie)
+ set_cookie = self.cookies.set_cookie
+ for cookie in cookiejar:
+ set_cookie(cookie)
- else:
- self.log.warning(
- "Expected 'dict', 'list', or 'str' value for 'cookies' "
- "option, got '%s' (%s)",
- cookies.__class__.__name__, cookies)
+ else:
+ self.log.warning(
+ "Expected 'dict', 'list', or 'str' value for 'cookies' "
+ "option, got '%s' (%s)",
+ cookies.__class__.__name__, cookies)
def cookies_store(self):
"""Store the session's cookies in a cookies.txt file"""