From: krrr Date: Sat, 30 Apr 2022 03:20:04 +0000 (+0800) Subject: Add new option to avoid cloudflare captcha X-Git-Tag: 0.4.17~2^2 X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=5a4dfb8a76f6b99a929df10c90865146c59717f8;p=nhentai.git Add new option to avoid cloudflare captcha --- 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.') + exit(0) + elif args.useragent is not None: + constant.CONFIG['useragent'] = args.useragent write_config() + logger.info('Useragent saved.') exit(0) - - if args.language is not None: + elif args.language is not None: constant.CONFIG['language'] = args.language - logger.info('Default language now set to \'{0}\''.format(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]))