电信 IPTV 电视频道扫描脚本,需先通过路由拔号 IPTV 成功后,在脚本中手动指定 IPTV 拔号接口名称,再运行该脚本。
#!/bin/sh
# 深圳电信IPTV扫描脚本 (修正版 - 不使用浮点sleep)
# 单线程串行扫描,确保可靠性
INTERFACE="pppoe-iptvwan"
PORT="5146"
SCAN_TIMEOUT=2
MIN_DATA_BYTES=10000
RESULT_FILE="/tmp/iptv_found_$(date +%s).txt"
# 可靠的检测函数
check_channel() {
local addr=$1
local tmpfile="/tmp/scan_$$.dat"
# 执行检测
timeout $SCAN_TIMEOUT socat -u "UDP4-RECV:$PORT,ip-add-membership=$addr:$INTERFACE" - > "$tmpfile" 2>/dev/null
local exit_code=$?
local data_size=0
if [ -f "$tmpfile" ]; then
data_size=$(wc -c < "$tmpfile" 2>/dev/null)
rm -f "$tmpfile"
fi
# 判断逻辑
if [ $data_size -ge $MIN_DATA_BYTES ]; then
echo "✅ $addr:$PORT (${data_size} 字节)"
echo "$addr:$PORT" >> "$RESULT_FILE"
return 0
elif [ $data_size -gt 0 ]; then
echo "⚠️ $addr:$PORT (数据较少: ${data_size} 字节)"
return 1
else
# 不显示无效地址,减少输出
return 2
fi
}
# 串行扫描函数
serial_scan() {
local base=$1
local start=$2
local end=$3
local total=$((end - start + 1))
local count=0
local found=0
echo "扫描网段: ${base}.${start}-${end}"
echo "进度: 0/$total (0%)"
for i in $(seq $start $end); do
addr="${base}.$i"
count=$((count + 1))
# 每10个地址更新一次进度
if [ $((count % 10)) -eq 0 ] || [ $count -eq $total ]; then
percent=$((count * 100 / total))
printf "\r进度: %d/%d (%d%%)" $count $total $percent
fi
if check_channel "$addr"; then
found=$((found + 1))
fi
done
echo ""
echo "发现 $found 个有效频道"
return $found
}
# 主程序
main() {
echo "========================================"
echo "电信IPTV扫描工具 (串行可靠版)"
echo "========================================"
echo "接口: $INTERFACE"
echo "端口: $PORT"
echo "超时: ${SCAN_TIMEOUT}秒"
echo "最小数据: ${MIN_DATA_BYTES} 字节"
echo "结果文件: $RESULT_FILE"
echo "========================================"
# 清空结果文件
> "$RESULT_FILE"
# 先测试已知有效的地址
echo ""
echo "第一步:验证已知地址 239.77.1.174"
if check_channel "239.77.1.174"; then
echo "✅ 已知地址验证成功"
else
echo "❌ 已知地址验证失败!请检查网络"
exit 1
fi
# 选择扫描范围
echo ""
echo "第二步:选择扫描范围"
echo "1) 扫描 239.77.0.1-254"
echo "2) 扫描 239.77.1.1-254"
echo "3) 扫描 239.253.43.1-254"
echo "4) 扫描三个网段"
echo -n "请选择 [1-4]: "
read choice
start_time=$(date +%s)
case $choice in
1)
serial_scan "239.77.0" 1 254
found=$?
;;
2)
serial_scan "239.77.1" 1 254
found=$?
;;
3)
serial_scan "239.253.43" 1 254
found=$?
;;
4)
echo ""
echo "--- 扫描 239.77.0.0/24 ---"
serial_scan "239.77.0" 1 254
found1=$?
echo ""
echo "--- 扫描 239.77.1.0/24 ---"
serial_scan "239.77.1" 1 254
found2=$?
echo ""
echo "--- 扫描 239.253.43.0/24 ---"
serial_scan "239.253.43" 1 254
found3=$?
found=$((found1 + found2 + found3))
;;
*)
echo "无效选择,使用默认范围"
serial_scan "239.77.0" 1 254
found=$?
;;
esac
end_time=$(date +%s)
duration=$((end_time - start_time))
echo ""
echo "========================================"
echo "扫描完成!"
echo "总耗时: ${duration} 秒"
echo "发现频道总数: ${found} 个"
echo "========================================"
if [ $found -gt 0 ]; then
echo ""
echo "发现频道列表:"
echo "--------------"
sort -t . -k 4n "$RESULT_FILE" | cat -n
echo ""
echo "播放地址示例 (使用udpxy):"
router_ip="192.168.0.254"
udpxy_port="4022"
while read line; do
addr=$(echo "$line" | cut -d: -f1)
echo "http://$router_ip:$udpxy_port/rtp/$addr:$PORT"
done < <(head -5 "$RESULT_FILE")
echo ""
echo "完整列表保存在: $RESULT_FILE"
else
echo "未发现有效频道"
echo "建议: 1) 减小 MIN_DATA_BYTES 值"
echo " 2) 增加 SCAN_TIMEOUT 值"
echo " 3) 检查网络连接"
fi
}
# 运行
main


