weibo.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # coding: utf-8
  2. from __future__ import unicode_literals
  3. from .common import InfoExtractor
  4. from urllib.request import Request
  5. from urllib.parse import urlencode
  6. from urllib import parse
  7. import json
  8. import random as rnd
  9. from os import path
  10. class WeiboIE(InfoExtractor):
  11. _VALID_URL = r'https?://weibo\.com/[0-9]+/(?P<id>[a-zA-Z0-9]+)'
  12. _TEST = {
  13. 'url': 'https://weibo.com/6275294458/Fp6RGfbff?type=comment',
  14. 'info_dict': {
  15. 'id': 'Fp6RGfbff',
  16. 'ext': 'mp4',
  17. 'title': 'You should have servants to massage you,... 来自Hosico_猫 - 微博',
  18. }
  19. }
  20. def _real_extract(self, url):
  21. video_id = self._match_id(url)
  22. headers = {
  23. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  24. 'Accept-Encoding': 'gzip, deflate, br',
  25. 'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8',
  26. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
  27. 'Upgrade-Insecure-Requests': '1',
  28. }
  29. # to get Referer url for genvisitor
  30. webpage,urlh = self._download_webpage_handle(url, video_id, headers=headers, note="first visit the page")
  31. visitor_url = urlh.geturl()
  32. data = urlencode({
  33. "cb": "gen_callback",
  34. "fp": '{"os":"2","browser":"Gecko57,0,0,0","fonts":"undefined","screenInfo":"1440*900*24","plugins":""}',
  35. }).encode()
  36. headers = {
  37. 'Accept-Encoding': 'gzip, deflate, br',
  38. 'Accept': '*/*',
  39. 'Referer': visitor_url,
  40. }
  41. r_genvisitor = Request(
  42. 'https://passport.weibo.com/visitor/genvisitor',
  43. data = data,
  44. headers = headers,
  45. method = 'POST'
  46. )
  47. webpage,urlh = self._download_webpage_handle(r_genvisitor, video_id, note="gen visitor")
  48. print("webpage", webpage)
  49. p = webpage.split("&&")[1] # split "gen_callback && gen_callback(...)"
  50. i1 = p.find('{')
  51. i2 = p.rfind('}')
  52. j = p[i1:i2+1] # get JSON object
  53. d = json.loads(j)
  54. tid = d["data"]["tid"]
  55. cnfd = "%03d" % d["data"]["confidence"]
  56. param = urlencode({
  57. 'a': 'incarnate',
  58. 't': tid,
  59. 'w': 2,
  60. 'c': cnfd,
  61. 'cb': 'cross_domain',
  62. 'from': 'weibo',
  63. '_rand': rnd.random()
  64. })
  65. gencallback_url = "https://passport.weibo.com/visitor/visitor?" + param
  66. webpage,urlh = self._download_webpage_handle(gencallback_url, video_id, note="gen callback")
  67. webpage,urlh = self._download_webpage_handle(url, video_id, headers=headers, note="retry to visit the page")
  68. # TODO more code goes here, for example ...
  69. title = self._html_search_regex(r'<title>(.+?)</title>', webpage, 'title')
  70. video_sources_text = self._search_regex("video-sources=\\\\\"(.+?)\"", webpage, 'video_sources')
  71. video_formats = parse.parse_qs(video_sources_text)
  72. formats = []
  73. supported_resolutions = ['720', '480']
  74. for res in supported_resolutions:
  75. f = video_formats.get(res)
  76. if isinstance(f, list):
  77. if len(f) > 0:
  78. vid_url = f[0]
  79. print("%s:%s" % (res, vid_url))
  80. formats.append({
  81. 'url': vid_url
  82. })
  83. self._sort_formats(formats)
  84. uploader = self._og_search_property('nick-name', webpage, 'uploader', default = None)
  85. print(title, uploader)
  86. return {
  87. 'id': video_id,
  88. 'title': title,
  89. 'uploader': uploader,
  90. 'formats': formats
  91. # TODO more properties (see youtube_dl/extractor/common.py)
  92. }