import re
import requests

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    "Referer": "https://www.douyin.com/"
}

COOKIE = ""  # 如果 API 需要认证，填入浏览器获取的 sessionid


def get_real_url(url):
    """解析短链接"""
    try:
        response = requests.get(url, headers=HEADERS, allow_redirects=False)
        if response.status_code == 302:
            return response.headers.get("Location")
        elif response.status_code == 200:
            return url  # 有些链接直接是完整的
        else:
            print("⚠️ 短链接解析失败")
            return None
    except requests.RequestException as e:
        print(f"⚠️ 网络错误: {e}")
        return None


def get_video_info(video_url):
    """解析视频页面获取视频 ID"""
    try:
        video_id_match = re.search(r"video/(\d+)", video_url)
        if not video_id_match:
            print("⚠️ 无法提取视频 ID")
            return None

        video_id = video_id_match.group(1)
        api_url = f"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={video_id}"

        headers = HEADERS.copy()
        if COOKIE:
            headers["Cookie"] = COOKIE

        response = requests.get(api_url, headers=headers)
        if response.status_code != 200:
            print(f"⚠️ 请求失败: {response.status_code}")
            return None

        try:
            data = response.json()
        except ValueError:
            print("⚠️ 服务器返回非 JSON 格式数据，可能被拦截")
            print("🔍 响应内容:", response.text[:500])  # 打印部分返回内容，方便调试
            return None

        if "item_list" in data and data["item_list"]:
            return data["item_list"][0]
        else:
            print("⚠️ 服务器返回空数据，可能需要登录")
            return None

    except requests.RequestException as e:
        print(f"⚠️ 网络请求失败: {e}")
        return None


def main():
    while True:
        url = input("请输入视频链接地址(输入 0 退出)：").strip()
        if url == "0":
            break

        final_url = get_real_url(url)
        if final_url:
            print(f"🔄 最终跳转 URL: {final_url}")
            video_info = get_video_info(final_url)
            if video_info:
                title = video_info.get("desc", "未知标题")
                video_url = video_info["video"]["play_addr"]["url_list"][0]
                print(f"🎬 视频标题: {title}")
                print(f"📥 视频地址: {video_url}")
            else:
                print("⚠️ 获取视频信息失败，请检查链接！")
        else:
            print("⚠️ 解析短链接失败！")


if __name__ == "__main__":
    main()
