diff --git a/gallery_dl/cloudflare.py b/gallery_dl/cloudflare.py
index 88068d54..0f49d611 100644
--- a/gallery_dl/cloudflare.py
+++ b/gallery_dl/cloudflare.py
@@ -32,8 +32,28 @@ def solve_challenge(session, response, kwargs):
"""Solve Cloudflare challenge and get cfclearance cookie"""
parsed = urllib.parse.urlsplit(response.url)
root = parsed.scheme + "://" + parsed.netloc
-
page = response.text
+
+ cf_kwargs = {}
+ headers = cf_kwargs["headers"] = collections.OrderedDict()
+ params = cf_kwargs["data"] = collections.OrderedDict()
+ headers["Referer"] = response.url
+
+ form = text.extract(page, 'id="challenge-form"', '')[0]
+ for element in ElementTree.fromstring(
+ "" + form + "").findall("input"):
+ name = element.attrib.get("name")
+ if not name:
+ continue
+ if name == "jschl_answer":
+ try:
+ value = solve_js_challenge(page, parsed.netloc)
+ except Exception:
+ return response, None, None
+ else:
+ value = element.attrib.get("value")
+ params[name] = value
+
try:
params = {"ray": text.extract(page, '?ray=', '"')[0]}
@@ -45,25 +65,8 @@ def solve_challenge(session, response, kwargs):
except Exception:
pass
- cf_kwargs = {}
- headers = cf_kwargs["headers"] = collections.OrderedDict()
- params = cf_kwargs["data"] = collections.OrderedDict()
- url = root + text.unescape(text.extract(page, 'action="', '"')[0])
- headers["Referer"] = response.url
-
- form = text.extract(page, 'id="challenge-form"', '')[0]
- for element in ElementTree.fromstring(
- "" + form + "").findall("input"):
- name = element.attrib.get("name")
- if not name:
- continue
- if name == "jschl_answer":
- value = solve_js_challenge(page, parsed.netloc)
- else:
- value = element.attrib.get("value")
- params[name] = value
-
time.sleep(4)
+ url = root + text.unescape(text.extract(page, 'action="', '"')[0])
cf_response = session.request("POST", url, **cf_kwargs)
if cf_response.history: