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

在Google Apps Script中调用Todoist SYNC API遇Invalid CSRF token错误求助

解决Todoist Sync API请求中的CSRF Token无效错误

我需要实现的功能是获取当日所有任务并存入Google Sheets文件,用于跟踪进度。尝试模仿cURL请求(获取所有项目的示例)并参考相关方案后仍未成功,遇到以下错误:

{
    error_tag = AUTH_INVALID_CSRF_TOKEN,
    error_extra = {
        access_type = web_session,
        retry_after=2.0,
        event_id = f187e5d823184fd0997935e031b017ec
    },
    error_code = 410.0,
    http_code = 403.0,
    error = Invalid CSRF token
}

我的原始代码:

function myFunction() {
  var apiURL = "https://todoist.com/API/v9/sync";
  var queryString = "?token=<my_token>&sync_token=%27*%27&resource_types=[%22projects%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());
  Logger.log(syncData);
  return(syncData);
}

问题原因及修复方案

Todoist Sync API要求使用POST方法提交请求,且参数需放在请求体中,你的代码使用GET方法并将参数放在URL中,触发了CSRF验证机制导致失败。以下是修正后的代码:

function myFunction() {
  var apiURL = "https://todoist.com/API/v9/sync";
  var token = "<你的API令牌>"; // 替换为实际的Todoist API令牌

  // 构建请求参数
  var payload = {
    token: token,
    sync_token: "*", // 正确的同步令牌格式,无需单引号
    resource_types: '["tasks"]' // 要获取任务,将resource_types改为tasks;若需项目可保留["projects"]
  };

  var fetchParameters = {
    method: 'post',
    contentType: 'application/x-www-form-urlencoded',
    payload: payload,
    muteHttpExceptions: true
  };

  // 发送请求并处理响应
  var response = UrlFetchApp.fetch(apiURL, fetchParameters);
  var syncData = JSON.parse(response.getContentText());
  Logger.log(syncData);

  // 筛选当日任务,用于后续写入Google Sheets
  var today = new Date();
  var formattedToday = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy-MM-dd");
  var todayTasks = syncData.tasks.filter(task => task.due?.date === formattedToday);
  Logger.log("当日任务:", todayTasks);

  return syncData;
}

关键修改点说明

  • 请求方法改为POST:Todoist Sync API仅接受POST请求,GET请求会触发CSRF验证错误
  • 参数移至请求体:将token、sync_token等参数放在payload中,而非URL查询字符串,符合API规范
  • 修正sync_token格式:移除多余的单引号,正确格式为"*"
  • 调整resource_types:若需获取任务,将值改为["tasks"],原代码中的["projects"]仅返回项目列表
  • 添加当日任务筛选逻辑:示例中增加了筛选当日任务的代码,方便后续写入Google Sheets

内容的提问来源于stack exchange,提问作者Clarissa De Simoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:55:28