【问题标题】:Posting videos to Tiktok with Video Kit API fails使用 Video Kit API 将视频发布到 Tiktok 失败
【发布时间】:2022-12-17 23:24:40
【问题描述】:

我正在尝试使用视频工具包 api 在 tiktok 上分享视频,我拥有的视频位于谷歌云存储链接上,因此首先我从云中获取该视频并将其附加到带有读取流的表单数据。然后,我使用我的开放 ID 和访问令牌向给定端点发出 axios 发布请求(两者均有效,并且我的发布请求具有正确的标头,即文档中指定的多部分/表单数据)。

            const storage = new Storage();
            const bucket = storage.bucket("<bucket name>");
            const remoteFile = bucket.file("<file path>");

            const openId = token['open_id'];
            const accessToken = token['access_token'];
            const postUrl = process.env.TIKTOK_POST_URL
                + '?open_id=' + openId
                + '&access_token=' + accessToken;
            let formData = new FormData();
            formData.append('video',remoteFile.createReadStream())
            const postResponse = await axios.post(postUrl,formData,{headers: { "Content-Type": "multipart/form-data" }});
            console.log(postResponse);

但是,我不断从响应中获得 400 代码以及额外的详细信息;

expecting a binary field `video` in the form-data

我假设我要么没有正确发送视频文件,要么根本没有发送。 到目前为止,我已经尝试过;

  1. 将带有 axios 的文件作为 blob 下载并发送 blob 本身
  2. 使用 axios 作为流下载文件并发送
  3. 使用谷歌库本身下载文件并发送其缓冲区数组
  4. [当前尝试] 只是获取文件的引用并从中发送写入流

    所有这些尝试都导致了相同的错误消息。还有其他人遇到过这个问题吗?文档中没有任何示例,所以我不确定如何处理。我也不想下载视频并将其保存到文件中并尝试发布它,因为我宁愿只从内存中发送文件。

    我很感激任何意见。

    编辑: 我也试过像这样发布位于我的机器上的视频,

    formData.append('video',fs.createReadStream("C:/Users/[ME]/Downloads/tem.mp4"))
    

    仍然得到同样的错误。

    编辑 2: 我还尝试将这些流中的数据流式传输到一个变量中,并尝试将它们传递到表单数据中,但仍然得到相同的结果

                stream.on('data',function(data)
                {
                    File += data;
                    console.log('streaming data');
                })
                stream.on('finish',async function()
                {
                    formData.append('video',File)
                    const postResponse = await 
    axios.post(postUrl,formData,{headers: { "Content-Type": "multipart/form-data" }});
                }
    
    

    编辑 3:

    上传小尺寸失败后,我注意到您不能上传短于 3 秒的视频,我尝试上传的视频恰好是 3 秒,所以这可能是我尝试上传更大视频的问题,并设法得到另一个错误。

    Bad Gateway | KRAKEND.BACKEND/3 - request failed/320202:the server closed connection before returning the first response byte. Make sure the server returns 'Connection: close' response header before closing the connection
    

【问题讨论】:

  • 您正在尝试上传一个阅读流,但您需要上传一个文件。
  • @AlexScott 我试过将 remoteFile 放入表单数据并得到“source.pause is not a function”错误
  • 您仍然需要使用该流,但您需要将其 pipe 为可写流,或者使用可读流首先将文件中的数据读取到变量中。由于您需要使用FormData,因此第二个选项就是您想要的。
  • 嗨,你设法解决这个问题了吗?

标签: javascript node.js axios tiktok


【解决方案1】:

下面应该有足够的代码来将流读入变量并正确发送它。

const storage = new Storage();
const bucket = storage.bucket("<bucket name>");
const remoteFile = bucket.file("<file path>");
const openId = token['open_id'];
const accessToken = token['access_token'];
const postUrl = process.env.TIKTOK_POST_URL
                + '?open_id=' + openId
                + '&access_token=' + accessToken;
const fileStream = remoteFile.createReadStream();
const data = null;

fileStream.on("data", chunk => {
  data += chunk;
});

fileStream.on("finish", () => {
    const formData = new FormData();

    formData.append("video", data);

    const postResponse = await axios.post(
        postUrl,
        formData,
        {
            headers: { "Content-Type": "multipart/form-data" }
        }
    );

    console.log(postResponse);
});            

【讨论】:

  • 这仍然会产生与 tiktok 相同的错误
  • 尝试用 Blob 包装 data,例如 new Blob([data])。此外,控制台在发送前记录数据内容以确保数据正确。
  • formData.append('video',new Blob([File])) 产生“source.on 不是函数”。 Consol 记录文件显示一大串混合了无法识别的字符的字符。
  • 它如何给出该错误很奇怪,但如果不包装在 Blob 中,它会产生原始错误。即使没有包装 Blob,stream.on 也会在将数据发送到 TikTok 之前被调用,因此在这两种情况下您都应该收到 stream.on 错误。
  • 如果不将它们包装成 blob,当我们将数据附加到表单时,我们基本上是在附加一个巨大的字符串。因此,如果确实调用了 stream.on,我应该得到那个错误,但我没有。
【解决方案2】:

这是我最终做的,这是无状态云运行实例的一部分,所以对我来说至关重要的是不要在任何地方下载文件,而只是将下游直接传递到上游。

{
//grab the openId and access token from the integration
const openId: string = integrationJSON['open_id'];
const accessToken: string = integrationJSON['access_token'];
//create the tiktok posting url
const postUrl: string =
  process.env.TIKTOK_POST_URL +
  '?open_id=' +
  openId +
  '&access_token=' +
  accessToken;
//grab a downstream stream of the video from the storage URL
const downStream = await axios({
  method: 'GET',
  responseType: 'stream',
  url: url,
});
//append the downstream into a form data to be attached to our post request
var data: FormData = new FormData();
data.append('video', downStream.data);
//make a post request to tiktok with the downstream of the video and return the response
const response = await axios({
  method: 'post',
  url: postUrl,
  headers: {
    'Content-Type': 'multipart/form-data',
    ...data.getHeaders(),
  },
  data: data,
  maxContentLength: Infinity,
  maxBodyLength: Infinity,
});
return response;}

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2019-03-15
    • 2013-12-08
    相关资源
    最近更新 更多