Procházet zdrojové kódy

[vk] Workaround buggy new.vk.com Set-Cookie headers

Sergey M․ před 9 roky
rodič
revize
75ca6bcee2
1 změnil soubory, kde provedl 18 přidání a 1 odebrání
  1. 18 1
      youtube_dl/extractor/vk.py

+ 18 - 1
youtube_dl/extractor/vk.py

@@ -3,6 +3,7 @@ from __future__ import unicode_literals
 
 
 import re
 import re
 import json
 import json
+import sys
 
 
 from .common import InfoExtractor
 from .common import InfoExtractor
 from ..compat import compat_str
 from ..compat import compat_str
@@ -190,7 +191,7 @@ class VKIE(InfoExtractor):
         if username is None:
         if username is None:
             return
             return
 
 
-        login_page = self._download_webpage(
+        login_page, url_handle = self._download_webpage_handle(
             'https://vk.com', None, 'Downloading login page')
             'https://vk.com', None, 'Downloading login page')
 
 
         login_form = self._hidden_inputs(login_page)
         login_form = self._hidden_inputs(login_page)
@@ -200,6 +201,22 @@ class VKIE(InfoExtractor):
             'pass': password.encode('cp1251'),
             'pass': password.encode('cp1251'),
         })
         })
 
 
+        # https://new.vk.com/ serves two same remixlhk cookies in Set-Cookie header
+        # and expects the first one to be set rather than second (see
+        # https://github.com/rg3/youtube-dl/issues/9841#issuecomment-227871201).
+        # As of RFC6265 the newer one cookie should be set into cookie store
+        # what actually happens.
+        # We will workaround this VK issue by resetting the remixlhk cookie to
+        # the first one manually.
+        cookies = url_handle.headers.get('Set-Cookie')
+        if sys.version_info[0] >= 3:
+            cookies = cookies.encode('iso-8859-1')
+        cookies = cookies.decode('utf-8')
+        remixlhk = re.search(r'remixlhk=(.+?);.*?\bdomain=(.+?)(?:[,;]|$)', cookies)
+        if remixlhk:
+            value, domain = remixlhk.groups()
+            self._set_cookie(domain, 'remixlhk', value)
+
         request = sanitized_Request(
         request = sanitized_Request(
             'https://login.vk.com/?act=login',
             'https://login.vk.com/?act=login',
             urlencode_postdata(login_form))
             urlencode_postdata(login_form))