You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift上传视频至Twitter时请求状态码400的问题求助

我来帮你排查这个Twitter视频上传返回400错误的问题,这类HTTP 400错误大多是请求格式、参数配置或者权限环节出了问题,咱们一步步来梳理解决方案:

一、先检查基础请求配置

你的代码只写到了获取Twitter账户的环节,后续的上传请求大概率是问题所在,先从这里入手:

  • 确认API端点正确性:如果用的是旧版v1.1 API,视频上传的正确端点是https://upload.twitter.com/1.1/media/upload.json,用错端点直接会返回400。
  • 必填参数不能少:Twitter视频上传是分步骤的(初始化→分片上传→最终化),每一步都有必填参数:
    • 初始化(INIT)请求必须带command=INIT、media_type(比如video/mp4,要和你的视频格式完全匹配)、total_bytes(就是你传入的fileSize);
    • 分片上传(APPEND)需要command=APPEND、media_id(来自INIT的返回)、segment_index(分片索引,从0开始);
    • 最终化(FINALIZE)需要command=FINALIZE、media_id。
      少了任何一个必填参数,都会触发400错误。
  • 视频格式与规格检查:Twitter对视频有严格限制:
    • 编码必须是H.264视频编码 + AAC音频编码;
    • 时长不超过140秒,文件大小不超过512MB(普通账号);
    • 分辨率不超过1920×1080。
      不符合规格的视频会被服务器拒绝,返回400。
二、权限与认证环节排查
  • 账户权限是否到位:requestAccessToAccounts只获取了基础账户访问权限,但视频上传需要发布内容的权限。你可以去iOS系统设置→Twitter→你的应用,确认是否开启了“发布内容”权限;另外在Twitter开发者后台,要确保你的App配置了读写权限(旧v1.1 API需要)。
  • SLRequest认证是否正确:用ACAccount创建SLRequest时,一定要正确关联获取到的Twitter账户,比如:
    guard let twitterAccount = accountStore.accounts(with: twitterAccountType).first as? ACAccount else {
        // 处理无账户的情况
        return
    }
    let uploadURL = URL(string: "https://upload.twitter.com/1.1/media/upload.json")!
    let initParams = [
        "command": "INIT",
        "media_type": "video/mp4",
        "total_bytes": String(fileSize)
    ]
    let request = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .POST, url: uploadURL, parameters: initParams)
    request.account = twitterAccount // 这一步不能漏!
    
    如果账户关联错误或者认证信息缺失,也可能返回400(部分场景会返回401,但也有情况返回400)。
三、分片上传的步骤正确性

Twitter不支持直接上传完整大视频,必须走三步流程:

  1. 发送INIT请求,拿到服务器返回的media_id;
  2. 把视频分成若干分片(建议每片5MB左右),逐个发送APPEND请求,每次指定对应的segment_index;
  3. 所有分片上传完成后,发送FINALIZE请求,完成视频上传。
    如果跳过任何一步,或者分片索引顺序错误、分片数据不完整,都会触发400错误。
四、调试技巧:获取具体错误信息

最有效的排查方式是打印服务器返回的完整错误响应,在perform的回调里添加代码:

request.perform { (responseData, urlResponse, error) in
    if let data = responseData, let errorMsg = String(data: data, encoding: .utf8) {
        print("Twitter上传错误详情:\(errorMsg)")
    }
    // 同时打印HTTP响应状态码和error信息
    if let httpResponse = urlResponse as? HTTPURLResponse {
        print("状态码:\(httpResponse.statusCode)")
    }
    if let err = error {
        print("请求错误:\(err.localizedDescription)")
    }
}

Twitter的400错误会返回具体的错误码和提示,比如code=195表示参数缺失,code=415表示媒体类型不支持,这些信息能直接帮你定位问题。

五、替代方案:换用更稳定的上传方式

如果用ACAccountStore + SLRequest的旧方式遇到兼容问题,现在Twitter推荐使用官方的Twitter Kit(或者直接调用v2 API),通过OAuth2认证来完成视频上传,这种方式的错误提示更清晰,也更适配最新的Twitter API规则。

内容的提问来源于stack exchange,提问作者Abhirajsinh Thakore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:21:19