如何通过程序自动获取JS播放器中每日变更的playlist.m3u8地址?
解决方案:自动获取并播放订阅新闻频道的m3u8流
核心逻辑
由于m3u8地址需要在已认证的页面中获取,程序的核心是模拟浏览器的登录会话——通过保存登录后的Cookie维持认证状态,定期请求目标页面提取最新m3u8地址,再调用ffplay完成播放。
步骤1:导出登录会话Cookie
先在浏览器完成新闻频道的登录,然后打开检查面板的Network标签:
- 随便选择一个请求,查看Request Headers里的
Cookie字段 - 将Cookie中的键值对整理成字典格式(比如
"session_id": "xxxxxx"),后续脚本会用它维持登录状态
步骤2:编写Python自动提取脚本
树莓派1自带Python环境,先安装必要依赖:
sudo apt-get install python3-requests python3-bs4
以下是适配场景的示例脚本(需根据实际页面结构调整):
import requests import re import subprocess import time # 替换为你的新闻频道直播页URL PAGE_URL = "https://your-news-channel.com/live" # 替换为从浏览器导出的Cookie键值对 LOGIN_COOKIES = { "session_token": "your_session_value", "user_id": "your_user_id" } # 匹配m3u8地址的正则(可根据页面中链接的实际格式调整) M3U8_REGEX = r'https?://[^\s"]+\.m3u8' def fetch_m3u8(): try: resp = requests.get(PAGE_URL, cookies=LOGIN_COOKIES) resp.raise_for_status() # 从页面源码中匹配m3u8地址 m3u8_list = re.findall(M3U8_REGEX, resp.text) return m3u8_list[0] if m3u8_list else None except Exception as e: print(f"请求失败: {str(e)}") return None def play_with_ffplay(m3u8_url): # 适配树莓派1性能的ffplay参数:无窗口、自动退出、降分辨率 ffplay_cmd = [ "ffplay", "-nodisp", "-autoexit", "-lowres", "-framedrop", m3u8_url ] try: subprocess.run(ffplay_cmd, check=True) except subprocess.CalledProcessError: print("ffplay播放异常") if __name__ == "__main__": while True: current_m3u8 = fetch_m3u8() if current_m3u8: print(f"获取到有效m3u8地址: {current_m3u8}") play_with_ffplay(current_m3u8) # 每23小时重新获取一次(提前1小时避免地址过期) print("等待23小时后重试...") time.sleep(23 * 3600)
步骤3:适配实际页面细节
- 如果m3u8地址是通过AJAX异步加载的,可抓包找到对应的API接口,直接用
requests请求该接口提取地址(比解析页面源码更高效) - 若Cookie过期,需重新从浏览器导出更新;部分网站的Cookie有效期较长,可每月检查一次
步骤4:设置开机自动运行
编辑树莓派的rc.local文件实现开机启动:
sudo nano /etc/rc.local
在exit 0前添加以下内容(替换为你的脚本路径):
python3 /home/pi/news_stream_script.py &
保存后重启树莓派即可生效。
注意事项
- 你拥有合法订阅权限,这种个人家庭使用的脚本完全合规,无需担心版权问题
- 树莓派1性能有限,若播放卡顿可尝试添加
-sync ext参数强制外部同步,或进一步降低分辨率 - 若地址更新时间不固定,可缩短循环等待间隔(比如每12小时检查一次),确保始终获取有效地址
内容的提问来源于stack exchange,提问作者Jander
相关产品推荐
相关产品推荐

