碰一碰发视频系统是结合NFC通讯技术的全新门店互动物料。顾客手机解锁后,无需打开APP扫码,碰一下即可快速完成各种互动,例如去小红书发1篇门店种草笔记(AI帮写又好又快)、大众点评收藏打卡等
✅ 怎么用?
只需要在店里或者外卖包装上贴上碰碰贴,顾客通过扫描二维码或碰一下NFC感应区,就能直接跳转到你的抖音,视频号、小红书号,给你的视频点赞、分享
近场通信技术是碰一碰发视频功能的基石,目前常用的有 NFC 和蓝牙。NFC 技术具备操作便捷、无需配对的优势,能实现快速感应连接,但传输速度较慢、传输距离短,适用于传输小文件或视频元数据。开发时需精准处理 NFC 标签的读写操作,熟悉 NDEF(NFC Data Exchange Format)协议,合理封装和解析数据。
视频文件通常数据量较大,在传输前必须进行高效的编码和压缩处理。选择合适的视频编码格式(如 H.264、H.265),既能保证视频质量,又能有效减小文件大小。同时,要对视频进行合理的分割,以适应不同通信技术的传输特性,避免因数据量过大导致传输失败或卡顿。
在数据传输过程中,为确保数据的准确性和完整性,需采用可靠的数据校验和错误处理机制。可以引入 CRC(循环冗余校验)等校验算法,对传输的数据进行校验,一旦发现数据错误,及时请求重传。另外,针对网络不稳定或信号干扰等情况,设计合理的重试策略,保证数据传输的可靠性。
名称 | 描述 |
---|---|
HTTP URL | https://open.douyin.com/task/posting/create/ |
HTTP Method | POST |
Scope | task.posting.create |
权限要求 | 需要申请权限。路径:抖音开放平台控制台 > 应用详情 > 权限管理 > 能力实验室 > 投稿任务权限 |
请求头
access-token必填String
示例:clt.943da17996fb5cebfbc70c044c3fc25a57T54DcjT6HNKGqnUdxzy1KcxFnZ
调用https://open.douyin.com/oauth/client_token/生成的token
content-type必填String
示例:application/json
固定值"application/json"
Body展开全部子属性
end_time必填Int64
示例:1234567891
结束时间秒级时间戳
start_time必填Int64
示例:1234567890
开始时间秒级时间戳
task_condition必填Struct
示例:{"condition":"collection","min_value":0,"max_value":100000}
任务条件
展开子属性
task_name必填String
示例:优惠券任务
任务名称,长度不超过50个字符
请求示例
Java
import com.aliyun.tea.TeaException; import com.douyin.openapi.client.Client; import com.douyin.openapi.client.models.*; import com.douyin.openapi.credential.models.Config; public class Main { public static void main(String[] args) { try { Config config = new Config().setClientKey("tt******").setClientSecret("cbs***"); // 改成自己的app_id跟secret Client client = new Client(config); /* 构建请求参数,该代码示例中只给出部分参数,请用户根据需要自行构建参数值 token: 1.若用户自行维护token,将用户维护的token赋值给该参数即可 2.SDK包中有获取token的函数,请根据接口path在《OpenAPI SDK 总览》文档中查找获取token函数的名字 在使用过程中,请注意token互刷问题 header: sdk中默认填充content-type请求头,若不需要填充除content-type之外的请求头,删除该参数即可 */ PostingCreateRequest sdkRequest = new PostingCreateRequest(); sdkRequest.setAccessToken("k23cd*****"); sdkRequest.setEndTime(1); sdkRequest.setStartTime(1); sdkRequest.setTaskName("sbFMA9eyMZ"); PostingCreateResponse sdkResponse = client.PostingCreate(sdkRequest); } catch (TeaException e) { System.out.println(e.getMessage()); } catch (Exception e) { System.out.println(e.getMessage()); } } }
Body展开全部子属性
dataStruct
展开子属性
extraStruct
展开子属性
响应示例
正常响应示例异常响应示例
{ "data": { "task_id": "@72M0WCqtxuYGiwtkVUYFvH1itu8zRM8IaUCtRwbNa32+7uo2083g2PcEG70*****", "task_status": 1, "error_code": 0, "description": "" }, "extra": { "error_code": 0, "description": "", "sub_error_code": 0, "sub_description": "", "logid": "202305051653529635CB4F099894095439", "now": 1683276833 } }
切换单列布局
HTTP 状态码 | 错误码 | 错误码描述 | 排查建议 |
---|---|---|---|
200 | 2100005 | 参数不合法 |
检查入参 |
200 | 2100004 | 系统繁忙,此时请开发者稍候再试 |
平台内部错误,多次重试后仍未恢复,请联系平台OnCall |
200 | 2118110 | 请求过于频繁 |
请求QPS不要超过100 |
200 | 2118200 | 任务名称长度必须大于0且不超过50 |
检查入参 |
200 | 2118201 | 任务名称存在不合法字符 |
检查入参 |
200 | 2118202 | 任务条件不存在 |
检查入参 |
200 | 2118203 | 任务条件名称不合法 |
检查入参 |
200 | 2118204 | 任务条件边界值不合法 |
检查入参 |
200 | 2118205 | 任务开始时间不得晚于结束时间 |
检查入参 |
200 | 2118206 | 任务结束时间不得晚于当前时间 |
检查入参 |
200 | 2118207 | 任务生效时间不得超过31天 |
检查入参 |
// VideoService.js
import { Buffer } from 'buffer';
import * as FileSystem from 'expo-file-system';
import * as MediaLibrary from 'expo-media-library';
class VideoService {
async compressVideo(videoUri) {
try {
// 这里可以使用FFmpeg等库进行视频压缩
// 简化示例,实际项目中需要集成FFmpeg库
console.log('开始压缩视频:', videoUri);
// 返回原始视频URI作为示例
return videoUri;
} catch (error) {
console.error('压缩视频失败:', error);
throw error;
}
}
async readVideoFile(videoUri) {
try {
// 读取视频文件内容
const fileInfo = await FileSystem.getInfoAsync(videoUri);
if (!fileInfo.exists) {
throw new Error('视频文件不存在');
}
// 读取文件内容为二进制数据
const fileData = await FileSystem.readAsStringAsync(videoUri, {
encoding: FileSystem.EncodingType.Base64
});
// 转换为Buffer
const buffer = Buffer.from(fileData, 'base64');
return buffer;
} catch (error) {
console.error('读取视频文件失败:', error);
throw error;
}
}
async saveReceivedVideo(data, fileName) {
try {
// 创建临时文件路径
const fileUri = `${FileSystem.documentDirectory}${fileName}`;
// 写入文件
await FileSystem.writeAsStringAsync(fileUri, data.toString('base64'), {
encoding: FileSystem.EncodingType.Base64
});
// 保存到媒体库
const asset = await MediaLibrary.createAssetAsync(fileUri);
console.log('视频已保存到媒体库:', asset);
return asset;
} catch (error) {
console.error('保存视频失败:', error);
throw error;
}
}
}
export default new VideoService();