mirror of
https://github.com/wbt5/real-url.git
synced 2025-07-29 21:00:30 +08:00
Compare commits
9 Commits
c0018d0fb1
...
8b7635d2fc
Author | SHA1 | Date | |
---|---|---|---|
|
8b7635d2fc | ||
|
58d4d88942 | ||
|
a81a75fa8c | ||
|
8f9141bece | ||
|
e7c495a3c3 | ||
|
73cfbc9125 | ||
|
ae088352a6 | ||
|
df10de8686 | ||
|
ccc5598774 |
14
kk.py
14
kk.py
@ -5,20 +5,24 @@ import requests
|
|||||||
class KK:
|
class KK:
|
||||||
|
|
||||||
def __init__(self, rid):
|
def __init__(self, rid):
|
||||||
|
"""
|
||||||
|
KK直播
|
||||||
|
Args:
|
||||||
|
rid: 房间号
|
||||||
|
"""
|
||||||
self.rid = rid
|
self.rid = rid
|
||||||
|
self.s = requests.Session()
|
||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
url = 'https://sapi.kktv1.com/meShow/entrance?parameter={}'
|
url = 'https://sapi.kktv1.com/meShow/entrance?parameter={}'
|
||||||
parameter = {'FuncTag': 10005043, 'userId': '{}'.format(self.rid), 'platform': 1, 'a': 1, 'c': 100101}
|
parameter = {'FuncTag': 10005043, 'userId': f'{self.rid}', 'platform': 1, 'a': 1, 'c': 100101}
|
||||||
with requests.Session() as s:
|
res = self.s.get(url.format(parameter)).json()
|
||||||
res = s.get(url.format(parameter)).json()
|
|
||||||
tagcode = res['TagCode']
|
tagcode = res['TagCode']
|
||||||
if tagcode == '00000000':
|
if tagcode == '00000000':
|
||||||
if res.get('liveType', 0) == 1:
|
if res.get('liveType', 0) == 1:
|
||||||
roomid = res['roomId']
|
roomid = res['roomId']
|
||||||
parameter = {'FuncTag': 60001002, 'roomId': roomid, 'platform': 1, 'a': 1, 'c': 100101}
|
parameter = {'FuncTag': 60001002, 'roomId': roomid, 'platform': 1, 'a': 1, 'c': 100101}
|
||||||
with requests.Session() as s:
|
res = self.s.get(url.format(parameter)).json()
|
||||||
res = s.get(url.format(parameter)).json()
|
|
||||||
real_url = res['liveStream']
|
real_url = res['liveStream']
|
||||||
return real_url
|
return real_url
|
||||||
else:
|
else:
|
||||||
|
50
kugou.py
50
kugou.py
@ -6,17 +6,53 @@ import requests
|
|||||||
class KuGou:
|
class KuGou:
|
||||||
|
|
||||||
def __init__(self, rid):
|
def __init__(self, rid):
|
||||||
|
"""
|
||||||
|
酷狗繁星直播
|
||||||
|
Args:
|
||||||
|
rid: 房间号
|
||||||
|
"""
|
||||||
self.rid = rid
|
self.rid = rid
|
||||||
|
self.s = requests.Session()
|
||||||
|
self.BASE_URL = 'https://fx1.service.kugou.com/video/mo/live/pull/h5/v3/streamaddr'
|
||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
|
params = {
|
||||||
|
'roomId': self.rid,
|
||||||
|
'platform': 18,
|
||||||
|
'version': 1000,
|
||||||
|
'streamType': '3-6',
|
||||||
|
'liveType': 1,
|
||||||
|
'ch': 'fx',
|
||||||
|
'ua': 'fx-mobile-h5',
|
||||||
|
'kugouId': 0,
|
||||||
|
'layout': 1
|
||||||
|
}
|
||||||
try:
|
try:
|
||||||
response1 = requests.get('https://fx1.service.kugou.com/video/pc/live/pull/v3/streamaddr?roomId={}&ch=fx&version=1.0&streamType=1-2-5&platform=7&ua=fx-flash&kugouId=0&layout=1'.format(self.rid)).json()
|
res = self.s.get(self.BASE_URL, params=params).json()
|
||||||
response2 = requests.get('https://fx1.service.kugou.com/video/mo/live/pull/h5/v3/streamaddr?roomId={}&platform=18&version=1000&streamType=3-6&liveType=1&ch=fx&ua=fx-mobile-h5&kugouId=0&layout=1'.format(self.rid)).json()
|
if res['code'] == 1:
|
||||||
real_url_flv = response1.get('data').get('horizontal')[0].get('httpflv')[0]
|
raise Exception(f'{res["msg"]},可能是房间号输入错误!')
|
||||||
real_url_hls = response2.get('data').get('horizontal')[0].get('httpshls')[0]
|
real_url_hls = res.get('data').get('horizontal')[0].get('httpshls')[0]
|
||||||
except:
|
except IndexError:
|
||||||
raise Exception('直播间不存在或未开播')
|
try:
|
||||||
return {"flv": real_url_flv, "hls": real_url_hls}
|
url = f'https://fx1.service.kugou.com/biz/ChannelVServices/' \
|
||||||
|
f'RoomLiveService.RoomLiveService.getCurrentLiveStarForMob/{self.rid}'
|
||||||
|
res = self.s.get(url).json()
|
||||||
|
if res['code'] == 1:
|
||||||
|
raise Exception(f'{res["msg"]},可能是房间号输入错误!')
|
||||||
|
roomid = res['data']['roomId']
|
||||||
|
self.BASE_URL = 'https://fx2.service.kugou.com/video/pc/live/pull/mutiline/streamaddr'
|
||||||
|
params = {
|
||||||
|
'std_rid': roomid,
|
||||||
|
'version': '1.0',
|
||||||
|
'streamType': '1-2-3-5-6',
|
||||||
|
'targetLiveTypes': '1-4-5-6',
|
||||||
|
'ua': 'fx-h5'
|
||||||
|
}
|
||||||
|
res = self.s.get(self.BASE_URL, params=params).json()
|
||||||
|
real_url_hls = res.get('data').get('lines')[-1].get('streamProfiles')[-1]['httpsHls'][-1]
|
||||||
|
except Exception:
|
||||||
|
raise Exception('未找到')
|
||||||
|
return real_url_hls
|
||||||
|
|
||||||
|
|
||||||
def get_real_url(rid):
|
def get_real_url(rid):
|
||||||
|
19
laifeng.py
19
laifeng.py
@ -9,19 +9,26 @@ import re
|
|||||||
class LaiFeng:
|
class LaiFeng:
|
||||||
|
|
||||||
def __init__(self, rid):
|
def __init__(self, rid):
|
||||||
|
"""
|
||||||
|
来疯直播
|
||||||
|
Args:
|
||||||
|
rid: 房间号
|
||||||
|
"""
|
||||||
self.rid = rid
|
self.rid = rid
|
||||||
|
self.s = requests.Session()
|
||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
try:
|
try:
|
||||||
response_main = requests.get(url='http://v.laifeng.com/{}/m'.format(self.rid)).text
|
response_main = self.s.get(f'http://v.laifeng.com/{self.rid}/m').text
|
||||||
stream_name = re.findall(r"initAlias:'(.*)?'", response_main)[0]
|
stream_name = re.search(r"initAlias:'(.*)?'", response_main).group(1)
|
||||||
real_url = {}
|
real_url = {}
|
||||||
for stream_format in ['HttpFlv', 'Hls']:
|
for stream_format in ['HttpFlv', 'Hls']:
|
||||||
request_url = 'https://lapi.lcloud.laifeng.com/Play?AppId=101&CallerVersion=2.0&StreamName={}&Action=Schedule&Version=2.0&Format={}'.format(stream_name, stream_format)
|
request_url = f'https://lapi.lcloud.laifeng.com/Play?AppId=101&CallerVersion=2.0&StreamName' \
|
||||||
response = requests.get(url=request_url).json()
|
f'={stream_name}&Action=Schedule&Version=2.0&Format={stream_format}'
|
||||||
|
response = self.s.get(request_url).json()
|
||||||
real_url[stream_format] = response.get(stream_format)[0].get('Url')
|
real_url[stream_format] = response.get(stream_format)[0].get('Url')
|
||||||
except:
|
except Exception:
|
||||||
raise Exception('该直播间不存在或未开播')
|
raise Exception('该直播间不存在或未开播')
|
||||||
return real_url
|
return real_url
|
||||||
|
|
||||||
|
|
||||||
|
17
longzhu.py
17
longzhu.py
@ -7,15 +7,22 @@ import re
|
|||||||
class LongZhu:
|
class LongZhu:
|
||||||
|
|
||||||
def __init__(self, rid):
|
def __init__(self, rid):
|
||||||
|
"""
|
||||||
|
龙珠直播,获取hls格式的播放地址
|
||||||
|
Args:
|
||||||
|
rid: 直播房间号
|
||||||
|
"""
|
||||||
self.rid = rid
|
self.rid = rid
|
||||||
|
self.s = requests.Session()
|
||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
try:
|
try:
|
||||||
response = requests.get('http://star.longzhu.com/' + str(self.rid)).text
|
res = self.s.get(f'http://star.longzhu.com/{self.rid}').text
|
||||||
roomId = re.findall(r'roomid":(\d+)', response)[0]
|
roomId = re.search(r'roomid":(\d+)', res).group(1)
|
||||||
response = requests.get('http://livestream.longzhu.com/live/getlivePlayurl?roomId={}&utmSr=&platform=h5&device=ios'.format(roomId)).json()
|
res = self.s.get(f'http://livestream.longzhu.com/live/getlivePlayurl?roomId={roomId}&utmSr=&platform=h5'
|
||||||
real_url = response.get('playLines')[0].get('urls')[0].get('securityUrl')
|
f'&device=ios').json()
|
||||||
except:
|
real_url = res.get('playLines')[0].get('urls')[-1].get('securityUrl')
|
||||||
|
except Exception:
|
||||||
raise Exception('直播间不存在或未开播')
|
raise Exception('直播间不存在或未开播')
|
||||||
return real_url
|
return real_url
|
||||||
|
|
||||||
|
26
look.py
26
look.py
@ -17,12 +17,14 @@ import random
|
|||||||
import requests
|
import requests
|
||||||
from Crypto.Cipher import AES
|
from Crypto.Cipher import AES
|
||||||
|
|
||||||
modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
|
modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee34' \
|
||||||
|
'1f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e' \
|
||||||
|
'82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
|
||||||
nonce = b'0CoJUm6Qyw8W8jud'
|
nonce = b'0CoJUm6Qyw8W8jud'
|
||||||
pubKey = '010001'
|
pubKey = '010001'
|
||||||
|
|
||||||
|
|
||||||
def aes_encrypt(text, secKey):
|
def aes_encrypt(text, seckey):
|
||||||
pad = 16 - len(text) % 16
|
pad = 16 - len(text) % 16
|
||||||
|
|
||||||
# aes加密需要byte类型。
|
# aes加密需要byte类型。
|
||||||
@ -31,16 +33,16 @@ def aes_encrypt(text, secKey):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
text = text.decode()
|
text = text.decode()
|
||||||
except:
|
except Exception as e:
|
||||||
pass
|
print(e)
|
||||||
|
|
||||||
text = text + pad * chr(pad)
|
text = text + pad * chr(pad)
|
||||||
try:
|
try:
|
||||||
text = text.encode()
|
text = text.encode()
|
||||||
except:
|
except Exception as e:
|
||||||
pass
|
print(e)
|
||||||
|
|
||||||
encryptor = AES.new(secKey, 2, bytes('0102030405060708', 'utf-8'))
|
encryptor = AES.new(seckey, 2, bytes('0102030405060708', 'utf-8'))
|
||||||
ciphertext = encryptor.encrypt(text)
|
ciphertext = encryptor.encrypt(text)
|
||||||
ciphertext = base64.b64encode(ciphertext)
|
ciphertext = base64.b64encode(ciphertext)
|
||||||
return ciphertext
|
return ciphertext
|
||||||
@ -56,10 +58,10 @@ def create_secret_key(size):
|
|||||||
return bytes(''.join(random.sample('1234567890qwertyuipasdfghjklzxcvbnm', size)), 'utf-8')
|
return bytes(''.join(random.sample('1234567890qwertyuipasdfghjklzxcvbnm', size)), 'utf-8')
|
||||||
|
|
||||||
|
|
||||||
def rsa_encrypt(text, pub_key, modulus):
|
def rsa_encrypt(text, pub_key, mod):
|
||||||
text = text[::-1]
|
text = text[::-1]
|
||||||
# 3中将字符串转成hex的函数变成了binascii.hexlify, 2中可以直接 str.encode('hex')
|
# 3中将字符串转成hex的函数变成了binascii.hexlify, 2中可以直接 str.encode('hex')
|
||||||
rs = int(binascii.hexlify(text), 16) ** int(pub_key, 16) % int(modulus, 16)
|
rs = int(binascii.hexlify(text), 16) ** int(pub_key, 16) % int(mod, 16)
|
||||||
return format(rs, 'x').zfill(256)
|
return format(rs, 'x').zfill(256)
|
||||||
|
|
||||||
|
|
||||||
@ -82,11 +84,9 @@ class Look:
|
|||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
try:
|
try:
|
||||||
request_data = encrypted_request({"liveRoomNo": self.rid})
|
request_data = encrypted_request({"liveRoomNo": self.rid})
|
||||||
response = requests.post(url='https://api.look.163.com/weapi/livestream/room/get/v3',
|
response = requests.post(url='https://api.look.163.com/weapi/livestream/room/get/v3', data=request_data)
|
||||||
data=request_data)
|
|
||||||
real_url = response.json()['data']['roomInfo']['liveUrl']
|
real_url = response.json()['data']['roomInfo']['liveUrl']
|
||||||
|
except Exception:
|
||||||
except:
|
|
||||||
raise Exception('直播间不存在或未开播')
|
raise Exception('直播间不存在或未开播')
|
||||||
return real_url
|
return real_url
|
||||||
|
|
||||||
|
4
now.py
4
now.py
@ -10,7 +10,7 @@ class Now:
|
|||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
try:
|
try:
|
||||||
room_url = 'https://now.qq.com/cgi-bin/now/web/room/get_live_room_url?room_id={}&platform=8'.format(self.rid)
|
room_url = f'https://now.qq.com/cgi-bin/now/web/room/get_live_room_url?room_id={self.rid}&platform=8'
|
||||||
response = requests.get(url=room_url).json()
|
response = requests.get(url=room_url).json()
|
||||||
result = response.get('result')
|
result = response.get('result')
|
||||||
real_url = {
|
real_url = {
|
||||||
@ -18,7 +18,7 @@ class Now:
|
|||||||
'raw_rtmp_url': result.get('raw_rtmp_url', 0),
|
'raw_rtmp_url': result.get('raw_rtmp_url', 0),
|
||||||
'raw_flv_url': result.get('raw_flv_url', 0)
|
'raw_flv_url': result.get('raw_flv_url', 0)
|
||||||
}
|
}
|
||||||
except:
|
except Exception:
|
||||||
raise Exception('直播间不存在或未开播')
|
raise Exception('直播间不存在或未开播')
|
||||||
return real_url
|
return real_url
|
||||||
|
|
||||||
|
18
qf.py
18
qf.py
@ -8,14 +8,24 @@ import re
|
|||||||
class QF:
|
class QF:
|
||||||
|
|
||||||
def __init__(self, rid):
|
def __init__(self, rid):
|
||||||
|
"""
|
||||||
|
搜狐千帆直播可以直接在网页源码里找到播放地址
|
||||||
|
Args:
|
||||||
|
rid: 数字直播间号
|
||||||
|
"""
|
||||||
self.rid = rid
|
self.rid = rid
|
||||||
|
self.s = requests.Session()
|
||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
try:
|
try:
|
||||||
response = requests.post(url='https://qf.56.com/' + self.rid).text
|
res = self.s.get(f'https://qf.56.com/{self.rid}').text
|
||||||
real_url = re.findall(r"flvUrl:'(.*)\?wsSecret", response)
|
flvurl = re.search(r"flvUrl:'(.*)?'", res).group(1)
|
||||||
real_url = real_url[0]
|
if 'flv' in flvurl:
|
||||||
except:
|
real_url = flvurl
|
||||||
|
else:
|
||||||
|
res = self.s.get(flvurl).json()
|
||||||
|
real_url = res['url']
|
||||||
|
except Exception:
|
||||||
raise Exception('直播间不存在或未开播')
|
raise Exception('直播间不存在或未开播')
|
||||||
return real_url
|
return real_url
|
||||||
|
|
||||||
|
2
qie.py
2
qie.py
@ -11,7 +11,7 @@ class ESport:
|
|||||||
|
|
||||||
def get_real_url(self):
|
def get_real_url(self):
|
||||||
with requests.Session() as s:
|
with requests.Session() as s:
|
||||||
res = s.get('https://m.live.qq.com/' + str(self.rid))
|
res = s.get(f'https://m.live.qq.com/{self.rid}')
|
||||||
show_status = re.search(r'"show_status":"(\d)"', res.text)
|
show_status = re.search(r'"show_status":"(\d)"', res.text)
|
||||||
if show_status:
|
if show_status:
|
||||||
if show_status.group(1) == '1':
|
if show_status.group(1) == '1':
|
||||||
|
Loading…
x
Reference in New Issue
Block a user