网上找了很多资料都不对。无奈自己分析。

tvgname.png

m3u8本质上是一个列表,动态输出的。大概格式如下:

 curl http://121.19.134.82:808/tsfile/live/1030_1.m3u8
#EXTM3U
##EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:15952719
#EXTINF:5, no desc
live_1030_1_15952715.ts?key=txiptv&key2=15952715
#EXTINF:5, no desc
live_1030_1_15952716.ts?key=txiptv&key2=15952716
#EXTINF:5, no desc
live_1030_1_15952717.ts?key=txiptv&key2=15952717
#EXTINF:5, no desc
live_1030_1_15952718.ts?key=txiptv&key2=15952718
#EXTINF:5, no desc
live_1030_1_15952719.ts?key=txiptv&key2=15952719

可以看到这里面,是没有任何信息的。
于是我把ts文件下载回来,这就是一个小的视频片段。
vlc打开,是有标题信息的,所以,其实是藏在这个ts文件里面了。
010editor打开这个文件,搜索ASCII码,比如我搜“CCTV”。
tvgname1.png
发现都是藏在一堆的0xFF前面。于是找规律,写代码,做测试。
最终成品如下:

import binascii
import sys
import re


def find_all_contiguous_ff(file_path, target_length=144, preceding_bytes=20):
    with open(file_path, 'rb') as file:
        data = file.read()

    # 十六进制的 FF 字符串
    target_hex = b'\xFF' * target_length

    # 查找所有连续的 FF
    start_index = 0
    results = []

    while True:
        index = data.find(target_hex, start_index)
        if index == -1:
            break

        # 提取前面的 20 个字节
        preceding_start_index = max(0, index - preceding_bytes)
        preceding_data = data[preceding_start_index:index]

        # 转换为十六进制字符串
        preceding_hex_string = binascii.hexlify(preceding_data).decode('ascii')

        # 使用 binascii.unhexlify 转换为字节串
        preceding_bytes_data = binascii.unhexlify(preceding_hex_string)
        
        results.append(preceding_bytes_data)

        # 更新起始索引,继续查找下一个
        start_index = index + target_length

    if results:
        for idx, result in enumerate(results):
            ss = binascii.hexlify(result).decode("ascii")
            if str(ss[:2])=="01":
                return get_relevant_string(ss)
    else:
        print("没有找到连续的 144 个 FF")


def extract_ascii_from_hex(hex_string):
    # 将十六进制字符串转换为字节串
    byte_data = binascii.unhexlify(hex_string)
    trimmed_byte_data = byte_data[:-4]
    
    # 尝试将字节串解码为 ASCII 字符串
    try:
        decoded_string = trimmed_byte_data.decode('ascii', errors='ignore')
    except UnicodeDecodeError:
        return None

    # 查找所有可能的 ASCII 字符串(假设 ASCII 字符串是由可打印字符组成的)
    # 这里只是一个示例,实际应用中你可能需要根据实际情况调整正则表达式
    ascii_strings = re.findall(r'[ -~]+', decoded_string)

    return ascii_strings

def get_relevant_string(hex_string):
    # 提取 ASCII 字符串
    ascii_strings = extract_ascii_from_hex(hex_string)
    
    # 根据提取的字符串数量返回相应的字符串
    if len(ascii_strings) > 1:
        return ascii_strings[1]
    elif len(ascii_strings) == 1:
        return ascii_strings[0]
    else:
        return "没有找到有效的字符串"


# 使用示例
file_path = sys.argv[1]
find_all_contiguous_ff(file_path)

使用效果:
tvgname2.png

标签: none

添加新评论