From 5a4dfb8a76f6b99a929df10c90865146c59717f8 Mon Sep 17 00:00:00 2001
From: krrr <guogaishiwo@gmail.com>
Date: Sat, 30 Apr 2022 11:20:04 +0800
Subject: [PATCH] Add new option to avoid cloudflare captcha

---
 README.rst          |  2 +-
 nhentai/cmdline.py  | 20 +++++++++++++-------
 nhentai/command.py  |  3 ---
 nhentai/constant.py |  1 +
 nhentai/utils.py    | 12 ++++++++----
 5 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/README.rst b/README.rst
index 49e729d..86bb769 100644
--- a/README.rst
+++ b/README.rst
@@ -72,7 +72,7 @@ Set your nhentai cookie against captcha:
 
     nhentai --cookie "YOUR COOKIE FROM nhentai.net"
 
-**NOTE**: The format of the cookie is `"csrftoken=TOKEN; sessionid=ID"`
+**NOTE**: The format of the cookie is `"csrftoken=TOKEN; sessionid=ID; cf_chl_2=CLOUDFLARE; cf_chl_prog=CLOUDFLARE; cf_clearance=CLOUDFLARE"`
 
 | To get csrftoken and sessionid, first login to your nhentai account in web browser, then:
 | (Chrome) |ve| |ld| More tools    |ld| Developer tools     |ld| Application |ld| Storage |ld| Cookies |ld| https://nhentai.net
diff --git a/nhentai/cmdline.py b/nhentai/cmdline.py
index 6c39ceb..8cca43d 100644
--- a/nhentai/cmdline.py
+++ b/nhentai/cmdline.py
@@ -109,7 +109,9 @@ def cmd_parser():
 
     # nhentai options
     parser.add_option('--cookie', type='str', dest='cookie', action='store',
-                      help='set cookie of nhentai to bypass Google recaptcha')
+                      help='set cookie of nhentai to bypass Cloudflare captcha')
+    parser.add_option('--useragent', type='str', dest='useragent', action='store',
+                      help='set useragent to bypass Cloudflare captcha')
     parser.add_option('--language', type='str', dest='language', action='store',
                       help='set default language to parse doujinshis')
     parser.add_option('--clean-language', dest='clean_language', action='store_true', default=False,
@@ -148,20 +150,24 @@ def cmd_parser():
     # --- set config ---
     if args.cookie is not None:
         constant.CONFIG['cookie'] = args.cookie
+        write_config()
         logger.info('Cookie saved.')
-        write_config()
         exit(0)
-
-    if args.language is not None:
-        constant.CONFIG['language'] = args.language
-        logger.info('Default language now set to \'{0}\''.format(args.language))
+    elif args.useragent is not None:
+        constant.CONFIG['useragent'] = args.useragent
         write_config()
+        logger.info('Useragent saved.')
+        exit(0)
+    elif args.language is not None:
+        constant.CONFIG['language'] = args.language
+        write_config()
+        logger.info('Default language now set to \'{0}\''.format(args.language))
         exit(0)
         # TODO: search without language
 
     if args.proxy is not None:
         proxy_url = urlparse(args.proxy)
-        if not args.proxy == '' and proxy_url.scheme not in ('http', 'https'):
+        if not args.proxy == '' and proxy_url.scheme not in ('http', 'https', 'socks5', 'socks5h', 'socks4', 'socks4a'):
             logger.error('Invalid protocol \'{0}\' of proxy, ignored'.format(proxy_url.scheme))
             exit(0)
         else:
diff --git a/nhentai/command.py b/nhentai/command.py
index a6c91d0..e514144 100644
--- a/nhentai/command.py
+++ b/nhentai/command.py
@@ -93,9 +93,6 @@ def main():
                 doujinshi.downloader = downloader
                 doujinshi.download()
 
-            doujinshi.downloader = downloader
-            doujinshi.download()
-
             if options.generate_metadata:
                 table = doujinshi.table
                 generate_metadata_file(options.output_dir, table, doujinshi)
diff --git a/nhentai/constant.py b/nhentai/constant.py
index 10feab8..e100898 100644
--- a/nhentai/constant.py
+++ b/nhentai/constant.py
@@ -34,6 +34,7 @@ CONFIG = {
     'cookie': '',
     'language': '',
     'template': '',
+    'useragent': 'nhentai command line client (https://github.com/RicterZ/nhentai)'
 }
 
 LANGUAGEISO ={
diff --git a/nhentai/utils.py b/nhentai/utils.py
index e0a5b4d..8354637 100644
--- a/nhentai/utils.py
+++ b/nhentai/utils.py
@@ -17,7 +17,7 @@ def request(method, url, **kwargs):
     session = requests.Session()
     session.headers.update({
         'Referer': constant.LOGIN_URL,
-        'User-Agent': 'nhentai command line client (https://github.com/RicterZ/nhentai)',
+        'User-Agent': constant.CONFIG['useragent'],
         'Cookie': constant.CONFIG['cookie']
     })
 
@@ -28,10 +28,14 @@ def request(method, url, **kwargs):
 
 
 def check_cookie():
-    response = request('get', constant.BASE_URL).text
-    username = re.findall('"/users/\d+/(.*?)"', response)
+    response = request('get', constant.BASE_URL)
+    if response.status_code == 503 and 'cf-browser-verification' in response.text:
+        logger.error('Blocked by Cloudflare captcha, please set your cookie and useragent')
+        exit(-1)
+
+    username = re.findall('"/users/\d+/(.*?)"', response.text)
     if not username:
-        logger.error('Cannot get your username, please check your cookie or use `nhentai --cookie` to set your cookie')
+        logger.warning('Cannot get your username, please check your cookie or use `nhentai --cookie` to set your cookie')
     else:
         logger.info('Login successfully! Your username: {}'.format(username[0]))