[vk] Workaround buggy new.vk.com Set-Cookie headers
authorSergey M․ <dstftw@gmail.com>
Wed, 22 Jun 2016 21:17:13 +0000 (04:17 +0700)
committerSergey M․ <dstftw@gmail.com>
Wed, 22 Jun 2016 21:17:13 +0000 (04:17 +0700)
youtube_dl/extractor/vk.py

index 79c819bc389a09b2cd5186f64feb49d3e474d189..4e8ec0f86f5d0fed82db08b5798ce5336ee3726d 100644 (file)
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
 
 import re
 import json
+import sys
 
 from .common import InfoExtractor
 from ..compat import compat_str
@@ -190,7 +191,7 @@ class VKIE(InfoExtractor):
         if username is None:
             return
 
-        login_page = self._download_webpage(
+        login_page, url_handle = self._download_webpage_handle(
             'https://vk.com', None, 'Downloading login page')
 
         login_form = self._hidden_inputs(login_page)
@@ -200,6 +201,22 @@ class VKIE(InfoExtractor):
             '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(
             'https://login.vk.com/?act=login',
             urlencode_postdata(login_form))