2017-06-15 10 views
0

Google Apps ScriptからTodoist APIからアイテムを検索して、カールPOSTを模倣しようとしています。Google Appsスクリプトを使用してPOSTからTodoist APIへのHTTPエラー「AUTH_CSFR_ERROR」

私はもともとOAuth2を動作させようとしましたが、トークンは永続的ではなく、代わりに有効なトークンを交換するために個々のAPIトークンを使用するのがAPI's methodでした。

:アプリケーションスクリプトの 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()); 

} 

答えて

1

私は答えを見つけました。 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); 
} 
0

をともし誰かが私のようにアイテム(この場合はタスク)を作成する例を探しているのであれば、そのコードがあります(Web UIに表示するにはdate_stringとdue_dateを指定する必要があります)。

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() 
関連する問題