首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Google脚本POST到Todoist API的HTTP错误"AUTH_CSFR_ERROR“

通过Google脚本POST到Todoist API的HTTP错误"AUTH_CSFR_ERROR“
EN

Stack Overflow用户
提问于 2017-06-15 14:49:11
回答 2查看 502关注 0票数 1

我试图从Google脚本中查询Todoist API中的条目,模拟一个卷发帖子。

我最初试图使OAuth2工作,但令牌不是持久的,而是选择使用单个API令牌来交换有效令牌的API法

使用construct的UrlFetchApp类,我试图在POST请求时为Todoist的API构建检索任务项,我的getTodoistToken()函数确实是检索有效的令牌响应,但是POST命令发出以下403:

"error_tag":"AUTH_CSRF_ERROR","error_code":0,"http_code":403,"error_extra":{"access_type":"web_session"},"error":"AUTH_CSRF_ERROR"}

有人能推荐一个解决方案吗?非常感谢,代码如下:

代码语言:javascript
复制
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()); 

}
EN

回答 2

Stack Overflow用户

发布于 2017-06-22 17:23:47

我已经想出了答案。Todoist API文档有点模棱两可,似乎是围绕POST请求编写的,但是要下载(同步)一个完整的任务列表,一个简单的URL编码的GET请求(如下所示)就做到了这一点:

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2017-12-02 17:00:54

如果有人正在寻找创建项的示例(在本例中是一个任务),就像我一样,下面是代码(请注意,您需要为它指定一个date_string和due_date,以便它出现在web中):

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44570581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档