
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import customtkinter as ctk
import requests
import webbrowser
from datetime import datetime
# 全局配置
ctk.set_appearance_mode("dark") # 深色主题 dark/light/system
ctk.set_default_color_theme("blue") # 蓝系美观配色
# 主流免费解析接口(多备用,失效自动切换)
API_LIST = [
"https://bfq.txnp.cn/player?route=%E6%B5%8B%E8%AF%95%E7%BA%BF%E8%B7%AF1&url=",
'https://jx.dmflv.cc/?url='
"https://jx.xmflv.com/?url=",
"https://bfq.txnp.cn/player?route=4K1&url=",
"https://super.playr.top/?url=",
]
class VIPVideoPlayerGUI:
def __init__(self, root):
self.root = root
self.root.title("全能VIP视频解析播放器 | 无广告看全站会员视频")
self.root.geometry("1000x700")
self.root.resizable(True, True)
# 存储当前接口下标
self.api_index = 0
self.init_widgets()
def init_widgets(self):
# 主标题
title_label = ctk.CTkLabel(
self.root,
text="🎬 全网VIP视频免费解析工具",
font=("微软雅黑", 24, "bold")
)
title_label.pack(pady=20)
# 输入容器框架
input_frame = ctk.CTkFrame(self.root, width=900, height=120)
input_frame.pack(pady=10, padx=20, fill="x")
ctk.CTkLabel(input_frame, text="视频链接(爱奇艺/腾讯/优酷/芒果/B站):", font=("微软雅黑",14)).place(x=20, y=15)
# 链接输入框
self.link_entry = ctk.CTkEntry(
input_frame,
width=720,
height=40,
placeholder_text="粘贴需要观看的VIP视频完整网址..."
)
self.link_entry.place(x=20, y=50)
# 功能按钮行
btn_frame = ctk.CTkFrame(self.root, width=900, height=80)
btn_frame.pack(pady=5, padx=20, fill="x")
# 解析播放按钮
parse_btn = ctk.CTkButton(
btn_frame,
text="▶ 一键解析播放",
width=180,
height=40,
font=("微软雅黑",13,"bold"),
command=self.parse_video
)
parse_btn.place(x=30, y=18)
# 清空输入
clear_btn = ctk.CTkButton(
btn_frame,
text="🗑 清空输入",
width=130,
height=40,
fg_color="#555555",
command=self.clear_input
)
clear_btn.place(x=240, y=18)
# 复制解析链接
copy_btn = ctk.CTkButton(
btn_frame,
text="📋 复制播放地址",
width=130,
height=40,
fg_color="#208860",
command=self.copy_play_url
)
copy_btn.place(x=400, y=18)
# 切换解析接口
switch_api_btn = ctk.CTkButton(
btn_frame,
text="🔄 切换解析线路",
width=160,
height=40,
fg_color="#9040c0",
command=self.switch_api
)
switch_api_btn.place(x=560, y=18)
# 打开本地浏览器播放
browser_btn = ctk.CTkButton(
btn_frame,
text="🌐 浏览器全屏播放",
width=160,
height=40,
fg_color="#c05030",
command=self.open_browser_play
)
browser_btn.place(x=740, y=18)
# 播放地址展示区
play_frame = ctk.CTkFrame(self.root, width=900, height=100)
play_frame.pack(pady=10, padx=20, fill="x")
ctk.CTkLabel(play_frame, text="解析完成播放地址:", font=("微软雅黑",14)).place(x=20, y=12)
self.play_url_var = tk.StringVar(value="暂无解析链接")
self.play_url_label = ctk.CTkLabel(
play_frame,
textvariable=self.play_url_var,
font=("微软雅黑",12),
text_color="#66ccff"
)
self.play_url_label.place(x=20, y=50)
# 运行日志区域
log_frame = ctk.CTkFrame(self.root, width=900)
log_frame.pack(pady=10, padx=20, fill="both", expand=True)
ctk.CTkLabel(log_frame, text="运行日志 / 解析记录:", font=("微软雅黑",14)).pack(anchor="w", padx=15, pady=8)
self.log_text = scrolledtext.ScrolledText(log_frame, bg="#1a1a1a", fg="#00ee00", font=("Consolas",11))
self.log_text.pack(padx=15, pady=5, fill="both", expand=True)
# 底部信息栏
tip_label = ctk.CTkLabel(
self.root,
text="提示:接口为第三方免费解析,部分版权视频可能解析失败,切换线路重试",
text_color="#ff9966",
font=("微软雅黑",11)
)
tip_label.pack(pady=10)
# 缓存解析后的播放链接
self.current_play_url = ""
def add_log(self, msg):
"""写入日志"""
time_str = datetime.now().strftime("%H:%M:%S")
log_msg = f"[{time_str}] {msg}\n"
self.log_text.insert(tk.END, log_msg)
self.log_text.see(tk.END)
self.root.update()
def clear_input(self):
"""清空输入框"""
self.link_entry.delete(0, tk.END)
self.play_url_var.set("暂无解析链接")
self.current_play_url = ""
self.add_log("已清空所有输入与播放地址")
def switch_api(self):
"""切换解析线路"""
self.api_index = (self.api_index + 1) % len(API_LIST)
self.add_log(f"已切换解析线路,当前接口:{API_LIST[self.api_index]}")
messagebox.showinfo("线路切换", f"当前使用第{self.api_index+1}条解析接口")
def parse_video(self):
"""核心解析逻辑"""
video_url = self.link_entry.get().strip()
if not video_url:
messagebox.showwarning("输入为空", "请粘贴爱奇艺/腾讯/优酷等视频链接!")
return
# 校验链接平台
support_domain = ["iqiyi", "qq.com", "youku", "mgtv", "bilibili", "le"]
if not any(domain in video_url for domain in support_domain):
self.add_log("警告:链接不属于支持的视频平台,可能解析失败")
api = API_LIST[self.api_index]
full_parse_url = api + video_url
self.add_log(f"开始解析,请求地址:{full_parse_url}")
try:
# 请求解析接口
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36"
}
resp = requests.get(full_parse_url, headers=headers, timeout=10)
resp.raise_for_status()
# 拼接最终播放页面
self.current_play_url = full_parse_url
self.play_url_var.set(self.current_play_url)
self.add_log("✅ 解析成功!可复制地址或浏览器播放")
except requests.exceptions.Timeout:
self.add_log("❌ 解析超时,当前线路失效,请切换线路重试")
messagebox.showerror("超时", "接口请求超时,请点击【切换解析线路】")
except Exception as e:
self.add_log(f"❌ 解析失败:{str(e)}")
messagebox.showerror("解析错误", f"解析失败:{str(e)}\n更换线路再试!")
def copy_play_url(self):
"""复制播放链接到剪贴板"""
if not self.current_play_url:
messagebox.showinfo("提示", "暂无解析完成的播放地址!")
return
self.root.clipboard_clear()
self.root.clipboard_append(self.current_play_url)
self.add_log("已复制播放链接至剪贴板")
messagebox.showinfo("复制成功", "播放地址已复制,可粘贴浏览器打开")
def open_browser_play(self):
"""调用默认浏览器打开解析播放页"""
if not self.current_play_url:
messagebox.showinfo("提示", "请先解析视频!")
return
webbrowser.open(self.current_play_url)
self.add_log("已在默认浏览器打开播放器页面")
if __name__ == "__main__":
app = ctk.CTk()
window = VIPVideoPlayerGUI(app)
app.mainloop()