import re
import requests

# 抖音视频页面的 Headers，避免被拦截
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
COOKIE = ""  # 例如："sessionid=xxxxxxxxxxxxx;"


def get_real_url(url):
    """ 解析短链接，获取最终跳转的 URL """
    try:
        response = requests.get(url, headers=HEADERS, allow_redirects=False)
        if response.status_code == 302:  # 短链接重定向
            return response.headers.get("Location")
        else:
            print("⚠️ 重定向失败，检查 URL 是否有效")
            return None
    except requests.RequestException as e:
        print(f"⚠️ 请求失败: {e}")
        return None


def get_video_info(video_url):
    """ 解析抖音视频页面，获取视频信息 """
    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.douyin.com/web/api/v2/aweme/iteminfo/?item_ids={video_id}"

        headers = HEADERS.copy()
        if COOKIE:
            headers["Cookie"] = COOKIE  # 如果需要登录，就带上 Cookie

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

        data = response.json()
        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
    except ValueError:
        print("⚠️ 响应非 JSON 格式，可能被拦截")
        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()
