mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[youtube] Simplify two-factor authentication
This commit is contained in:
		| @@ -33,6 +33,7 @@ from ..utils import ( | |||||||
|     int_or_none, |     int_or_none, | ||||||
|     orderedSet, |     orderedSet, | ||||||
|     parse_duration, |     parse_duration, | ||||||
|  |     remove_start, | ||||||
|     smuggle_url, |     smuggle_url, | ||||||
|     str_to_int, |     str_to_int, | ||||||
|     unescapeHTML, |     unescapeHTML, | ||||||
| @@ -129,35 +130,23 @@ class YoutubeBaseInfoExtractor(InfoExtractor): | |||||||
|         # TODO add SMS and phone call support - these require making a request and then prompting the user |         # TODO add SMS and phone call support - these require making a request and then prompting the user | ||||||
|  |  | ||||||
|         if re.search(r'(?i)<form[^>]* id="challenge"', login_results) is not None: |         if re.search(r'(?i)<form[^>]* id="challenge"', login_results) is not None: | ||||||
|             tfa_code = self._get_tfa_info() |             tfa_code = self._get_tfa_info('2-step verification code') | ||||||
|  |  | ||||||
|             if tfa_code is None: |             if not tfa_code: | ||||||
|                 self._downloader.report_warning('Two-factor authentication required. Provide it with --twofactor <code>') |                 self._downloader.report_warning( | ||||||
|                 self._downloader.report_warning('(Note that only TOTP (Google Authenticator App) codes work at this time.)') |                     'Two-factor authentication required. Provide it either interactively or with --twofactor <code>' | ||||||
|  |                     '(Note that only TOTP (Google Authenticator App) codes work at this time.)') | ||||||
|                 return False |                 return False | ||||||
|  |  | ||||||
|             def find_value(element_id): |             tfa_code = remove_start(tfa_code, 'G-') | ||||||
|                 match = re.search(r'id="%s"\s+value="(.+?)">' % element_id, login_results, re.M | re.U) |  | ||||||
|                 if match is None: |  | ||||||
|                     self._downloader.report_warning('Failed to get %s - did the page structure change?' % id) |  | ||||||
|                 return match.group(1) |  | ||||||
|  |  | ||||||
|             challengeId = find_value('challengeId') |             tfa_form_strs = self._form_hidden_inputs('challenge', login_results) | ||||||
|             challengeType = find_value('challengeType') |  | ||||||
|             gxf = find_value('gxf') |  | ||||||
|  |  | ||||||
|             tfa_form_strs = { |             tfa_form_strs.update({ | ||||||
|                 'challengeId': challengeId, |  | ||||||
|                 'challengeType': challengeType,  # This doesn't appear to change |  | ||||||
|                 'continue': 'https://www.youtube.com/signin?action_handle_signin=true&feature=sign_in_button&hl=en_US&nomobiletemp=1', |  | ||||||
|                 'service': 'youtube', |  | ||||||
|                 'hl': 'en_US', |  | ||||||
|                 'checkedDomains': 'youtube', |  | ||||||
|                 'pstMsg': '0', |  | ||||||
|                 'gxf': gxf, |  | ||||||
|                 'Pin': tfa_code, |                 'Pin': tfa_code, | ||||||
|                 'TrustDevice': 'on', |                 'TrustDevice': 'on', | ||||||
|             } |             }) | ||||||
|  |  | ||||||
|             tfa_form = dict((k.encode('utf-8'), v.encode('utf-8')) for k, v in tfa_form_strs.items()) |             tfa_form = dict((k.encode('utf-8'), v.encode('utf-8')) for k, v in tfa_form_strs.items()) | ||||||
|             tfa_data = compat_urllib_parse.urlencode(tfa_form).encode('ascii') |             tfa_data = compat_urllib_parse.urlencode(tfa_form).encode('ascii') | ||||||
|  |  | ||||||
| @@ -170,7 +159,7 @@ class YoutubeBaseInfoExtractor(InfoExtractor): | |||||||
|                 return False |                 return False | ||||||
|  |  | ||||||
|             if re.search(r'(?i)<form[^>]* id="challenge"', tfa_results) is not None: |             if re.search(r'(?i)<form[^>]* id="challenge"', tfa_results) is not None: | ||||||
|                 self._downloader.report_warning('Two-factor code expired. Please try again, or use a one-use backup code instead.') |                 self._downloader.report_warning('Two-factor code expired or invalid. Please try again, or use a one-use backup code instead.') | ||||||
|                 return False |                 return False | ||||||
|             if re.search(r'(?i)<form[^>]* id="gaia_loginform"', tfa_results) is not None: |             if re.search(r'(?i)<form[^>]* id="gaia_loginform"', tfa_results) is not None: | ||||||
|                 self._downloader.report_warning('unable to log in - did the page structure change?') |                 self._downloader.report_warning('unable to log in - did the page structure change?') | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user