Archeb / Blog-Comments

蚊Blog的评论区
6 stars 0 forks source link

轻松抓取并解析广东电信 IPTV 全部直播源 #28

Open Archeb opened 3 years ago

Archeb commented 3 years ago

https://qwq.moe/extracting-iptv-live-streams

fejich commented 3 years ago

抓到的直播源用 vlc 播放失败,potplayer 正常。 感谢(=゚ω゚)=

cunhan commented 2 years ago

按帖子的配置只抓到post,抓不到respond,不知道为什么。 后来网上找到另一种方法,开启win10的移动热点,让机顶盒无线连接这个热点,winshark监控这个热点,才成功抓到channel列表。 不过后面的js保存m3u8的方法真是非常实用。还可以稍微修改一下,保存成txt导入到一些XX直播的app自定义源里,方便在电视上收看。

VictoriousRaptor commented 2 years ago

这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

fejich commented 2 years ago

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

广东不同地区陆续开始实行,从 v2ex 论坛相关讨论来看,应该是广电总局的新规限制。

Archeb commented 2 years ago

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

在路由器上同时拨公网+IPTV的pppoe然后把183段分流过去即可,我一直是这么做的。

itnico commented 1 year ago

请问线应该怎么接?广州电信,机顶盒是单独拨号看电视,选的ipoe拨号电视才有画面,如果设置为静态ip,电视没画面,没法抓包。

punklee2014 commented 1 year ago

谢谢持续更新

itnico commented 1 year ago

抓到时这种格式吗?igmp://239.77.0.86:5146|rtsp://183.59.156.50/PLTV/88888888/224/3221229774......... 啥播放器都播放不了

Archeb commented 1 year ago

抓到时这种格式吗?igmp://239.77.0.86:5146|rtsp://183.59.156.50/PLTV/88888888/224/3221229774......... 啥播放器都播放不了

格式是对的,igmp和rtsp分属两种协议,前者需要配置好组播才能播放,rtsp需要配IP段分流。

VictoriousRaptor commented 1 year ago

似乎今年鉴权信息更新很频繁,隔几个星期就要重新抓一次。我需求不高还可以接受。请问有没有自动化的解决方案呢?

请问线应该怎么接?广州电信,机顶盒是单独拨号看电视,选的ipoe拨号电视才有画面,如果设置为静态ip,电视没画面,没法抓包。

我的解决方案,仅供参考:路由器双wan口pppoe拨号,一个接光猫lan,一个接iptv口,将183.59.0.0/16分流到iptv口

抓到时这种格式吗?igmp://239.77.0.86:5146|rtsp://183.59.156.50/PLTV/88888888/224/3221229774......... 啥播放器都播放不了

删掉igmp://239.77.0.86:5146|,potplayer可以直接播rtsp协议。

Archeb commented 1 year ago

似乎今年鉴权信息更新很频繁,隔几个星期就要重新抓一次。我需求不高还可以接受。请问有没有自动化的解决方案呢?

博客最新一篇文章写了关于重放鉴权来获取Cookies并且获取播放列表的方法,可以稍微改一下代码把这个过程自动化,存储到服务器上,然后用DIYP影音的自动更新播放列表功能加载。

androidcn commented 10 months ago

我昨天尝试抓包,压根没找到 POST /EPG/jsp/getchannellistHWCTC.jsp 这个请求,怎么办 被封了吗

cunhan commented 10 months ago

@androidcn 我昨天尝试抓包,压根没找到 POST /EPG/jsp/getchannellistHWCTC.jsp 这个请求,怎么办 被封了吗

如果你已经弄好了路由器(或者软路由)iptv拨号,可以直接使用tellyget-gd( https://github.com/yujincheng08/tellyget-gd )这个工具抓取广东电信的iptv源。

androidcn commented 10 months ago

@androidcn 我昨天尝试抓包,压根没找到 POST /EPG/jsp/getchannellistHWCTC.jsp 这个请求,怎么办 被封了吗

如果你已经弄好了路由器(或者软路由)iptv拨号,可以直接使用tellyget-gd( https://github.com/yujincheng08/tellyget-gd )这个工具抓取广东电信的iptv源。

没搞懂

fejich commented 10 months ago

@cunhan

@androidcn 我昨天尝试抓包,压根没找到 POST /EPG/jsp/getchannellistHWCTC.jsp 这个请求,怎么办 被封了吗

如果你已经弄好了路由器(或者软路由)iptv拨号,可以直接使用tellyget-gd( https://github.com/yujincheng08/tellyget-gd )这个工具抓取广东电信的iptv源。

尝试了下,通过 docker 跑 python:3.9-slim 运行 tellyget-config 报错

tellyget-config 2020.04.12.cap XX:XX:XX:XX:XX:XX tellyget.conf
Parsing dhcp request
Traceback (most recent call last):
  File "/usr/local/bin/tellyget-config", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/site-packages/tellyget/tellyget_config.py", line 26, in main
    generator.parse()
  File "/usr/local/lib/python3.9/site-packages/tellyget/generator.py", line 20, in parse
    self.dhcp_request = self.parse_dhcp_request()
  File "/usr/local/lib/python3.9/site-packages/tellyget/generator.py", line 26, in parse_dhcp_request
    return self.tshark.get_dhcp_requests(self.stb_mac)[0]
  File "/usr/local/lib/python3.9/site-packages/tellyget/utils/tshark.py", line 42, in get_dhcp_requests
    return self.filter('dhcp.option.dhcp == 3', fields=[
  File "/usr/local/lib/python3.9/site-packages/tellyget/utils/tshark.py", line 21, in filter
    stdout = command.execute(*cmd)
  File "/usr/local/lib/python3.9/site-packages/tellyget/utils/command.py", line 8, in execute
    raise RuntimeError(stderr.decode('utf-8'))

玩不转这个软件,Python 脚本硬件路由器不好跑 这软件的依赖挺多,而且还挑 Python 版本

cunhan commented 10 months ago

@cunhan

@androidcn 我昨天尝试抓包,压根没找到 POST /EPG/jsp/getchannellistHWCTC.jsp 这个请求,怎么办 被封了吗

如果你已经弄好了路由器(或者软路由)iptv拨号,可以直接使用tellyget-gd( https://github.com/yujincheng08/tellyget-gd )这个工具抓取广东电信的iptv源。

尝试了下,通过 docker 跑 python:3.9-slim 运行 tellyget-config 报错

tellyget-config 2020.04.12.cap XX:XX:XX:XX:XX:XX tellyget.conf
Parsing dhcp request
Traceback (most recent call last):
  File "/usr/local/bin/tellyget-config", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/site-packages/tellyget/tellyget_config.py", line 26, in main
    generator.parse()
  File "/usr/local/lib/python3.9/site-packages/tellyget/generator.py", line 20, in parse
    self.dhcp_request = self.parse_dhcp_request()
  File "/usr/local/lib/python3.9/site-packages/tellyget/generator.py", line 26, in parse_dhcp_request
    return self.tshark.get_dhcp_requests(self.stb_mac)[0]
  File "/usr/local/lib/python3.9/site-packages/tellyget/utils/tshark.py", line 42, in get_dhcp_requests
    return self.filter('dhcp.option.dhcp == 3', fields=[
  File "/usr/local/lib/python3.9/site-packages/tellyget/utils/tshark.py", line 21, in filter
    stdout = command.execute(*cmd)
  File "/usr/local/lib/python3.9/site-packages/tellyget/utils/command.py", line 8, in execute
    raise RuntimeError(stderr.decode('utf-8'))

玩不转这个软件,Python 脚本硬件路由器不好跑 这软件的依赖挺多,而且还挑 Python 版本

如果你是广东电信,不要下载原版的tellyget(我看了下代码这个项目针对的是自动获取ip的地区,要配置option那种),要下载tellyget-gd(这个项目则是针对ppp拨号的地区)。直接下载源码包,不要用readme里的pip安装。

跑路由器我也不懂,不过你可以先用电脑跑起来看看 python setup.py install (这步会自动安装所有依赖的了) 假设你的路由器已经配置好iptv拨号,可以直接访问iptv内网,执行以下命令即可生成iptv.m3u,无需提供cap抓包文件分析。 tellyget.exe --user xxxxx(类似固话号码那个账号) --password xxxxx --mac XX:D8:F3:73:09:YY(你的机顶盒MAC)

fejich commented 10 months ago

@cunhan

如果你是广东电信,不要下载原版的tellyget(我看了下代码这个项目针对的是自动获取ip的地区,要配置option那种),要下载tellyget-gd(这个项目则是针对ppp拨号的地区)。直接下载源码包,不要用readme里的pip安装。

跑路由器我也不懂,不过你可以先用电脑跑起来看看 python setup.py install (这步会自动安装所有依赖的了) 假设你的路由器已经配置好iptv拨号,可以直接访问iptv内网,执行以下命令即可生成iptv.m3u,无需提供cap抓包文件分析。 tellyget.exe --user xxxxx(类似固话号码那个账号) --password xxxxx --mac XX:D8:F3:73:09:YY(你的机顶盒MAC)

感谢大佬指导,同样的 Docker 环境成功运行获取到 m3u 直播地址了

tellyget -u 0758xxxxxxx -p xxxxx -m xx:xx:xx:xx:xx:xx

Namespace(user='0758xxxxxxx', passwd='xxxxx', mac='xx:xx:xx:xx:xx:xx', imei='', address='', interface=None, authurl='http://eds.iptv.gd.cn:8082/EDS/jsp/AuthenticationURL', output='iptv.m3u', filter=['^\\d+$'], all_channel=False)
base_url: http://125.88.80.41:8082
Found 225 channels
Filtered 0 channels
Removed 39 SD candidate channels
Playlist saved to /workspace/iptv.m3u

软件输出的 m3u 播放列表还得额外编辑下才能正常使用

使用 sed 命令删除不必要字段

#删除 igmp 组播源,只保留 rtsp 单播源
sed 's/^igmp.*rtsp/rtsp/' -i iptv.m3u

#删除 zoneoffset=0 字段,解决单播流时间与实际时间不对应的问题
sed 's/zoneoffset=0&icpid/icpid/' -i iptv.m3u

测试环境:广东肇庆电信

jwdsch commented 8 months ago

@Archeb

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

在路由器上同时拨公网+IPTV的pppoe然后把183段分流过去即可,我一直是这么做的。

楼主想问一下,openwrt上可以分流183网段嘛?不懂得怎么操作!貌似ikuai的分流相对简单一些。小白跟大神请教一下!

cunhan commented 8 months ago

@Archeb

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

在路由器上同时拨公网+IPTV的pppoe然后把183段分流过去即可,我一直是这么做的。

楼主想问一下,openwrt上可以分流183网段嘛?不懂得怎么操作!貌似ikuai的分流相对简单一些。小白跟大神请教一下!

网络-》静态路由,添加183.59.0.0/255.255.0.0(单播网段)和125.88.0.0/255.255.0.0(组播网段)走iptv接口就可以。

jwdsch commented 8 months ago

@cunhan

@Archeb

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

在路由器上同时拨公网+IPTV的pppoe然后把183段分流过去即可,我一直是这么做的。

楼主想问一下,openwrt上可以分流183网段嘛?不懂得怎么操作!貌似ikuai的分流相对简单一些。小白跟大神请教一下!

网络-》静态路由,添加183.59.0.0/255.255.0.0(单播网段)和125.88.0.0/255.255.0.0(组播网段)走iptv接口就可以。

过年楼主也热情给我回复!真心感谢。按您的指点搞定了RTPS的分流。非常感谢,顺便祝您龙年万事顺意,所盼皆实现!

enjoyland-github commented 2 months ago

@fejich

@cunhan

如果你是广东电信,不要下载原版的tellyget(我看了下代码这个项目针对的是自动获取ip的地区,要配置option那种),要下载tellyget-gd(这个项目则是针对ppp拨号的地区)。直接下载源码包,不要用readme里的pip安装。

跑路由器我也不懂,不过你可以先用电脑跑起来看看 python setup.py install (这步会自动安装所有依赖的了) 假设你的路由器已经配置好iptv拨号,可以直接访问iptv内网,执行以下命令即可生成iptv.m3u,无需提供cap抓包文件分析。 tellyget.exe --user xxxxx(类似固话号码那个账号) --password xxxxx --mac XX:D8:F3:73:09:YY(你的机顶盒MAC)

感谢大佬指导,同样的 Docker 环境成功运行获取到 m3u 直播地址了

tellyget -u 0758xxxxxxx -p xxxxx -m xx:xx:xx:xx:xx:xx

Namespace(user='0758xxxxxxx', passwd='xxxxx', mac='xx:xx:xx:xx:xx:xx', imei='', address='', interface=None, authurl='http://eds.iptv.gd.cn:8082/EDS/jsp/AuthenticationURL', output='iptv.m3u', filter=['^\\d+$'], all_channel=False)
base_url: http://125.88.80.41:8082
Found 225 channels
Filtered 0 channels
Removed 39 SD candidate channels
Playlist saved to /workspace/iptv.m3u

软件输出的 m3u 播放列表还得额外编辑下才能正常使用

使用 sed 命令删除不必要字段

#删除 igmp 组播源,只保留 rtsp 单播源
sed 's/^igmp.*rtsp/rtsp/' -i iptv.m3u

#删除 zoneoffset=0 字段,解决单播流时间与实际时间不对应的问题
sed 's/zoneoffset=0&icpid/icpid/' -i iptv.m3u

测试环境:广东肇庆电信

@fejich

@cunhan

如果你是广东电信,不要下载原版的tellyget(我看了下代码这个项目针对的是自动获取ip的地区,要配置option那种),要下载tellyget-gd(这个项目则是针对ppp拨号的地区)。直接下载源码包,不要用readme里的pip安装。

跑路由器我也不懂,不过你可以先用电脑跑起来看看 python setup.py install (这步会自动安装所有依赖的了) 假设你的路由器已经配置好iptv拨号,可以直接访问iptv内网,执行以下命令即可生成iptv.m3u,无需提供cap抓包文件分析。 tellyget.exe --user xxxxx(类似固话号码那个账号) --password xxxxx --mac XX:D8:F3:73:09:YY(你的机顶盒MAC)

感谢大佬指导,同样的 Docker 环境成功运行获取到 m3u 直播地址了

tellyget -u 0758xxxxxxx -p xxxxx -m xx:xx:xx:xx:xx:xx

Namespace(user='0758xxxxxxx', passwd='xxxxx', mac='xx:xx:xx:xx:xx:xx', imei='', address='', interface=None, authurl='http://eds.iptv.gd.cn:8082/EDS/jsp/AuthenticationURL', output='iptv.m3u', filter=['^\\d+$'], all_channel=False)
base_url: http://125.88.80.41:8082
Found 225 channels
Filtered 0 channels
Removed 39 SD candidate channels
Playlist saved to /workspace/iptv.m3u

软件输出的 m3u 播放列表还得额外编辑下才能正常使用

使用 sed 命令删除不必要字段

#删除 igmp 组播源,只保留 rtsp 单播源
sed 's/^igmp.*rtsp/rtsp/' -i iptv.m3u

#删除 zoneoffset=0 字段,解决单播流时间与实际时间不对应的问题
sed 's/zoneoffset=0&icpid/icpid/' -i iptv.m3u

测试环境:广东肇庆电信

按照上述方法折腾好久没搞好,请教各位大佬: 广东深圳电信,路由器PPPOE拨号IPTV,然后路由器上OPENWRT安装MSD(Multi Stream Daemon Lite)做协议转换,平时用来给手机电脑通过路由器的WIFI看组播,能正常播放。看到上面资料以后想来看单播,于是折腾起来了。

上述网络环境不变,在路由器下接的电脑上用Ubuntu 上的python3安装tellyget-gd,该电脑能正常播放组播,执行命令以后等待十来分钟提示以下错误,python3下更新源的时候网络正常。

请各位老大指点:

tellyget -u 07551XXXX@iptv.gd -p 891XXXX -m 64:9A:08:XX:XX:73 Namespace(user='07551XXXX@iptv.gd', passwd='891XXXX', mac='64:9A:08:XX:XX:73', imei='', address='', interface=None, authurl='http://eds.iptv.gd.cn:8082/EDS/jsp/AuthenticationURL', output='iptv.m3u', filter=['^\d+$'], all_channel=False)

Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connection.py", line 196, in _new_conn sock = connection.create_connection( File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/util/connection.py", line 85, in create_connection raise err File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/util/connection.py", line 73, in create_connection sock.connect(sa) OSError: [Errno 101] Network is unreachable

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connectionpool.py", line 789, in urlopen response = self._make_request( File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connectionpool.py", line 495, in _make_request conn.request( File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connection.py", line 398, in request self.endheaders() File "/usr/lib/python3.10/http/client.py", line 1278, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.10/http/client.py", line 1038, in _send_output self.send(msg) File "/usr/lib/python3.10/http/client.py", line 976, in send self.connect() File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connection.py", line 236, in connect self.sock = self._new_conn() File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connection.py", line 211, in _new_conn raise NewConnectionError( urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f2c6a9bf430>: Failed to establish a new connection: [Errno 101] Network is unreachable

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/requests-2.32.3-py3.10.egg/requests/adapters.py", line 667, in send resp = conn.urlopen( File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/connectionpool.py", line 843, in urlopen retries = retries.increment( File "/usr/local/lib/python3.10/dist-packages/urllib3-2.2.2-py3.10.egg/urllib3/util/retry.py", line 519, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='eds.iptv.gd.cn', port=8082): Max retries exceeded with url: /EDS/jsp/AuthenticationURL?UserID=07551XXXXX%40iptv.gd&Action=Login (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f2c6a9bf430>: Failed to establish a new connection: [Errno 101] Network is unreachable'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/usr/local/bin/tellyget", line 33, in sys.exit(load_entry_point('tellyget==1.0.0', 'console_scripts', 'tellyget')()) File "/usr/local/lib/python3.10/dist-packages/tellyget-1.0.0-py3.10.egg/tellyget/tellyget.py", line 25, in main File "/usr/local/lib/python3.10/dist-packages/tellyget-1.0.0-py3.10.egg/tellyget/auth.py", line 19, in authenticate File "/usr/local/lib/python3.10/dist-packages/tellyget-1.0.0-py3.10.egg/tellyget/auth.py", line 36, in get_base_url File "/usr/local/lib/python3.10/dist-packages/requests-2.32.3-py3.10.egg/requests/sessions.py", line 602, in get return self.request("GET", url, kwargs) File "/usr/local/lib/python3.10/dist-packages/requests-2.32.3-py3.10.egg/requests/sessions.py", line 589, in request resp = self.send(prep, send_kwargs) File "/usr/local/lib/python3.10/dist-packages/requests-2.32.3-py3.10.egg/requests/sessions.py", line 703, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python3.10/dist-packages/requests-2.32.3-py3.10.egg/requests/adapters.py", line 700, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host='eds.iptv.gd.cn', port=8082): Max retries exceeded with url: /EDS/jsp/AuthenticationURL?UserID=07551XXXXX%40iptv.gd&Action=Login (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f2c6a9bf430>: Failed to establish a new connection: [Errno 101] Network is unreachable'

cunhan commented 2 months ago

@Archeb

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

在路由器上同时拨公网+IPTV的pppoe然后把183段分流过去即可,我一直是这么做的。

楼主想问一下,openwrt上可以分流183网段嘛?不懂得怎么操作!貌似ikuai的分流相对简单一些。小白跟大神请教一下!

网络-》静态路由,添加183.59.0.0/255.255.0.0(单播网段)和125.88.0.0/255.255.0.0(组播网段)走iptv接口就可以。

应该是没做ip分流吧。

enjoyland-github commented 2 months ago

@cunhan

@Archeb

@VictoriousRaptor 这两天突然不行了,测试下来之前爬的地址在宽带公网下不能用了,电脑PPPoe拨iptv能用

在路由器上同时拨公网+IPTV的pppoe然后把183段分流过去即可,我一直是这么做的。

楼主想问一下,openwrt上可以分流183网段嘛?不懂得怎么操作!貌似ikuai的分流相对简单一些。小白跟大神请教一下!

网络-》静态路由,添加183.59.0.0/255.255.0.0(单播网段)和125.88.0.0/255.255.0.0(组播网段)走iptv接口就可以。

应该是没做ip分流吧。

应该是分流没做好,还没研究出来那个静态路由要怎么设置,我直接用电脑PPPOE拨号是可以完成抓包流程的,新问题来了:大概1秒钟就完成了,什么都没抓到: root@DESKTOP:/mnt/c/WINDOWS/system32# tellyget -u 075512@iptv.gd -p 89 -m 64:9A:08 Namespace(user='075512@iptv.gd', passwd='89', mac='64:9A:08', imei='', address='', interface=None, authurl='http://eds.iptv.gd.cn:8082/EDS/jsp/AuthenticationURL', output='iptv.m3u', filter=['^\d+$'], all_channel=False) base_url: http://183.59.160.42:8082 Found 0 channels Filtered 0 channels Removed 0 SD candidate channels Playlist saved to /mnt/c/WINDOWS/system32/iptv.m3u

每次抓到结果都一样,只是base_url: http://183.59后面的IP地址会变化,还请指点

cunhan commented 2 months ago

我这边的用户名是纯数字的,没有@后面那些。

enjoyland-github commented 2 months ago

@cunhan 我这边的用户名是纯数字的,没有@后面那些。

是这个问题,删除就下载成功了,感谢:@ 不过单播源没播放起来,我再研究研究

cunhan commented 2 months ago

单播源地址还要编辑一下才能用,本贴往前看有解决方法。

enjoyland-github commented 2 months ago

@cunhan 单播源地址还要编辑一下才能用,本贴往前看有解决方法。

终于搞定了,之前怎么修改分流都没有用,最后发现是防火墙那里:IPTV 没有勾选 IP 动态伪装