[英]Twitter API Chunked Upload INIT authentication error (code 32)
我無法將 INIT 帖子發送到https://upload.twitter.com/1.1/media/upload.json進行身份驗證。 它返回“消息”:“無法驗證您”,“代碼”:32
我的圖片簡單上傳工作正常,也可以發布消息,我使用相同的代碼創建授權 header 等。授權 header 如下(使用我的消費者密鑰和授權令牌)
OAuth oauth_consumer_key="[我的消費者密鑰]", oauth_token="[我的授權令牌]", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1671623331", oauth_nonce="NjM4MDcyMjAxMzExODczNDAx", oauth_version="1.0", oauth_signature=" NqC6Fwrz763C8397%2FL67crijtZs%3D"
我嘗試在正文和查詢字符串中傳遞所需的值(命令、total_bytes 和 media_type),並且我也嘗試在生成簽名時包含它們。 我只是看不出問題的原因。
var baseFormat_pic = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&command={6}&total_bytes={7}&media_type={8}";
var baseString_pic = string.Format(baseFormat_pic,
oauth_consumer_key,
oauth_nonce,
oauth_signature_method,
oauth_timestamp,
oauth_token,
oauth_version,
"INIT",
fileBytes.ToString(),
HttpUtility.UrlEncode( "video/mp4"));
baseString_pic = string.Concat("POST&", Uri.EscapeDataString(resource_url_pic),
"&", Uri.EscapeDataString(baseString_pic));
var compositeKey_pic = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
"&", Uri.EscapeDataString(oauth_token_secret));
string oauth_signature_pic;
using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey_pic)))
{
oauth_signature_pic = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString_pic)));
}
var headerFormat_pic = "OAuth oauth_consumer_key=\"{3}\", oauth_token=\"{4}\", oauth_signature_method=\"{1}\", oauth_timestamp=\"{2}\", oauth_nonce=\"{0}\", oauth_version=\"{6}\", oauth_signature=\"{5}\"";
var authHeader_pic = string.Format(headerFormat_pic,
Uri.EscapeDataString(oauth_nonce),
Uri.EscapeDataString(oauth_signature_method),
Uri.EscapeDataString(oauth_timestamp),
Uri.EscapeDataString(oauth_consumer_key),
Uri.EscapeDataString(oauth_token),
Uri.EscapeDataString(oauth_signature_pic),
Uri.EscapeDataString(oauth_version)
);
ServicePointManager.Expect100Continue = false;
string reqUrl = resource_url_pic;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(reqUrl);
request.Method = "POST";
NameValueCollection nvc = new NameValueCollection();
nvc.Add("command", "INIT");
nvc.Add("total_bytes", fileBytes.ToString());
nvc.Add("media_type", "video/mp4");
var sb = new StringBuilder();
foreach (string key in nvc.Keys)
{
sb.AppendFormat("{0}={1}&", key, HttpUtility.UrlEncode(nvc[key].ToString()));
}
sb.Remove(sb.Length - 1, 1);
var bytes = Encoding.UTF8.GetBytes(sb.ToString());
request.ContentLength = bytes.Length;
request.Headers.Add("Authorization", authHeader_pic);
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
var stream = request.GetRequestStream();
stream.Write(bytes, 0, bytes.Length);
stream.Close();
string result = ReadResult(request);
我錯過了一些非常明顯的東西嗎?
為了解決這個問題,我將編碼的表單 url 更改為多部分表單數據。 這允許 INIT 命令正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.