1
0
mirror of https://github.com/wbt5/real-url.git synced 2025-08-03 17:02:48 +08:00

Compare commits

...

4 Commits

Author SHA1 Message Date
wbt5
3aeaa5ae55 update 2020-10-17 09:38:33 +08:00
wbt5
01cacfc371 修复 西瓜直播 2020-10-17 09:17:48 +08:00
乌帮图
1b43b716f4
Merge pull request #89 from owlwang/patch-1
Update look.py
2020-10-17 08:59:22 +08:00
owlwang
a262956591
Update look.py
修复Look直播不能获取流地址的问题 #87
2020-10-13 09:20:58 +08:00
3 changed files with 79 additions and 6 deletions

View File

@ -25,7 +25,9 @@
## 更新 ## 更新
### 2020.09.26:更新:虎牙直播源;注释掉未完成的 YY 直播弹幕功能。 ### 2020.10.17:修复:西瓜直播。
2020.09.26:更新:虎牙直播源;注释掉未完成的 YY 直播弹幕功能。
2020.09.12新增斗鱼添加一个从PC网页端获取直播源的方法可选线路和清晰度新增requirements.txt文件更新代码。 2020.09.12新增斗鱼添加一个从PC网页端获取直播源的方法可选线路和清晰度新增requirements.txt文件更新代码。

View File

@ -14,7 +14,7 @@ class IXiGua:
headers = { headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:83.0) Gecko/20100101 Firefox/83.0' 'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:83.0) Gecko/20100101 Firefox/83.0'
} }
room_url = self.rid room_url = 'https://live.ixigua.com/' + str(self.rid)
response = requests.get(url=room_url, headers=headers).text response = requests.get(url=room_url, headers=headers).text
real_url = re.findall(r'playInfo":([\s\S]*?),"authStatus', response)[0] real_url = re.findall(r'playInfo":([\s\S]*?),"authStatus', response)[0]
real_url = re.sub(r'\\u002F', '/', real_url) real_url = re.sub(r'\\u002F', '/', real_url)

79
look.py
View File

@ -1,8 +1,77 @@
# 获取网易云音乐旗下look直播的真实流媒体地址。 # 获取网易云音乐旗下look直播的真实流媒体地址。
# look直播间链接形式https://look.163.com/live?id=73694082 # look直播间链接形式https://look.163.com/live?id=73694082
# 以下核心加密解密算法来自https://github.com/Qinjiaxin/MusicBox/blob/b8f716d43d/MusicPlayer/apis/netEaseEncode.py
# 分析过程可参看 https://github.com/Qinjiaxin/MusicBox/blob/b8f716d43d/doc/analysis/analyze_captured_data.md
# 加密参数相关。
# 具体http://s3.music.126.net/sep/s/2/core.js?5d6f8e4d01b4103ec9f246a2ef70e6d1在这个js中可以查看。
# 好吧其实不用分析这个js在这个git中可以找到https://github.com/xiyouMc/ncmbot不过他是for python2的。
# 针对pyton3做了修改。
import base64
import binascii
import json
import random
import requests import requests
import re from Crypto.Cipher import AES
modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
nonce = b'0CoJUm6Qyw8W8jud'
pubKey = '010001'
def aes_encrypt(text, secKey):
pad = 16 - len(text) % 16
# aes加密需要byte类型。
# 因为调用两次,下面还要进行补充位数。
# 直接用try与if差不多。
try:
text = text.decode()
except:
pass
text = text + pad * chr(pad)
try:
text = text.encode()
except:
pass
encryptor = AES.new(secKey, 2, bytes('0102030405060708', 'utf-8'))
ciphertext = encryptor.encrypt(text)
ciphertext = base64.b64encode(ciphertext)
return ciphertext
def create_secret_key(size):
# 2中 os.urandom返回是个字符串。3中变成bytes。
# 不过加密的目的是需要一个字符串。
# 因为密钥之后会被加密到rsa中一起发送出去。
# 所以即使是个固定的密钥也是可以的。
# return (''.join(map(lambda xx: (hex(ord(xx))[2:]), os.urandom(size))))[0:16]
return bytes(''.join(random.sample('1234567890qwertyuipasdfghjklzxcvbnm', size)), 'utf-8')
def rsa_encrypt(text, pub_key, modulus):
text = text[::-1]
# 3中将字符串转成hex的函数变成了binascii.hexlify, 2中可以直接 str.encode('hex')
rs = int(binascii.hexlify(text), 16) ** int(pub_key, 16) % int(modulus, 16)
return format(rs, 'x').zfill(256)
def encrypted_request(text):
# 这边是加密过程。
text = json.dumps(text)
sec_key = create_secret_key(16)
enc_text = aes_encrypt(aes_encrypt(text, nonce), sec_key)
enc_sec_key = rsa_encrypt(sec_key, pubKey, modulus)
# 在那个js中也可以找到。
# params加密后是个byte解下码。
return {'params': enc_text.decode(), 'encSecKey': enc_sec_key}
class Look: class Look:
@ -12,8 +81,11 @@ class Look:
def get_real_url(self): def get_real_url(self):
try: try:
response = requests.post(url='https://look.163.com/live?id=' + self.rid).text request_data = encrypted_request({"liveRoomNo": self.rid})
real_url = re.findall(r'"liveUrl":([\s\S]*),"liveType"', response)[0] response = requests.post(url='https://api.look.163.com/weapi/livestream/room/get/v3',
data=request_data)
real_url = response.json()['data']['roomInfo']['liveUrl']
except: except:
raise Exception('直播间不存在或未开播') raise Exception('直播间不存在或未开播')
return real_url return real_url
@ -31,4 +103,3 @@ def get_real_url(rid):
if __name__ == '__main__': if __name__ == '__main__':
r = input('请输入Look直播房间号\n') r = input('请输入Look直播房间号\n')
print(get_real_url(r)) print(get_real_url(r))