Twitter Api v1.1 post 来自 Google 应用程序脚本的多部分请求(附加端点)总是给出错误
Twitter Api v1.1 post multipart request (append endpoint) from Google apps script always gives a error
在下面的函数中,我收到了来自 Twitter 的错误响应“错误请求”。
//param1 file === DriveApp.getFileById()
//param2 init === returned object of initTwitterUpload function
//param3 service === OAuth1.createService()
function appendTwitterUpload(file,init,service) {
var blob = file.getBlob()
var bytes = blob.getBytes()
var base64Blob = Utilities.base64Encode(bytes)
var metaData = {name: file.getName(),
mimeType: file.getMimeType()}
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json" //?command=APPEND&media_id="
//Oauth1percentEncode(init["media_id_string"]) + "&segment_index=" + Oauth1percentEncode(0);
var options = {method:'POST',
contentType : 'multipart/form-data',
payload : {'command':'APPEND',
'media_id' : init["media_id"],
'segment_index': 0,
},
files:{'media': bytes},
muteHttpExceptions:true}
var response = service.fetch(baseUrl,options);
return JSON.parse(response.getContentText())
}
任何 Twitter 开发人员在那里发现错误,我发现了一个带有 Google 应用程序脚本的错误。我正在使用 OAuth 1.0a 身份验证并遵循 documentation correctly. I am using Urlfetchapp for posting the payload with content-type of multipart/form-data. Service param here is nothing but urlfetchapp with required authentication headers that is available in Oauth 1 library
中提到的所有程序
/Twitter 文件上传 - init -->append -->finalize/
initTwitterUpload 函数运行良好。服务参数是一个具有授权 headers 的 urlfetchapp,并且与 oauth1 library(fetch)
中的功能之一相匹配
我的 gs 文件中的其他函数:
function uploadTwitterMedia(mediaUrl){
var file = DriveApp.getFileById(mediaUrl.replace("https://drive.google.com/open?id=",""))
var initResponse = initTwitterUpload(mediaUrl,service)
var appendResponse = appendTwitterUpload(file,initResponse,service)
var finalizeResponse = finalizeTwitterUpload(initResponse,service)
return initResponse["media_id_string"]
}
function initTwitterUpload(url,service){
var file = DriveApp.getFileById(url.replace("https://drive.google.com/open?id=",""))
var type = file.getMimeType()
var size = file.getSize()
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json?"
var oauthParams = "command=INIT&total_bytes="+encodeURIComponent(size).replace(/\!/g, "%21")
.replace(/\*/g, "%2A")
.replace(/\'/g, "%27")
.replace(/\(/g, "%28")
.replace(/\)/g, "%29")+"&media_type="+encodeURIComponent(type).replace(/\!/g, "%21")
.replace(/\*/g, "%2A")
.replace(/\'/g, "%27")
.replace(/\(/g, "%28")
.replace(/\)/g, "%29")+"&media_category="+ Oauth1percentEncode("TWEET_IMAGE");
var tweetUrl = baseUrl + oauthParams
var response = service.fetch(tweetUrl,{method:'POST'})
return JSON.parse(response.getContentText())
}
function finalizeTwitterUpload(init,service){
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json?"
var params = "command=FINALIZE&media_id="+Oauth1percentEncode(init["media_id_string"])
var tweetUrl = baseUrl + params
var response = service.fetch(tweetUrl,{method:'POST',
muteHttpExceptions:true})
return JSON.parse(response.getContentText())
}
function Oauth1percentEncode(text){
text = encodeURIComponent(text).replace(/\!/g, "%21").replace(/\*/g, "%2A").replace(/\'/g, "%27")
.replace(/\(/g, "%28");
return text
}
此外,statusTwitterUpload 函数没有按预期工作,它给出了“找不到页面”的响应。
我找到了答案。多亏了我,将这个 appendTwitterUpload 函数替换为问题中的函数,它会很好用。
function appendTwitterUpload(file,init,service) {
var options = null
var response = null
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json?command=APPEND&media_id=" + init["media_id_string"] +
"&segment_index=" + Oauth1percentEncode(0);
var boundary = "xxxxxxxxxx";
var data = "";
data += "--" + boundary + "\r\n";
data += "Content-Disposition: form-data; name=\"media\"; filename=\"" + file.getName() + "\"\r\n";
data += "Content-Type:" + file.getMimeType() + "\r\n\r\n";
var payload = Utilities.newBlob(data).getBytes()
.concat(file.getBlob().getBytes())
.concat(Utilities.newBlob("\r\n--" + boundary + "--").getBytes());
var options = {
method : "post",
contentType : "multipart/form-data; boundary=" + boundary,
payload : payload,
muteHttpExceptions: true,
}
var response = service.fetch(baseUrl,options);
return response.getResponseCode()
}
在下面的函数中,我收到了来自 Twitter 的错误响应“错误请求”。
//param1 file === DriveApp.getFileById()
//param2 init === returned object of initTwitterUpload function
//param3 service === OAuth1.createService()
function appendTwitterUpload(file,init,service) {
var blob = file.getBlob()
var bytes = blob.getBytes()
var base64Blob = Utilities.base64Encode(bytes)
var metaData = {name: file.getName(),
mimeType: file.getMimeType()}
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json" //?command=APPEND&media_id="
//Oauth1percentEncode(init["media_id_string"]) + "&segment_index=" + Oauth1percentEncode(0);
var options = {method:'POST',
contentType : 'multipart/form-data',
payload : {'command':'APPEND',
'media_id' : init["media_id"],
'segment_index': 0,
},
files:{'media': bytes},
muteHttpExceptions:true}
var response = service.fetch(baseUrl,options);
return JSON.parse(response.getContentText())
}
任何 Twitter 开发人员在那里发现错误,我发现了一个带有 Google 应用程序脚本的错误。我正在使用 OAuth 1.0a 身份验证并遵循 documentation correctly. I am using Urlfetchapp for posting the payload with content-type of multipart/form-data. Service param here is nothing but urlfetchapp with required authentication headers that is available in Oauth 1 library
中提到的所有程序/Twitter 文件上传 - init -->append -->finalize/ initTwitterUpload 函数运行良好。服务参数是一个具有授权 headers 的 urlfetchapp,并且与 oauth1 library(fetch)
中的功能之一相匹配我的 gs 文件中的其他函数:
function uploadTwitterMedia(mediaUrl){
var file = DriveApp.getFileById(mediaUrl.replace("https://drive.google.com/open?id=",""))
var initResponse = initTwitterUpload(mediaUrl,service)
var appendResponse = appendTwitterUpload(file,initResponse,service)
var finalizeResponse = finalizeTwitterUpload(initResponse,service)
return initResponse["media_id_string"]
}
function initTwitterUpload(url,service){
var file = DriveApp.getFileById(url.replace("https://drive.google.com/open?id=",""))
var type = file.getMimeType()
var size = file.getSize()
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json?"
var oauthParams = "command=INIT&total_bytes="+encodeURIComponent(size).replace(/\!/g, "%21")
.replace(/\*/g, "%2A")
.replace(/\'/g, "%27")
.replace(/\(/g, "%28")
.replace(/\)/g, "%29")+"&media_type="+encodeURIComponent(type).replace(/\!/g, "%21")
.replace(/\*/g, "%2A")
.replace(/\'/g, "%27")
.replace(/\(/g, "%28")
.replace(/\)/g, "%29")+"&media_category="+ Oauth1percentEncode("TWEET_IMAGE");
var tweetUrl = baseUrl + oauthParams
var response = service.fetch(tweetUrl,{method:'POST'})
return JSON.parse(response.getContentText())
}
function finalizeTwitterUpload(init,service){
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json?"
var params = "command=FINALIZE&media_id="+Oauth1percentEncode(init["media_id_string"])
var tweetUrl = baseUrl + params
var response = service.fetch(tweetUrl,{method:'POST',
muteHttpExceptions:true})
return JSON.parse(response.getContentText())
}
function Oauth1percentEncode(text){
text = encodeURIComponent(text).replace(/\!/g, "%21").replace(/\*/g, "%2A").replace(/\'/g, "%27")
.replace(/\(/g, "%28");
return text
}
此外,statusTwitterUpload 函数没有按预期工作,它给出了“找不到页面”的响应。
我找到了答案。多亏了我,将这个 appendTwitterUpload 函数替换为问题中的函数,它会很好用。
function appendTwitterUpload(file,init,service) {
var options = null
var response = null
var baseUrl = "https://upload.twitter.com/1.1/media/upload.json?command=APPEND&media_id=" + init["media_id_string"] +
"&segment_index=" + Oauth1percentEncode(0);
var boundary = "xxxxxxxxxx";
var data = "";
data += "--" + boundary + "\r\n";
data += "Content-Disposition: form-data; name=\"media\"; filename=\"" + file.getName() + "\"\r\n";
data += "Content-Type:" + file.getMimeType() + "\r\n\r\n";
var payload = Utilities.newBlob(data).getBytes()
.concat(file.getBlob().getBytes())
.concat(Utilities.newBlob("\r\n--" + boundary + "--").getBytes());
var options = {
method : "post",
contentType : "multipart/form-data; boundary=" + boundary,
payload : payload,
muteHttpExceptions: true,
}
var response = service.fetch(baseUrl,options);
return response.getResponseCode()
}