- def construct_video_urls(self, data, video_id, _uuid, bid):
- def do_xor(x, y):
- a = y % 3
- if a == 1:
- return x ^ 121
- if a == 2:
- return x ^ 72
- return x ^ 103
-
- def get_encode_code(l):
- a = 0
- b = l.split('-')
- c = len(b)
- s = ''
- for i in range(c - 1, -1, -1):
- a = do_xor(int(b[c - i - 1], 16), i)
- s += chr(a)
- return s[::-1]
-
- def get_path_key(x):
- mg = ')(*&^flash@#$%a'
- tm = self._download_json(
- 'http://data.video.qiyi.com/t?tn=' + str(random.random()), video_id)['t']
- t = str(int(math.floor(int(tm) / (600.0))))
- return hashlib.md5((t + mg + x).encode('utf8')).hexdigest()
-
- # get accept format
- # getting all format will spend minutes for a big video.
- if bid == 'best':
- bids = [int(i['bid']) for i in data['vp']['tkl'][0]['vs']
- if 0 < int(i['bid']) <= 10]
- bid = str(max(bids))
-
- video_urls_dict = {}
- for i in data['vp']['tkl'][0]['vs']:
- if 0 < int(i['bid']) <= 10:
- format_id = self.get_format(i['bid'])
- else:
- continue
-
- video_urls = []
-
- video_urls_info = i['fs']
- if not i['fs'][0]['l'].startswith('/'):
- t = get_encode_code(i['fs'][0]['l'])
- if t.endswith('mp4'):
- video_urls_info = i['flvs']
-
- if int(i['bid']) != int(bid): # ignore missing match format
- video_urls.extend(
- [('http://example.com/v.flv', ii['b']) for ii in video_urls_info])
- video_urls_dict[format_id] = video_urls
- continue
-
- for ii in video_urls_info:
- vl = ii['l']
- if not vl.startswith('/'):
- vl = get_encode_code(vl)
- key = get_path_key(
- vl.split('/')[-1].split('.')[0])
- filesize = ii['b']
- base_url = data['vp']['du'].split('/')
- base_url.insert(-1, key)
- base_url = '/'.join(base_url)
- param = {
- 'su': _uuid,
- 'qyid': uuid.uuid4().hex,
- 'client': '',
- 'z': '',
- 'bt': '',
- 'ct': '',
- 'tn': str(int(time.time()))
- }
- api_video_url = base_url + vl + '?' + \
- compat_urllib_parse.urlencode(param)
- js = self._download_json(api_video_url, video_id)
- video_url = js['l']
- video_urls.append(
- (video_url, filesize))
-
- video_urls_dict[format_id] = video_urls
- return video_urls_dict
-
- def get_format(self, bid):
- _dict = {
- '1': 'h6',
- '2': 'h5',
- '3': 'h4',
- '4': 'h3',
- '5': 'h2',
- '10': 'h1'
+ def _real_initialize(self):
+ self._login()
+
+ @staticmethod
+ def _rsa_fun(data):
+ # public key extracted from http://static.iqiyi.com/js/qiyiV2/20160129180840/jobs/i18n/i18nIndex.js
+ N = 0xab86b6371b5318aaa1d3c9e612a9f1264f372323c8c0f19875b5fc3b3fd3afcc1e5bec527aa94bfa85bffc157e4245aebda05389a5357b75115ac94f074aefcd
+ e = 65537
+
+ return ohdave_rsa_encrypt(data, e, N)
+
+ def _login(self):
+ (username, password) = self._get_login_info()
+
+ # No authentication to be performed
+ if not username:
+ return True
+
+ data = self._download_json(
+ 'http://kylin.iqiyi.com/get_token', None,
+ note='Get token for logging', errnote='Unable to get token for logging')
+ sdk = data['sdk']
+ timestamp = int(time.time())
+ target = '/apis/reglogin/login.action?lang=zh_TW&area_code=null&email=%s&passwd=%s&agenttype=1&from=undefined&keeplogin=0&piccode=&fromurl=&_pos=1' % (
+ username, self._rsa_fun(password.encode('utf-8')))
+
+ interp = IqiyiSDKInterpreter(sdk)
+ sign = interp.run(target, data['ip'], timestamp)
+
+ validation_params = {
+ 'target': target,
+ 'server': 'BEA3AA1908656AABCCFF76582C4C6660',
+ 'token': data['token'],
+ 'bird_src': 'f8d91d57af224da7893dd397d52d811a',
+ 'sign': sign,
+ 'bird_t': timestamp,