本文目录导读:

基于热键的快捷输入脚本(AutoHotkey)
; AutoHotkey 快捷短语管理脚本
; 配置区域
#Persistent
Menu, Tray, Icon, shell32.dll, 132 ; 设置托盘图标
; 定义快捷短语库
global phrases := Object()
; 初始化短语
InitPhrases() {
phrases["@email"] := "your.email@example.com"
phrases["@phone"] := "138-0000-0000"
phrases["@addr"] := "北京市朝阳区xxx街道"
phrases["@name"] := "张三"
phrases["@sig"] := "此致`n敬礼`n张三"
phrases["@date"] := A_YYYY "-" A_MM "-" A_DD
phrases["@time"] := A_Hour ":" A_Min
}
; 初始化
InitPhrases()
; 热键触发(Ctrl+Shift+V 展开)
^+v::
{
; 获取选中文本或输入框内容
input := ""
; 显示选择菜单
Menu, PhraseMenu, Add, 常用短语, MenuHandler
Menu, PhraseMenu, Add ; 分隔线
For key, value in phrases {
Menu, PhraseMenu, Add, %key% - %value%, MenuHandler
}
Menu, PhraseMenu, Show
return
}
MenuHandler:
{
; 获取选择的菜单项
selectedPhrase := A_ThisMenuItem
; 提取快捷码
RegExMatch(selectedPhrase, "^@\w+", code)
if (phrases.HasKey(code)) {
; 发送文本
SendInput % phrases[code]
}
return
}
; 管理界面热键(Ctrl+Shift+M 打开管理窗口)
^+m::
{
Gui, New, , 快捷短语管理
Gui, Add, ListView, r10 w400, 快捷码|内容
For key, value in phrases {
LV_Add("", key, value)
}
LV_ModifyCol(1, 100)
LV_ModifyCol(2, 290)
Gui, Add, Button, gAddPhrase x10 y+10, 添加
Gui, Add, Button, gEditPhrase x+10, 编辑
Gui, Add, Button, gDeletePhrase x+10, 删除
Gui, Add, Button, gExportPhrases x+10, 导出
Gui, Add, Button, gImportPhrases x+10, 导入
Gui, Show
return
}
AddPhrase:
{
Gui, New, , 添加快捷短语
Gui, Add, Text, , 快捷码:
Gui, Add, Edit, vNewCode w200
Gui, Add, Text, , 短语内容:
Gui, Add, Edit, vNewContent w300 r5
Gui, Add, Button, gSavePhrase Default, 保存
Gui, Add, Button, gCancelPhrase x+10, 取消
Gui, Show
return
}
SavePhrase:
{
Gui, Submit
if (NewCode && NewContent) {
phrases["@" . NewCode] := NewContent
Gui, Destroy
; 刷新主界面
gosub ^+m
}
return
}
EditPhrase:
{
; 获取选中的行
LV_GetText(code, LV_GetNext(0, "Focused"), 1)
LV_GetText(content, LV_GetNext(0, "Focused"), 2)
Gui, New, , 编辑快捷短语
Gui, Add, Text, , 快捷码:
Gui, Add, Edit, vEditCode w200, %code%
Gui, Add, Text, , 短语内容:
Gui, Add, Edit, vEditContent w300 r5, %content%
Gui, Add, Button, gUpdatePhrase Default, 更新
Gui, Add, Button, gCancelPhrase x+10, 取消
Gui, Show
return
}
UpdatePhrase:
{
Gui, Submit
if (EditCode && EditContent) {
; 删除旧的
phrases.Delete(EditCode)
; 添加新的
phrases[EditCode] := EditContent
Gui, Destroy
gosub ^+m
}
return
}
DeletePhrase:
{
LV_GetText(code, LV_GetNext(0, "Focused"), 1)
if (code) {
MsgBox, 4, 确认删除, 确定删除快捷短语「%code%」?
IfMsgBox, Yes
{
phrases.Delete(code)
gosub ^+m
}
}
return
}
ExportPhrases:
{
FileSelectFile, exportFile, S16, phrases.json, 导出短语, JSON文件 (*.json)
if (exportFile) {
jsonData := "{"
For key, value in phrases {
jsonData .= """" . key . """: """ . value . ""","
}
jsonData := SubStr(jsonData, 1, StrLen(jsonData)-1) . "}"
FileDelete, %exportFile%
FileAppend, %jsonData%, %exportFile%
MsgBox, 导出成功!
}
return
}
ImportPhrases:
{
FileSelectFile, importFile, 3, , 导入短语, JSON文件 (*.json)
if (importFile) {
FileRead, jsonData, %importFile%
; 简单JSON解析
RegExMatch(jsonData, "\{.*\}", jsonContent)
; 实际开发需要使用JSON库
MsgBox, 导入成功!
gosub ^+m
}
return
}
CancelPhrase:
{
Gui, Destroy
return
}
; 退出
^+q::
{
ExitApp
}
Python版本(适用于跨平台)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
import sys
import keyboard
import pyperclip
from tkinter import *
from tkinter import ttk, messagebox, filedialog
class PhraseManager:
def __init__(self):
self.phrases = {}
self.config_file = "phrases.json"
self.load_phrases()
self.setup_hotkeys()
def load_phrases(self):
"""加载短语配置"""
if os.path.exists(self.config_file):
try:
with open(self.config_file, 'r', encoding='utf-8') as f:
self.phrases = json.load(f)
except:
self.phrases = self.get_default_phrases()
else:
self.phrases = self.get_default_phrases()
self.save_phrases()
def save_phrases(self):
"""保存短语配置"""
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(self.phrases, f, ensure_ascii=False, indent=2)
def get_default_phrases(self):
"""默认短语库"""
return {
"@email": "your.email@example.com",
"@phone": "138-0000-0000",
"@addr": "北京市朝阳区xxx街道",
"@name": "张三",
"@sig": "此致\n敬礼\n张三",
"@date": "__DATE__",
"@time": "__TIME__"
}
def setup_hotkeys(self):
"""设置热键"""
keyboard.add_hotkey('ctrl+shift+v', self.expand_phrase)
keyboard.add_hotkey('ctrl+shift+m', self.open_manager)
def expand_phrase(self):
"""展开快捷短语"""
# 获取当前选中的文本
try:
selected = pyperclip.paste()
# 简单匹配:最近输入的@开头的文本
if selected.startswith('@') and selected in self.phrases:
text = self.phrases[selected]
# 替换日期时间占位符
from datetime import datetime
text = text.replace('__DATE__', datetime.now().strftime('%Y-%m-%d'))
text = text.replace('__TIME__', datetime.now().strftime('%H:%M'))
pyperclip.copy(text)
keyboard.send('ctrl+v')
except:
pass
def open_manager(self):
"""打开管理界面"""
self.window = Tk()
self.window.title("快捷短语管理器")
self.window.geometry("500x400")
# 创建Treeview
self.tree = ttk.Treeview(self.window, columns=('code', 'content'), show='headings')
self.tree.heading('code', text='快捷码')
self.tree.heading('content', text='短语内容')
self.tree.column('code', width=100)
self.tree.column('content', width=350)
# 添加滚动条
scrollbar = ttk.Scrollbar(self.window, orient=VERTICAL, command=self.tree.yview)
self.tree.configure(yscrollcommand=scrollbar.set)
self.tree.pack(side=LEFT, fill=BOTH, expand=True, padx=5, pady=5)
scrollbar.pack(side=RIGHT, fill=Y)
# 刷新数据
self.refresh_tree()
# 按钮
btn_frame = Frame(self.window)
btn_frame.pack(fill=X, padx=5, pady=5)
Button(btn_frame, text="添加", command=self.add_phrase).pack(side=LEFT, padx=2)
Button(btn_frame, text="编辑", command=self.edit_phrase).pack(side=LEFT, padx=2)
Button(btn_frame, text="删除", command=self.delete_phrase).pack(side=LEFT, padx=2)
Button(btn_frame, text="导入", command=self.import_phrases).pack(side=LEFT, padx=2)
Button(btn_frame, text="导出", command=self.export_phrases).pack(side=LEFT, padx=2)
Button(btn_frame, text="刷新", command=self.refresh_tree).pack(side=LEFT, padx=2)
self.window.mainloop()
def refresh_tree(self):
"""刷新列表"""
for item in self.tree.get_children():
self.tree.delete(item)
for code, content in self.phrases.items():
self.tree.insert('', END, values=(code, content[:50] + '...' if len(content) > 50 else content))
def add_phrase(self):
"""添加快捷短语"""
dialog = PhraseDialog(self.window, "添加短语")
if dialog.result:
code, content = dialog.result
if code and content:
self.phrases[code] = content
self.save_phrases()
self.refresh_tree()
def edit_phrase(self):
"""编辑短语"""
selected = self.tree.selection()
if not selected:
messagebox.showwarning("提示", "请先选择要编辑的短语")
return
code = self.tree.item(selected[0])['values'][0]
content = self.phrases.get(code, '')
dialog = PhraseDialog(self.window, "编辑短语", code, content)
if dialog.result:
new_code, new_content = dialog.result
if new_code and new_content:
del self.phrases[code]
self.phrases[new_code] = new_content
self.save_phrases()
self.refresh_tree()
def delete_phrase(self):
"""删除短语"""
selected = self.tree.selection()
if not selected:
messagebox.showwarning("提示", "请先选择要删除的短语")
return
code = self.tree.item(selected[0])['values'][0]
if messagebox.askyesno("确认", f"确定删除短语「{code}」吗?"):
del self.phrases[code]
self.save_phrases()
self.refresh_tree()
def import_phrases(self):
"""导入短语"""
filename = filedialog.askopenfilename(
title="选择导入文件",
filetypes=[("JSON文件", "*.json"), ("所有文件", "*.*")]
)
if filename:
try:
with open(filename, 'r', encoding='utf-8') as f:
imported = json.load(f)
self.phrases.update(imported)
self.save_phrases()
self.refresh_tree()
messagebox.showinfo("成功", "导入成功!")
except Exception as e:
messagebox.showerror("错误", f"导入失败:{str(e)}")
def export_phrases(self):
"""导出短语"""
filename = filedialog.asksaveasfilename(
title="导出短语",
defaultextension=".json",
filetypes=[("JSON文件", "*.json"), ("所有文件", "*.*")]
)
if filename:
try:
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.phrases, f, ensure_ascii=False, indent=2)
messagebox.showinfo("成功", "导出成功!")
except Exception as e:
messagebox.showerror("错误", f"导出失败:{str(e)}")
class PhraseDialog:
"""短语编辑对话框"""
def __init__(self, parent, title, code='', content=''):
self.result = None
self.dialog = Toplevel(parent)
self.dialog.title(title)
self.dialog.geometry("400x200")
Label(self.dialog, text="快捷码:").grid(row=0, column=0, padx=5, pady=5, sticky=W)
self.code_entry = Entry(self.dialog, width=30)
self.code_entry.grid(row=0, column=1, padx=5, pady=5)
self.code_entry.insert(0, code)
Label(self.dialog, text="短语内容:").grid(row=1, column=0, padx=5, pady=5, sticky=NW)
self.content_text = Text(self.dialog, width=30, height=5)
self.content_text.grid(row=1, column=1, padx=5, pady=5)
self.content_text.insert('1.0', content)
Button(self.dialog, text="确定", command=self.ok).grid(row=2, column=0, pady=10)
Button(self.dialog, text="取消", command=self.dialog.destroy).grid(row=2, column=1, pady=10)
self.dialog.grab_set()
self.dialog.wait_window()
def ok(self):
code = self.code_entry.get().strip()
content = self.content_text.get('1.0', END).strip()
if code and content:
self.result = (code, content)
self.dialog.destroy()
else:
messagebox.showwarning("提示", "快捷码和内容不能为空!")
if __name__ == "__main__":
# 安装依赖:pip install keyboard pyperclip
manager = PhraseManager()
# 保持程序运行
try:
keyboard.wait('ctrl+shift+q') # 按Ctrl+Shift+Q退出
except:
pass
Linux/Unix Bash脚本版本
#!/bin/bash
# 快捷短语管理器
# 配置文件
CONFIG_FILE="$HOME/.quick_phrases.conf"
# 默认短语
init_phrases() {
if [[ ! -f "$CONFIG_FILE" ]]; then
cat > "$CONFIG_FILE" << EOF
@email:your.email@example.com
@phone:138-0000-0000
@addr:北京市朝阳区xxx街道
@name:张三
@date:$(date +%Y-%m-%d)
@time:$(date +%H:%M)
EOF
fi
}
# 加载短语
load_phrases() {
if [[ -f "$CONFIG_FILE" ]]; then
while IFS=: read -r code content; do
if [[ -n "$code" && "$code" != "#"* ]]; then
eval "PHRASE_${code#@}='$content'"
fi
done < "$CONFIG_FILE"
fi
}
# 获取短语
get_phrase() {
local code="$1"
local var_name="PHRASE_${code#@}"
echo "${!var_name}"
}
# 主界面
show_menu() {
clear
echo "======================="
echo " 快捷短语管理器 "
echo "======================="
echo "1. 查看所有短语"
echo "2. 添加短语"
echo "3. 编辑短语"
echo "4. 删除短语"
echo "5. 搜索短语"
echo "6. 导出短语"
echo "7. 导入短语"
echo "8. 退出"
echo "======================="
echo -n "请选择操作:"
read choice
case $choice in
1) list_phrases ;;
2) add_phrase ;;
3) edit_phrase ;;
4) delete_phrase ;;
5) search_phrases ;;
6) export_phrases ;;
7) import_phrases ;;
8) exit 0 ;;
*) echo "无效选择" && sleep 2 && show_menu ;;
esac
}
# 列出所有短语
list_phrases() {
clear
echo "所有快捷短语:"
echo "========================"
if [[ -f "$CONFIG_FILE" ]]; then
awk -F: '{printf "%-20s %s\n", $1, $2}' "$CONFIG_FILE"
fi
echo "========================"
echo -n "按回车键继续..."
read
show_menu
}
# 添加短语
add_phrase() {
echo -n "请输入快捷码(如:@sig):"
read code
if [[ -z "$code" ]]; then
echo "快捷码不能为空"
sleep 2
show_menu
return
fi
echo -n "请输入短语内容:"
read content
if grep -q "^$code:" "$CONFIG_FILE" 2>/dev/null; then
echo "快捷码已存在,请使用编辑功能"
else
echo "$code:$content" >> "$CONFIG_FILE"
echo "添加成功!"
fi
sleep 2
show_menu
}
# 编辑短语
edit_phrase() {
echo -n "请输入要编辑的快捷码:"
read code
if grep -q "^$code:" "$CONFIG_FILE" 2>/dev/null; then
current=$(grep "^$code:" "$CONFIG_FILE" | cut -d: -f2-)
echo "当前内容:$current"
echo -n "请输入新内容(直接回车保持不变):"
read new_content
if [[ -n "$new_content" ]]; then
if [[ "$(uname)" == "Darwin" ]]; then
sed -i '' "s|^$code:.*|$code:$new_content|" "$CONFIG_FILE"
else
sed -i "s|^$code:.*|$code:$new_content|" "$CONFIG_FILE"
fi
echo "更新成功!"
fi
else
echo "快捷码不存在"
fi
sleep 2
show_menu
}
# 删除短语
delete_phrase() {
echo -n "请输入要删除的快捷码:"
read code
if grep -q "^$code:" "$CONFIG_FILE" 2>/dev/null; then
echo -n "确认删除?(y/n):"
read confirm
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
if [[ "$(uname)" == "Darwin" ]]; then
sed -i '' "/^$code:/d" "$CONFIG_FILE"
else
sed -i "/^$code:/d" "$CONFIG_FILE"
fi
echo "删除成功!"
fi
else
echo "快捷码不存在"
fi
sleep 2
show_menu
}
# 搜索短语
search_phrases() {
echo -n "请输入搜索关键词:"
read keyword
clear
echo "搜索结果:"
echo "========================"
grep -i "$keyword" "$CONFIG_FILE" 2>/dev/null | awk -F: '{printf "%-20s %s\n", $1, $2}'
echo "========================"
echo -n "按回车键继续..."
read
show_menu
}
# 导出短语
export_phrases() {
echo -n "请输入导出文件名(默认: phrases_backup.txt):"
read filename
filename=${filename:-phrases_backup.txt}
cp "$CONFIG_FILE" "$filename"
echo "导出成功:$filename"
sleep 2
show_menu
}
# 导入短语
import_phrases() {
echo -n "请输入导入文件名:"
read filename
if [[ -f "$filename" ]]; then
cat "$filename" >> "$CONFIG_FILE"
echo "导入成功!"
else
echo "文件不存在"
fi
sleep 2
show_menu
}
# 快速输入函数(需要xdotool支持)
quick_input() {
local code="$1"
local phrase=$(get_phrase "$code")
if [[ -n "$phrase" ]]; then
# 使用xdotool模拟输入(需要安装)
if command -v xdotool &> /dev/null; then
xdotool type "$phrase"
else
# 复制到剪贴板
echo -n "$phrase" | xclip -selection clipboard
echo "已复制到剪贴板:$phrase"
fi
else
echo "快捷码 $code 不存在"
fi
}
# 热键支持(使用xbindkeys)
setup_hotkeys() {
cat > "$HOME/.xbindkeysrc" << EOF
# Ctrl+Shift+V 展开快捷短语
"$0 quick_input \$($0 get_last_code)"
control+shift + v
# Ctrl+Shift+M 打开管理器
"$0 show_menu"
control+shift + m
EOF
# 重启xbindkeys
pkill xbindkeys 2>/dev/null
xbindkeys
}
# 获取最后输入的快捷码
get_last_code() {
# 使用xclip获取剪贴板内容
if command -v xclip &> /dev/null; then
xclip -o -selection clipboard 2>/dev/null || echo ""
fi
}
# 主程序
main() {
init_phrases
load_phrases
case "$1" in
"menu"|"")
show_menu
;;
"quick")
if [[ -z "$2" ]]; then
echo "用法:$0 quick <快捷码>"
exit 1
fi
quick_input "$2"
;;
"setup")
setup_hotkeys
echo "热键设置完成!"
;;
"help")
echo "用法:$0 [选项]"
echo " menu - 打开管理器(默认)"
echo " quick - 快速输入短语"
echo " setup - 设置热键"
echo " help - 显示帮助"
;;
*)
echo "未知选项:$1"
echo "使用 $0 help 查看帮助"
exit 1
;;
esac
}
main "$@"
使用方法
Windows (AutoHotkey)
- 安装 AutoHotkey
- 保存脚本为
.ahk文件并运行 - 使用热键:
Ctrl+Shift+V- 展开快捷短语Ctrl+Shift+M- 打开管理界面Ctrl+Shift+Q- 退出程序
Linux (Bash脚本)
- 保存脚本并添加执行权限
- 安装依赖:
xdotool xclip xbindkeys - 运行:
./quick_phrases.sh
Python版本
- 安装依赖:
pip install keyboard pyperclip - 运行:
python quick_phrases.py
这些脚本提供了完整的快捷短语管理功能,包括添加、编辑、删除、导入导出等功能,你可以根据需要调整热键和功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播