
iptv-proxy 开发者指南XStream 客户端封装与 go.xtream-codes 库实战解析【免费下载链接】iptv-proxyReverse proxy on iptv m3u and m3u8 file and xtream codes client api项目地址: https://gitcode.com/gh_mirrors/ip/iptv-proxyiptv-proxy 是一个基于 Go 语言的开源 IPTV 代理工具核心能力是把 m3u/m3u8 播放列表和 Xtream codes 客户端 API 完整地反向代理到你自己的服务器上。无论是想隐藏上游 IPTV 服务的真实凭证还是想给家人朋友分发统一的频道入口iptv-proxy 都能用极简配置完成。本文从开发者视角出发拆解其 XStream 客户端封装设计并实战解析 go.xtream-codes 库的调用方式帮助新手快速理解、上手和二次开发。iptv-proxy 是什么一个低调的 IPTV 代理神器 iptv-proxy 的核心价值在于「代理」二字它不生产内容只做流量的搬运工。它把上游的 IPTV 服务完整地包装成你自己的服务对外只暴露一套全新的地址和凭证。两大核心能力核心功能说明m3u/m3u8 反向代理抓取远程 m3u 文件重写所有频道 URL 指向代理服务器Xtream 客户端 API 代理代理 player_api.php、get.php、xmltv.php 等全部接口其中 Xtream 代理完整支持 live 直播、VOD 点播、Series 剧集以及全量 EPG 节目单这也是本文的重点。为什么需要给 Xtream 服务套一层反向代理直接把 Xtream 的真实地址丢给播放器固然省事但随之而来的是几个头疼的问题凭证泄露风险真实账号密码出现在播放地址里一旦被爬取全部暴露无法统一管理给不同的人分发不同权限需要一套统一的鉴权入口链路不可控无法对播放请求做缓存、重写和监控iptv-proxy 的做法很聪明它用一套代理凭证user/password替换真实的xtream-user/xtream-password同时把xtream-base-url替换成你自己的域名和端口。外界永远接触不到真实的上游信息。XStream 客户端封装go.xtream-codes 库实战解析 ⚙️XStream 客户端封装是整个 Xtream 代理的心脏核心代码位于 pkg/xtream-proxy/xtream-proxy.go。这个包做了一件关键的事把 go.xtream-codes 库的底层客户端包装成一个可被 HTTP 层直接调用的门面。客户端初始化通过New()函数创建客户端它内部调用了 go.xtream-codes 的NewClientWithUserAgent并透传用户代理User-Agent这样上游服务看到的请求特征和真实播放器一致cli, err : xtream.NewClientWithUserAgent(context.Background(), user, password, baseURL, userAgent)常用 API 一览go.xtream-codes 库把 Xtream 协议封装成了一个个 Go 方法iptv-proxy 正是基于这些方法实现了全部业务方法对应 Xtream 接口用途GetLiveCategoriesget_live_categories直播分类GetLiveStreamsget_live_streams直播频道列表GetVideoOnDemandStreamsget_vod_streams点播片库GetSeriesget_series剧集列表GetShortEPG/GetEPGget_short_epg节目单 EPGGetXMLTVxmltv.php完整 XMLTV 节目表Action 分发器一个 switch 打天下在Action()方法里iptv-proxy 用一个switch根据 action 字符串分发请求并做参数校验比如vod_id、series_id、stream_id缺一不可。这种设计让路由层代码异常清爽——新增一个接口只需加一个 case。登录信息重写把真实账号偷梁换柱 这是最精彩的部分。login方法接收代理凭证和代理地址然后用上游返回的账号信息填充字段但替换掉用户名、密码和服务器地址把真实的xtream_user换成代理user把真实的xtream_password换成代理password把真实的base-url换成hostname:port这样播放器用代理凭证登录时拿到的server_info全部指向你的服务器后续所有的流地址、EPG 请求都会自然落到代理上形成一个闭环。路由层的魔法从 player_api 到 xmltv 的全代理 路由定义集中在 pkg/server/routes.go请求处理逻辑在 pkg/server/xtreamHandles.go。核心路由包括GET /get.php返回重写后的 m3u 播放列表带缓存GET /player_api.php处理所有 player API actionGET /xmltv.php代理完整 EPG 数据GET /live/{user}/{pass}/{id}直播流代理GET /movie/...、GET /series/...、GET /timeshift/...点播、剧集、回看⚠️ 注意所有对外路由都要求携带代理凭证usernamepassword通过鉴权中间件authenticate未认证请求直接返回 401。流媒体与 HLS 代理最易踩坑的一环 流媒体代理比 API 代理复杂得多。iptv-proxy 在stream方法中通过http.Client拉取上游流并原样转发stream 模式但对HLSm3u8做了特殊处理先请求上游 m3u8跟随 302 重定向拿到真实 HLS 地址并缓存把响应体中 m3u8 内容里的真实凭证路径替换成代理凭证路径客户端后续的.ts分片请求会继续落到代理上由hls路由处理这套 HLS 凭证重写逻辑保证了直播链路全程经过代理不会绕过鉴权。5 分钟快速上手安装与配置教程 ️方式一二进制启动获取源码后构建或直接使用发布版二进制。启动示例iptv-proxy --m3u-url http://上游地址/get.php?username真实用户password真实密码typem3u_plusoutputm3u8 \ --port 8080 \ --hostname proxy.example.com \ --xtream-user 真实用户 \ --xtream-password 真实密码 \ --xtream-base-url http://上游地址:1234 \ --user 代理用户 \ --password 代理密码启动后播放器只需填入代理地址http://proxy.example.com:8080、代理用户和代理密码即可。方式二Docker 部署项目根目录提供了开箱即用的 docker-compose.yml通过环境变量配置即可环境变量说明M3U_URLm3u 地址或本地文件路径XTREAM_USER/XTREAM_PASSWORD真实 Xtream 凭证XTREAM_BASE_URL上游 Xtream 基础地址USER/PASSWORD对外代理凭证PORT/HOSTNAME对外暴露端口与域名一键启动docker-compose up -d所有配置项的定义可参考 cmd/root.go 与 pkg/config/config.go每个 flag 都有清晰注释。开发者常见问题 FAQ Q1为什么播放列表会变因为replaceURL会把原始频道地址重写为代理地址m3u 文件整体被重定向到代理服务器上这正是 m3u 反向代理的核心逻辑见 pkg/server/server.go。Q2get.php 请求太频繁怎么办iptv-proxy 内置了 m3u 缓存机制M3UCacheExpiration默认 1 小时过期前直接返回缓存文件避免频繁打上游。Q3放在 Nginx/Traefik 后面地址不对使用--advertised-port声明对外端口如 443并开启--https这样生成的代理链接才会使用正确协议和端口。Q4想新增一个 Xtream 接口支持两步即可在 pkg/xtream-proxy/xtream-proxy.go 的Action()中新增一个 case 调用 go.xtream-codes 对应方法再在 pkg/server/routes.go 注册路由。写在最后 ✍️iptv-proxy 用不到几百行代码就完成了 m3u 反向代理 Xtream 客户端 API 代理这两件大事是学习 Go 网络编程和反向代理设计的绝佳范例。尤其值得品味的是它对 go.xtream-codes 库的封装方式——薄薄一层门面却把凭证隔离、HLS 重写、路由分发安排得明明白白。希望这篇开发者指南能帮你快速上手并在此基础上构建出属于自己的 IPTV 代理服务。【免费下载链接】iptv-proxyReverse proxy on iptv m3u and m3u8 file and xtream codes client api项目地址: https://gitcode.com/gh_mirrors/ip/iptv-proxy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考