瀏覽代碼

[twitch] Add login support (#3986)

Sergey M․ 10 年之前
父節點
當前提交
04d02a9d57
共有 1 個文件被更改,包括 42 次插入0 次删除
  1. 42 0
      youtube_dl/extractor/twitch.py

+ 42 - 0
youtube_dl/extractor/twitch.py

@@ -1,3 +1,4 @@
+# coding: utf-8
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
 import itertools
 import itertools
@@ -5,6 +6,8 @@ import re
 
 
 from .common import InfoExtractor
 from .common import InfoExtractor
 from ..utils import (
 from ..utils import (
+    compat_urllib_parse,
+    compat_urllib_request,
     ExtractorError,
     ExtractorError,
     parse_iso8601,
     parse_iso8601,
 )
 )
@@ -24,6 +27,7 @@ class TwitchIE(InfoExtractor):
         """
         """
     _PAGE_LIMIT = 100
     _PAGE_LIMIT = 100
     _API_BASE = 'https://api.twitch.tv'
     _API_BASE = 'https://api.twitch.tv'
+    _LOGIN_URL = 'https://secure.twitch.tv/user/login'
     _TESTS = [{
     _TESTS = [{
         'url': 'http://www.twitch.tv/riotgames/b/577357806',
         'url': 'http://www.twitch.tv/riotgames/b/577357806',
         'info_dict': {
         'info_dict': {
@@ -109,6 +113,44 @@ class TwitchIE(InfoExtractor):
             'view_count': info['views'],
             'view_count': info['views'],
         }
         }
 
 
+    def _real_initialize(self):
+        self._login()
+
+    def _login(self):
+        (username, password) = self._get_login_info()
+        if username is None:
+            return
+
+        login_page = self._download_webpage(
+            self._LOGIN_URL, None, 'Downloading login page')
+
+        authenticity_token = self._search_regex(
+            r'<input name="authenticity_token" type="hidden" value="([^"]+)"',
+            login_page, 'authenticity token')
+
+        login_form = {
+            'utf8': '✓'.encode('utf-8'),
+            'authenticity_token': authenticity_token,
+            'redirect_on_login': '',
+            'embed_form': 'false',
+            'mp_source_action': '',
+            'follow': '',
+            'user[login]': username,
+            'user[password]': password,
+        }
+
+        request = compat_urllib_request.Request(
+            self._LOGIN_URL, compat_urllib_parse.urlencode(login_form).encode('utf-8'))
+        request.add_header('Referer', self._LOGIN_URL)
+        response = self._download_webpage(
+            request, None, 'Logging in as %s' % username)
+
+        m = re.search(
+            r"id=([\"'])login_error_message\1[^>]*>(?P<msg>[^<]+)", response)
+        if m:
+            raise ExtractorError(
+                'Unable to login: %s' % m.group('msg').strip(), expected=True)
+
     def _real_extract(self, url):
     def _real_extract(self, url):
         mobj = re.match(self._VALID_URL, url)
         mobj = re.match(self._VALID_URL, url)
         if mobj.group('chapterid'):
         if mobj.group('chapterid'):