通过Google Apps脚本POST到Todoist API的HTTP错误“AUTH_CSFR_ERROR”
问题描述:
我试图从Google Apps脚本中查询Todoist API中的项目,模仿卷曲POST。通过Google Apps脚本POST到Todoist API的HTTP错误“AUTH_CSFR_ERROR”
我最初尝试让OAuth2工作,但令牌不是持久的,我选择使用单个API令牌交换有效令牌的API's method。
使用App脚本的UrlFetchApp class,我试图在为Todoist的API POST请求,构建取回任务物品,和我的getTodoistToken()
功能的确是获取有效令牌响应,但POST指令发出以下403:
“error_tag”: “AUTH_CSRF_ERROR”, “ERROR_CODE”:0 “HTTP_CODE”:403, “error_extra”:{ “ACCESS_TYPE”: “web_session”}, “错误”: “AUTH_CSRF_ERROR”}
任何人都可以推荐一个解决方案吗?非常感谢,代码如下:
function getTodoistToken() {
var url = "https://todoist.com/api/access_tokens/migrate_personal_token";
var data = {
"client_id": "[my unique client_id]",
"client_secret": "[my unique client_secret]",
"personal_token":"[my API token from Todoist dashboard]",
"scope": "data:read"
};
var payload = JSON.stringify(data);
var headers = {
"Content-Type":"application/json",
};
var options = {
"method":"POST",
"contentType" : "application/json",
"headers": headers,
"payload" : payload
};
var response = UrlFetchApp.fetch(url, options);
var json = response.getContentText();
var data = JSON.parse(json);
return(data.access_token);
}
function getTodoistTasks(){
var apiURL = "https://todoist.com/API/v7/sync";
var data = {
"token" : getTodoistToken(),
"sync_token" : '*',
"resource_types" : '["items"]'
};
var payload = JSON.stringify(data);
Logger.log(payload);
var headers = {
"Content-Type":"application/json",
};
var options = {
"method":"POST",
"contentType" : "application/json",
"headers": headers,
"payload" : payload,
"muteHttpExceptions" : true
};
var response = UrlFetchApp.fetch(apiURL, options);
Logger.log(response.getContentText());
}
答
我已经想出了答案。该Todoist API文档有点暧昧,似乎书面各地POST请求,但下载(同步)的任务,一个简单的URL编码的GET请求的完整列表,如下构造,并获得成功:
function getTodoistTasks(){
var apiURL = "https://todoist.com/API/v7/sync";
var queryString = "?token=" + getTodoistTokenRev() + "&sync_token=%27*%27&resource_types=[%22items%22]";
//Get params
var fetchParameters = {};
fetchParameters.method = 'get';
fetchParameters.contentType = 'x-www-form-urlencoded';
fetchParameters.muteHttpExceptions = true;
//make request and return
var response = UrlFetchApp.fetch(apiURL + queryString, fetchParameters);
var syncData = JSON.parse(response.getContentText());
return(syncData);
}
答
而且如果有人正在寻找创建项目的示例(本例中为任务),那么以下是此代码(请注意,您需要指定date_string和due_date以使其出现在Web UI中):
var API_URL = "https://todoist.com/API/v7/sync"
var BASE_QUERY = "?token=" + TOKEN
function addTask() {
// var taskName = SpreadsheetApp.getUi().prompt('What the task\'s name?')
var taskName = 'Test 1652'
var commands = encodeURI(JSON.stringify([{
"type": "item_add",
"temp_id": uuidv4(),
"uuid": uuidv4(),
"args": {
"content": taskName,
"date_string": "today",
"due_date_utc": "2017-12-2T18:00",
}
}]))
var queryString = BASE_QUERY + '&commands=' + commands
var options = {
method: 'post',
contentType: 'x-www-form-urlencoded',
muteHttpExceptions: true}
var response = UrlFetchApp.fetch(API_URL + queryString, options)
if (response.getResponseCode() !== 200) {
var content = response.getContentText()
throw new Error('URL fetch failed: ' + content)
}
var syncData = JSON.parse(response.getContentText())
return syncData
// Private Functions
// -----------------
function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
} // addTask()