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

使用RestClient调用Twitter媒体上传API返回400错误,求排查

Twitter媒体上传API请求400错误排查

问题描述

按照rest-client gem文档指引,在Rails控制台通过RestClient.post请求上传图片至Twitter的https://upload.twitter.com/1.1/media/upload.json接口:

  • 指定media_category=tweet_image
  • 参数为:myfile => File.new("/Users/main/Desktop/ss2022-11-03_11.39.11.png", 'rb')

确认文件路径正确,但请求始终返回400 Bad Request。同时不清楚File.new第二个参数的含义。

参考Twitter 1.1 API文档提供的twurl测试命令:

twurl -X POST -H upload.twitter.com "/1.1/media/upload.json?media_category=TWEET_IMAGE&additional_owners=3805104374" -f adsapi-heirarchy.png -F media

无论是否包含可选参数additional_owners,均返回相同错误。

关键问题分析

1. File.new第二个参数的含义

'rb'是文件打开模式,代表只读二进制模式,这部分是正确的——上传图片类二进制文件必须用该模式读取,避免编码问题。

2. 请求缺失的核心要素

参数名不匹配

Twitter媒体上传接口要求上传文件的参数名必须是media,你当前用的:myfile不符合要求。twurl命令中-F media正是指定了正确的参数名,rest-client请求需同步改为:media。

OAuth认证缺失

Twitter API所有请求必须通过OAuth 1.0a认证。twurl会自动读取本地配置的认证信息,但RestClient请求需要手动携带正确的OAuth密钥(consumer key、consumer secret、access token、access token secret),未携带或认证信息错误会直接返回400。

参数大小写错误

Twitter要求media_category的值为全大写的TWEET_IMAGE,你当前传的tweet_image是小写,会触发接口验证失败。

请求格式问题

用RestClient上传文件时,不要手动设置Content-Type,需依赖RestClient自动生成multipart/form-data类型的请求头,否则会导致数据解析失败。

修正后的RestClient请求示例

RestClient.post(
  'https://upload.twitter.com/1.1/media/upload.json',
  {
    media: File.new("/Users/main/Desktop/ss2022-11-03_11.39.11.png", 'rb'),
    media_category: 'TWEET_IMAGE'
  },
  {
    # 替换为你的OAuth认证信息,或使用rest-client的OAuth扩展自动处理签名
    Authorization: 'OAuth oauth_consumer_key="你的Consumer Key", oauth_nonce="随机字符串", oauth_signature="生成的签名", oauth_signature_method="HMAC-SHA1", oauth_timestamp="当前时间戳", oauth_token="你的Access Token", oauth_version="1.0"'
  }
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:50:42