65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
import random
|
|
import time
|
|
from . import enc
|
|
from base64 import urlsafe_b64encode as b64enc
|
|
from urllib.parse import quote
|
|
|
|
|
|
def _header(video_id) -> str:
|
|
return b64enc(enc.rs(1, enc.rs(1, enc.rs(1, video_id))) + enc.nm(4, 1))
|
|
|
|
|
|
def _build(video_id, ts1, ts2, ts3, ts4, ts5, topchat_only) -> str:
|
|
chattype = 4 if topchat_only else 1
|
|
|
|
b1 = enc.nm(1, 0)
|
|
b2 = enc.nm(2, 0)
|
|
b3 = enc.nm(3, 0)
|
|
b4 = enc.nm(4, 0)
|
|
b7 = enc.rs(7, '')
|
|
b8 = enc.nm(8, 0)
|
|
b9 = enc.rs(9, '')
|
|
timestamp2 = enc.nm(10, ts2)
|
|
b11 = enc.nm(11, 3)
|
|
b15 = enc.nm(15, 0)
|
|
|
|
header = enc.rs(3, _header(video_id))
|
|
timestamp1 = enc.nm(5, ts1)
|
|
s6 = enc.nm(6, 0)
|
|
s7 = enc.nm(7, 0)
|
|
s8 = enc.nm(8, 1)
|
|
body = enc.rs(9, b''.join(
|
|
(b1, b2, b3, b4, b7, b8, b9, timestamp2, b11, b15)))
|
|
timestamp3 = enc.nm(10, ts3)
|
|
timestamp4 = enc.nm(11, ts4)
|
|
s13 = enc.nm(13, chattype)
|
|
chattype = enc.rs(16, enc.nm(1, chattype))
|
|
s17 = enc.nm(17, 0)
|
|
str19 = enc.rs(19, enc.nm(1, 0))
|
|
timestamp5 = enc.nm(20, ts5)
|
|
entity = b''.join((header, timestamp1, s6, s7, s8, body, timestamp3,
|
|
timestamp4, s13, chattype, s17, str19, timestamp5))
|
|
continuation = enc.rs(119693434, entity)
|
|
return quote(b64enc(continuation).decode())
|
|
|
|
|
|
def _times(past_sec):
|
|
n = int(time.time())
|
|
_ts1 = n - random.uniform(0, 1 * 3)
|
|
_ts2 = n - random.uniform(0.01, 0.99)
|
|
_ts3 = n - past_sec + random.uniform(0, 1)
|
|
_ts4 = n - random.uniform(10 * 60, 60 * 60)
|
|
_ts5 = n - random.uniform(0.01, 0.99)
|
|
return list(map(lambda x: int(x * 1000000), [_ts1, _ts2, _ts3, _ts4, _ts5]))
|
|
|
|
|
|
def getparam(video_id, past_sec=0, topchat_only=False) -> str:
|
|
'''
|
|
Parameter
|
|
---------
|
|
past_sec : int
|
|
seconds to load past chat data
|
|
topchat_only : bool
|
|
if True, fetch only 'top chat'
|
|
'''
|
|
return _build(video_id, *_times(past_sec), topchat_only) |