From dbd854fd90098de1f9ae09ca2941fd4ecb1a5bc6 Mon Sep 17 00:00:00 2001
From: ihmily <961532186@qq.com>
Date: Sat, 13 Jul 2024 18:16:03 +0800
Subject: [PATCH] feat: add yingke live record
---
README.md | 10 +++++++++-
config/config.ini | 1 +
main.py | 20 +++++++++++++++-----
spider.py | 41 ++++++++++++++++++++++++++++++++++++++++-
4 files changed, 65 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 2019a99..541c3cf 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,7 @@
- [x] ShowRoom
- [x] Acfun
- [x] 时光直播
+- [x] 映客直播
- [ ] 更多平台正在更新中
@@ -192,6 +193,9 @@ https://live.acfun.cn/live/179922
时光直播:
https://www.rengzu.com/180778
+
+映客直播:
+https://www.inke.cn/liveroom/index.html?uid=22954469&id=1720860391070904
```
直播间分享地址和网页端长地址都能正常进行录制(抖音尽量用长链接,避免因短链接转换失效导致不能正常录制,而且需要有nodejs环境,否则无法转换)。
@@ -315,13 +319,17 @@ docker-compose stop
[](https://github.com/missuo)
+
## ⏳提交日志
+- 20240713
+ - 新增映客直播录制
+
- 20240705
- 新增时光直播录制
-
+
- 20240701
- 修复虎牙直播录制2分钟断流问题
diff --git a/config/config.ini b/config/config.ini
index 6cd1403..d34676a 100644
--- a/config/config.ini
+++ b/config/config.ini
@@ -65,6 +65,7 @@ liuxing_cookie =
showroom_cookie =
acfun_cookie =
shiguang_cookie =
+yingke_cookie =
[Authorization]
popkontv_token =
diff --git a/main.py b/main.py
index 03f4f18..5339603 100644
--- a/main.py
+++ b/main.py
@@ -61,7 +61,8 @@ from spider import (
get_showroom_stream_data,
get_acfun_stream_data,
get_huya_app_stream_url,
- get_shiguang_stream_url
+ get_shiguang_stream_url,
+ get_yingke_stream_url
)
from utils import (
@@ -70,9 +71,10 @@ from utils import (
)
from msg_push import dingtalk, xizhi, tg_bot
-version = "v3.0.6"
-platforms = "\n国内站点:抖音|快手|虎牙|斗鱼|YY|B站|小红书|bigo|blued|网易CC|千度热播|猫耳FM|Look|TwitCasting|百度|微博|酷狗|LiveMe|花椒|流星|Acfun" \
- "\n海外站点:TikTok|AfreecaTV|PandaTV|WinkTV|FlexTV|PopkonTV|TwitchTV|ShowRoom"
+version = "v3.0.7"
+platforms = ("\n国内站点:抖音|快手|虎牙|斗鱼|YY|B站|小红书|bigo|blued|网易CC|千度热播|猫耳FM|Look|TwitCasting|百度|微博|"
+ "酷狗|LiveMe|花椒|流星|Acfun|时光|映客"
+ "\n海外站点:TikTok|AfreecaTV|PandaTV|WinkTV|FlexTV|PopkonTV|TwitchTV|ShowRoom")
recording = set()
unrecording = set()
@@ -96,7 +98,7 @@ url_config_file = f'{script_path}/config/URL_config.ini'
backup_dir = f'{script_path}/backup_config'
encoding = 'utf-8-sig'
rstr = r"[\/\\\:\*\?\"\<\>\|&.。,, ]"
-ffmpeg_path = f"{script_path}/ffmpeg.exe" # ffmpeg文件路径
+ffmpeg_path = f"{script_path}/ffmpeg.exe"
default_path = f'{script_path}/downloads'
os.makedirs(default_path, exist_ok=True)
file_update_lock = threading.Lock()
@@ -978,6 +980,12 @@ def start_record(url_data: tuple, count_variable: int = -1):
with semaphore:
port_info = get_shiguang_stream_url(
url=record_url, proxy_addr=proxy_address, cookies=shiguang_cookie)
+
+ elif record_url.find("www.inke.cn/") > -1:
+ platform = '映客直播'
+ with semaphore:
+ port_info = get_yingke_stream_url(
+ url=record_url, proxy_addr=proxy_address, cookies=yingke_cookie)
else:
logger.error(f'{record_url} 未知直播地址')
return
@@ -1714,6 +1722,7 @@ while True:
showroom_cookie = read_config_value(config, 'Cookie', 'showroom_cookie', '')
acfun_cookie = read_config_value(config, 'Cookie', 'acfun_cookie', '')
shiguang_cookie = read_config_value(config, 'Cookie', 'shiguang_cookie', '')
+ yingke_cookie = read_config_value(config, 'Cookie', 'yingke_cookie', '')
if len(video_save_type) > 0:
if video_save_type.upper().lower() == "FLV".lower():
@@ -1811,6 +1820,7 @@ while True:
'm.acfun.cn',
'www.rengzu.com',
'wap.rengzu.com',
+ 'www.inke.cn'
]
overseas_platform_host = [
'www.tiktok.com',
diff --git a/spider.py b/spider.py
index 1bc72b3..49908cf 100644
--- a/spider.py
+++ b/spider.py
@@ -2273,6 +2273,43 @@ def get_shiguang_stream_url(url: str, proxy_addr: Union[str, None] = None, cooki
return result
+@trace_error_decorator
+def get_yingke_stream_url(url: str, proxy_addr: Union[str, None] = None, cookies: Union[str, None] = None) -> \
+ Dict[str, Any]:
+ headers = {
+ 'Referer': 'https://www.inke.cn/',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0',
+ }
+ if cookies:
+ headers['Cookie'] = cookies
+
+ parsed_url = urllib.parse.urlparse(url)
+ query_params = urllib.parse.parse_qs(parsed_url.query)
+ uid = query_params['uid'][0]
+ live_id = query_params['id'][0]
+ params = {
+ 'uid': uid,
+ 'id': live_id,
+ '_t': str(int(time.time())),
+ }
+
+ api = f'https://webapi.busi.inke.cn/web/live_share_pc?{urllib.parse.urlencode(params)}'
+ json_str = get_req(api, proxy_addr=proxy_addr, headers=headers)
+ json_data = json.loads(json_str)
+ anchor_name = json_data['data']['media_info']['nick']
+ live_status = json_data['data']['status']
+
+ result = {"anchor_name": anchor_name, "is_live": False}
+ if live_status == 1:
+ m3u8_url = json_data['data']['live_addr'][0]['hls_stream_addr']
+ flv_url = json_data['data']['live_addr'][0]['stream_addr']
+ result["is_live"] = True
+ result["m3u8_url"] = m3u8_url
+ result["flv_url"] = flv_url
+ result["record_url"] = m3u8_url
+ return result
+
+
if __name__ == '__main__':
# 尽量用自己的cookie,以避免默认的不可用导致无法获取数据
# 以下示例链接不保证时效性,请自行查看链接是否能正常访问
@@ -2316,6 +2353,7 @@ if __name__ == '__main__':
# room_url = 'https://www.showroom-live.com/r/TPS0728' # showroom
# room_url = 'https://live.acfun.cn/live/17912421' # Acfun
# room_url = 'https://www.rengzu.com/180778' # 时光直播
+ # room_url = 'https://www.inke.cn/liveroom/index.html?uid=710032101&id=1720857535354099' # 映客直播
print(get_douyin_stream_data(room_url, proxy_addr=''))
# print(get_douyin_app_stream_data(room_url, proxy_addr=''))
@@ -2349,4 +2387,5 @@ if __name__ == '__main__':
# print(get_liuxing_stream_url(room_url, proxy_addr=''))
# print(get_showroom_stream_data(room_url, proxy_addr=''))
# print(get_acfun_stream_data(room_url, proxy_addr=''))
- # print(get_shiguang_stream_url(room_url, proxy_addr=''))
\ No newline at end of file
+ # print(get_shiguang_stream_url(room_url, proxy_addr=''))
+ # print(get_yingke_stream_url(room_url, proxy_addr=''))
\ No newline at end of file