跳至正文
  • 6 views
  • 3 min read

电信 IPTV 电视频道扫描脚本

新浪微博 豆瓣 QQ 百度贴吧 QQ空间

电信 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

发表回复

联系站长