T4 Action交互功能是DrPlayer中用于实现用户与站源接口间动态交互的核心机制。通过返回特定格式的JSON配置,可以动态生成各种类型的输入界面、弹窗和交互组件,实现复杂的用户交互流程。
影图APP与站源接口间交互的动作指令,用户在APP主动发出动作请求,接口根据指令返回数据或返回构建信息输入窗口的配置JSON,具有连续交互的机制。
- 用户通过视频分类列表主动发起交互的起点动作
- 动作指令以分类列表的视频JSON数据为基础,属于静态数据
- 所有交互动作的起始都是静态动作
- 静态动作构建的信息输入窗口提交action数据后,接口如果再次需要用户输入数据,可以返回新的动作配置JSON数据
- 此数据是交互过程中动态生成的,属于动态动作
{
"vod_id": "动作指令结构...",
"vod_name": "显示名称",
"vod_tag": "action",
"vod_pic": "图片URL(可选)",
"vod_remarks": "备注信息(可选)"
}{
"action": {
// 动作指令结构...
},
"toast": "Toast显示消息"
}简单的动作指令字符串(非JSON结构),用户点击时无信息输入窗口,直接发送指令。
示例:
{
"vod_id": "hello world",
"vod_name": "基础动作",
"vod_tag": "action"
}要求用户输入一个字段的动作。
核心字段:
actionId: 识别动作的路由ID(必须)type: "input"id: 输入项目idtitle: 输入窗口标题tip: 输入提示(必须)value: 输入初始值msg: 窗口文本说明width: 宽度button: 按键数量(0-无按键,1-取消,2-确定/取消,3-确定/取消/重置)selectData: 预定义选项,格式:"1:=选项一,2:=选项二"imageUrl: 窗口显示图片的URLimageHeight: 图片高度imageClickCoord: 是否检测图片的点击坐标输入qrcode: 生成二维码的URLqrcodeSize: 二维码的大小timeout: 超时时间(秒)keep: 输入确认后,窗口是否保持initAction: 窗口弹出时自动发送的初始化动作指令initValue: 窗口弹出时自动发送的初始化指令值cancelAction: 按窗口的取消键时发送的取消动作指令cancelValue: 按窗口的取消键时发送的取消动作指令值
示例:
{
"actionId": "玩偶域名",
"id": "domain",
"type": "input",
"width": 450,
"title": "玩偶域名",
"tip": "请输入玩偶域名",
"value": "",
"msg": "选择或输入使用的域名",
"selectData": "1:=https://www.wogg.net/,2:=https://wogg.xxooo.cf/"
}要求用户在一个多行编辑区输入单个字段内容的动作。
示例:
{
"actionId": "多行编辑",
"type": "edit",
"id": "alitoken",
"title": "阿里云盘Token",
"msg": "阿里云盘32位的Token",
"tip": "请输入阿里云盘32位的Token",
"value": "",
"width": 640,
"height": 400
}要求用户输入多个字段(5个以内)的动作。建议使用"增强多项输入"。
要求用户输入多个字段(不限制个数)的动作,功能最强大的输入类型。
核心字段:
type: "multiInputX"canceledOnTouchOutside: 弹出窗口是否允许触摸窗口外时取消窗口height: 高度(负数表示从底部计算)bottom: 底部对齐和底边距dimAmount: 设置窗口背景暗化效果(0.0-1.0)input: 输入项目定义JSON数组
输入项目字段:
id: 项目idname: 项目名称tip: 项目输入提示value: 项目初始值selectData: 项目输入预定义选项[folder]: 选择文件夹[file]: 选择文件[calendar]: 选择日期[image]: 选择图像文件转为BASE64
quickSelect: 是否能快速选择onlyQuickSelect: 是否只快速选择,隐藏输入框等selectWidth: 选择窗的宽度multiSelect: 是否多选selectColumn: 选择窗的列数inputType: 项目输入类型(0-只读但可通过选项输入,129-密码输入)multiLine: 项目输入框的行数(多行编辑)validation: 提交时项目输入值校验正则表达式help: 项目输入的帮助说明,支持简易HTML
示例:
{
"actionId": "多项输入",
"type": "multiInputX",
"canceledOnTouchOutside": true,
"title": "Action多项输入(multiInputX)",
"width": 716,
"height": -300,
"bottom": 1,
"dimAmount": 0.3,
"button": 3,
"input": [
{
"id": "item1",
"name": "文件夹路径(文件夹选择)",
"tip": "请输入文件夹路径",
"value": "",
"selectData": "[folder]",
"inputType": 0
},
{
"id": "item2",
"name": "多项选择",
"tip": "请输入多项内容,以","分隔",
"value": "",
"selectData": "[请选择字母]a,b,c,d,e,f,g",
"selectWidth": 640,
"multiSelect": true,
"selectColumn": 4,
"inputType": 0
}
]
}要求用户在列表中选择一个项目的动作。
核心字段:
type: "menu"column: 单项选择窗口的列数option: 选项定义JSON数组selectedIndex: 默认选中的索引
选项格式:
- 对象格式:
{"name": "菜单1", "action": "menu1"} - 字符串格式:
"菜单3$menu3"
示例:
{
"actionId": "单选菜单",
"type": "menu",
"title": "Action菜单",
"width": 300,
"column": 2,
"option": [
{"name": "菜单1", "action": "menu1"},
{"name": "菜单2", "action": "menu2"},
"菜单3$menu3",
"菜单4$menu4"
],
"selectedIndex": 3
}要求用户在列表中选择多个项目的动作。
示例:
{
"actionId": "多选菜单",
"type": "select",
"title": "Action多选菜单",
"width": 480,
"column": 2,
"option": [
{"name": "选项1", "action": "menu1", "selected": true},
{"name": "选项2", "action": "menu2"},
{"name": "选项3", "action": "menu3", "selected": true}
]
}弹出窗口显示消息。
核心字段:
type: "msgbox"msg: 文本消息内容htmlMsg: 简单html消息内容imageUrl: 图片URL
示例:
{
"actionId": "消息弹窗",
"type": "msgbox",
"title": "消息弹窗",
"htmlMsg": "这是一个支持 <font color=red><b>简单HTML语法</b></font> 内容的弹窗",
"imageUrl": "https://pic.imgdb.cn/item/667ce9f4d9c307b7e9f9d052.webp"
}嵌入网页视图。
示例:
{
"actionId": "WEBVIEW",
"type": "webview",
"height": -260,
"textZoom": 70,
"url": "http://127.0.0.1:9978/"
}显示帮助信息。
示例:
{
"actionId": "help",
"type": "help",
"title": "使用帮助",
"data": {
"使用帮助": "暂未收录内容"
}
}专项动作为动态动作,接口让APP执行一些特定的行为动作。actionId值为行为特定的标识。
{
"actionId": "__self_search__",
"skey": "目标源key(可选)",
"name": "搜索分类名称",
"tid": "使用分类ID传递的搜索值",
"flag": "列表视图参数",
"folder": "查询1$搜索词$0-0-S#查询2$搜索词$3#查询3$搜索词$5"
}{
"actionId": "__detail__",
"skey": "目标源key",
"ids": "传递给详情页的视频ids"
}{
"actionId": "__ktvplayer__",
"name": "歌名",
"id": "歌曲的直链"
}{
"actionId": "__refresh_list__"
}{
"actionId": "__copy__",
"content": "复制的内容"
}{
"actionId": "__keep__",
"msg": "更新窗口里的文本消息内容",
"reset": true
}async function action(action, value) {
// action: 动作指令
// value: 动作指令值
// 返回: 结果消息或新的动作指令数据(动态动作)
}if (action == 'set-cookie') {
return JSON.stringify({
action: {
actionId: 'quarkCookieConfig',
id: 'cookie',
type: 'input',
title: '夸克Cookie',
tip: '请输入夸克的Cookie',
value: '原值',
msg: '此弹窗是动态设置的参数,可用于动态返回原设置值等场景'
}
});
}if (action == 'quarkCookieConfig' && value) {
try {
const obj = JSON.parse(value);
const val = obj.cookie;
return "我收到了:" + value;
} catch (e) {
return '发生错误:' + e;
}
}if (action == '连续对话') {
let content = JSON.parse(value);
if (content.talk.indexOf('http') == 0) {
return JSON.stringify({
action: {
actionId: '__detail__',
skey: 'push_agent',
ids: content.talk,
},
toast: '你要去看视频了'
});
}
return JSON.stringify({
action: {
actionId: '__keep__',
msg: '回音:' + content.talk,
reset: true
},
toast: '你有新的消息'
});
}if (action == '夸克扫码') {
if (rule.quarkScanCheck) {
return '请等待上个扫码任务完成';
}
let requestId = generateUUID();
// 获取扫码token的API调用...
return JSON.stringify({
action: {
actionId: 'quarkScanCookie',
id: 'quarkScanCookie',
canceledOnTouchOutside: false,
type: 'input',
title: '夸克扫码Cookie',
msg: '请使用夸克APP扫码登录获取',
width: 500,
button: 1,
timeout: 20,
qrcode: qrcodeUrl,
qrcodeSize: '400',
initAction: 'quarkScanCheck',
initValue: requestId,
cancelAction: 'quarkScanCancel',
cancelValue: requestId,
}
});
}- 所有JSON动作都需要使用
JSON.stringify()转换为字符串 - 动态动作返回时需要包装在
action字段中 - 可选择性添加
toast字段显示提示消息
- 使用try-catch处理JSON解析错误
- 提供友好的错误提示信息
- 考虑超时和取消操作的处理
- 对于需要状态的操作(如扫码),使用全局变量管理状态
- 及时清理状态,避免内存泄漏
- 处理并发操作的冲突
- 合理设置窗口大小和位置
- 提供清晰的提示信息和帮助文档
- 支持取消操作和超时处理
- 使用适当的图标和图片增强视觉效果
- 验证用户输入数据
- 使用正则表达式验证格式
- 避免执行不安全的操作
- 模块化设计:将不同类型的动作处理分离到不同的函数中
- 配置驱动:使用配置文件管理常用的选项和参数
- 错误恢复:提供重试机制和错误恢复选项
- 性能优化:避免在动作处理中执行耗时操作
- 文档完善:为每个动作提供清晰的使用说明
通过以上指南,开发者可以充分利用T4 Action交互功能,创建丰富的用户交互体验。