之前抓取IPTV播放列表都是用Openwrt的端口镜像，配合台式机去抓包的，但是每次这样弄都好麻烦了，路由器，机顶盒，电脑都要用网线连接在一起，主力机变成XPS 15后，没有网口就显得更麻烦了。此时就想起tcpdump了，这货不是能把所有数据包全抓下来吗，在路由器搞一搞就好了！家里用的是软路由，弄个tcpdump还是很简单的，但是老人家里用的是K2P，还没硬改过的，装这个包和对应依赖空间有压力啊。。。Google一番，没找到能用的tcpdump静态链接版本，又是DIY时刻了。K2P刷的是高恪的固件，基于openwrt 14.07的，找到对应SDK和Toolchain，参照之前的高恪插件编译教程弄起来了，却发现没有tcpdump这个包，搜索一番得知在base这个repo，SDK默认是没有添加这个repo的.Openwrt 14.07也算是年代久远了，费劲一番才找到这个repo的源git://git.archive.openwrt.org/14.07/openwrt.git添加后就是常规操作./script/feeds update ./script/feeds install先按照官方动态链接的方式编译一遍看会不会出错。make -j16 package/network/utils/tcpdump compile成功编译后，看到依赖库libpcap把静态链接库也编译出来了。接下来就是尝试编译静态链接的tcpdump了只需要对Makefile稍作改动 49 CONFIGURE_ARGS += \ 50 --without-crypto 51 52 ifeq ($(CONFIG_IPV6),y) 53 CONFIGURE_ARGS += \ 54 --enable-ipv6 55 endif 56 57 TARGET_CFLAGS += -ffunction-sections -fdata-sections 58 TARGET_LDFLAGS += -Wl,--gc-sections 59 60 CONFIGURE_VARS += \ 61 BUILD_CC="$(TARGET_CC)" \ 62 HOSTCC="$(HOSTCC)" \ 63 td_cv_buggygetaddrinfo="no" \ 64 ac_cv_linux_vers=$(LINUX_VERSION) \ 65 ac_cv_header_rpc_rpcent_h=no \ 66 ac_cv_lib_rpc_main=no \ 67 ac_cv_path_PCAP_CONFIG="" 68 69 MAKE_FLAGS :=改成 49 CONFIGURE_ARGS += \ 50 --without-crypto 51 52 ifeq ($(CONFIG_IPV6),y) 53 CONFIGURE_ARGS += \ 54 --enable-ipv6 55 endif 56 57 TARGET_CFLAGS += -ffunction-sections -fdata-sections 58 TARGET_LDFLAGS += -static -Wl,--gc-sections 59 60 CONFIGURE_VARS += \ 61 BUILD_CC="$(TARGET_CC)" \ 62 HOSTCC="$(HOSTCC)" \ 63 td_cv_buggygetaddrinfo="no" \ 64 ac_cv_linux_vers=$(LINUX_VERSION) \ 65 ac_cv_header_rpc_rpcent_h=no \ 66 ac_cv_lib_rpc_main=no \ 67 ac_cv_path_PCAP_CONFIG="" 68 69 MAKE_FLAGS :=再次执行编译命令就可以了。make -j16 package/network/utils/tcpdump compile编译好的静态链接tcpdump和tcpdump-mini二进制附上。在路由器上开始抓到包tcpdump -i br-lan -s 0 -w iptv.pcap host 192.168.2.113完了用scp把抓包文件传回到Mac上，直接用Charles就可以打开。我这边都是rtsp协议的直播，所以直接查找关键词rtsp就可以找到列表页了，找到以后就是用正则提取一下电视台名称和播放地址。用到的正则也很简单ChannelName="(.*?)".*ChannelURL="(?:.*?((?:rtsp|http).*?(?:smil|m3u8).*?END.*?))"，最后就是根据个人习惯调整一下列表的顺序了。广东电信这里抓到的播放列表在此。