IFTTT 및 AWS를 사용한 무료 TickTick API 구축

이 문서는 AWS나 IFTTT에 대해 깊이 있게 알고 싶지 않습니다.그러나, 이 두 계좌를 동시에 가지고 있어야 하며, 적어도 이 두 계좌에 대해 조금은 알고 있어야 한다.이 두 서비스의 무료 층은 개인 API 운영에 필요한 전부이기 때문에 한 푼의 돈도 들지 않는다.
면책 주장: 모든 기능이 포함된 API를 대체하기 위한 것이 아니라 TickTick 계정에만 적용됩니다.이것은 나의 매우 간단한 목적을 위해 구축된 것이지만, 당신의 용례에 따라 당신에게 아주 적합할 수도 있습니다.
어쨌든 우리 시작합시다!🎉

배경 이야기


지난 몇 달 동안 저는 작은 하드웨어 프로젝트를 시험해 봤습니다. 목표는 전자 잉크 스크린을 통해 트리베리 원주율을 사용하여 현재 제가 주목하고 있는 업무 사항을 보여주는 것입니다.프로그램이 시작될 때, 나는 API를 호출해서 나의 업무 목록을 가져오고, 이 항목들을 하나의 그룹에 저장한 다음, 항목마다 순환해서 화면에 표시합니다.
새해가 지나고 서비스TickTick로 넘어갔을 때 문제가 생겼어요.나는 내가 사용한 이전 프로그램을 떠나려고 생각해 왔다. 그들은 내장된 Pomodoro 타이머를 가지고 있었다. 이 사실은 나의 스위치를 공고히 했고, 나는 뒤돌아보지 않았다.
하지만 개방된 API는 하나도 없다.
이것은 마치 하나의 프로젝트인 것 같다. 이미requested a few times, 현재는 하나의 프로젝트인 것 같다. 그들은 노력하고 있다.그러나 이 글을 썼을 때, 그들은 아직 대중에게 사용할 수 있는 것이 하나도 없었다.그러나 새로운 기능을 생산으로 끌어올리는 데는 시간이 필요하다는 것을 알았지만, 그것은 내가 기다리고 싶지 않은 시간이었다.그래서 나는 사방을 발굴하여 자신의 길을 찾으려고 시도했다.
나는 Puppeteer 같은 것을 사용하여 프로그램에 로그인하고 가능한 한 모든 데이터를 제거해야 한다고 생각한다.그러나 나중에는 IFTTT의 존재가 생각났고 공교롭게도 Tick Tick의 임무를 촉발했는지 확인하기로 했다.봐라, 그들이 해냈다!그래서 내 계획이 한자리에 모이기 시작했다.
내가 이렇게 했으니 너도 할 수 있다.

개시하다


우선, 만약 당신이 아직 Amazon AWS 계좌를 등록하지 않았다면.이것이 바로 우리가 최종적으로 다음과 같은 서비스를 사용하여 실제 API에 동력을 제공하는 이유입니다.

  • Lambda는 API 엔드포인트에서 전송된 데이터를 처리하여 데이터베이스로 전송하는 데 사용

  • 엔드포인트를 생성하고 Lambda 인스턴스에 연결하는 API 게이트웨이

  • DynamoDB는 처리해야 할 사항을 저장하는 NosQL 데이터베이스
  • 모든 이 서비스들은 기한이 지나지 않는 아낌없는 무료 이용층이 있다.매 분마다 이 API를 사용하지 않으면, 직접적인 비용을 부담해서는 안 된다.
    이 세 가지 서비스를 설정하기 위해서, 우리가 해야 할 모든 것은 serverless 프로그램의 명령줄을 사용하여 처리될 것입니다.서버가 없는 AWS API는 대략this tutorial에 따라 작성됩니다.
    계속하여 터미널 또는 명령 프롬프트 창을 열고 다음 명령을 실행하여 서버 없는 응용 프로그램을 설치합니다.
    npm install serverless -g
    

    Side Note: Don't have Node or npm installed? Check out this link and finish that before continuing with the above command.


    완료되면 이 명령을 실행하여 서버가 없는 todo 프레젠테이션 API를 로컬에 설치합니다.이것은 우리 API의 기초가 될 것입니다.
    serverless install -u https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb -n ticktick-api
    
    새로 만든 폴더 ticktick-api 로 이동해서 가장 좋아하는 편집기로 코드를 엽니다.
    이제 우리 API를 개발할 때가 됐어.

    서버 없는 API 만들기


    새 항목을 열면 다음과 같은 파일 구조가 표시됩니다.
    ticktick-api/
    ├── todos/
    │   ├── create.js
    │   ├── delete.js
    │   ├── get.js
    │   ├── list.js
    │   └── update.js
    ├── package.json
    ├── README.md
    └── serverless.yml
    
    이것은 매우 간단한 레이아웃입니다. todos 디렉터리에 있는 모든 파일은 우리 API의 특정한 단점입니다.노드 Lambda 인스턴스에 의해 구동되며 데이터베이스와 상호 작용하며 요청에 일부 내용이 반환됩니다.serverless.yml 파일은 모든 내용을 연결하고 이 API에 필요한 AWS 서비스를 생성합니다.
    그러나 우리가 실제로 그것을 배치하기 전에, 우리는 우리가 추출하고 저장하고 있는 데이터에 따라 약간의 경미한 조정을 해야 한다.create.js를 열면 다음 코드 행이 표시됩니다.
    if (typeof data.text !== 'string') {
      console.error('Validation Failed');
      callback(null, {
        statusCode: 400,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t create the todo item.',
      });
      return;
    }
    
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Item: {
        id: uuid.v1(),
        text: data.text,
        checked: false,
        createdAt: timestamp,
        updatedAt: timestamp,
      },
    };
    
    이것은 괜찮지만, 나는 TickTick 목록과 todo 항목의 텍스트를 저장하는 기능을 추가하고 싶다.따라서 다음과 같이 데이터 포인트를 추가할 수 있도록 조정해 보겠습니다.
    if (typeof data.text !== 'string' || typeof data.list !== 'string') {
      console.error('Validation Failed');
      callback(null, {
        statusCode: 400,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t create the todo item.',
      });
      return;
    }
    
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Item: {
        id: uuid.v1(),
        text: data.text,
        list: data.list,
        checked: false,
        createdAt: timestamp,
        updatedAt: timestamp,
      },
    };
    
    네, 좋아요.update.js 파일을 열고 목록 속성을 추가합니다.앞에 표시된 내용은 표시되지 않지만 12-37 행의 텍스트 및 목록 속성은 다음과 같습니다.
    if (typeof data.text !== 'string' || typeof data.list !== 'string' || typeof data.checked !== 'boolean') {
      console.error('Validation Failed');
      callback(null, {
        statusCode: 400,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t update the todo item.',
      });
      return;
    }
    
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Key: {
        id: event.pathParameters.id,
      },
      ExpressionAttributeNames: {
        '#todo_text': 'text',
        '#todo_list': 'list',
      },
      ExpressionAttributeValues: {
        ':text': data.text,
        ':list': data.list,
        ':checked': data.checked,
        ':updatedAt': timestamp,
      },
      UpdateExpression: 'SET #todo_text = :text, #todo_list = :list, checked = :checked, updatedAt = :updatedAt',
      ReturnValues: 'ALL_NEW',
    };
    
    마지막으로 serverless.yml를 열고 frameworkVersion: ">=1.1.0 <2.0.0" 파이프를 완전히 뜯어내세요.파일을 저장하면 우리는 배치할 수 있다.
    명령줄로 돌아가서 다음 명령을 실행하여 종속 항목을 설치하고 모든 내용을 한데 묶으며 API를 배치합니다.
    npm install
    
    serverless deploy
    
    다음과 같이 끝점 세트로 돌아가야 합니다.
    Service Information
    service: ticktick-api
    stage: dev
    region: us-east-1
    api keys:
      None
    endpoints:
      POST - https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/todos
      GET - https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/todos
      GET - https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/todos/{id}
      PUT - https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/todos/{id}
      DELETE - https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/todos/{id}
    functions:
      ticktick-api-dev-update: arn:aws:lambda:us-east-1:12345:function:ticktick-api-dev-update
      ticktick-api-dev-get: arn:aws:lambda:us-east-1:12345:function:ticktick-api-dev-get
      ticktick-api-dev-list: arn:aws:lambda:us-east-1:12345:function:ticktick-api-dev-list
      ticktick-api-dev-create: arn:aws:lambda:us-east-1:12345:function:ticktick-api-dev-create
      ticktick-api-dev-delete: arn:aws:lambda:us-east-1:12345:function:ticktick-api-dev-delete
    

    Note: If you get an error back about AWS provider credentials not being found, follow this guide to set them up in order to work with your serverless CLI app.


    알겠습니다. 이제 API 포트 https://xxxxx.execute-api.us-east-1.amazonaws.com/dev/todos 에 접근할 수 있을 것입니다. 지금부터 빈 그룹을 되돌려야 합니다.
    만약 그렇다면, 우리는 올바른 길로 들어섰고, 우리는 계속해서 Tick Tick에서 데이터를 얻을 수 있다.

    IFTTT 설정


    좋습니다. IFTT로 이동해서 계정을 만들거나 로그인하겠습니다.TickTick과 새로 만든 API 사이의 연결고리가 됩니다.
    새 애플릿을 만들고 서비스에 대한 TickTick을 선택합니다.두 개의 가능한 트리거를 보실 수 있습니다. 이 두 개의 트리거를 동시에 사용할 것입니다.그러나 첫 번째 작업의 경우 New task created 를 선택합니다.

    다음 화면에서는 선택한 작업 목록, 태그 또는 우선 순위만 트리거하여 작업을 제한할지 여부를 결정합니다.개인적으로는 모든 태그와 우선 순위가 포함된 받은 편지함 목록을 사용하기 때문에 다음과 같습니다.

    create를 누르면 IFTT에서 TT의 작은 프로그램으로 돌아가 화면을 만들 것입니다.
    Webhooks 서비스를 선택하고 다음 페이지에서 유일하게 사용할 수 있는 동작을 선택하여 웹 요청을 보냅니다.
    이 페이지에 웹 요청의 모든 상세한 정보를 추가합니다.이 URL은 serverless 이전에 반환된 URL 중 하나이며 /dev/todos로 끝나야 합니다.
    방법을 POST, 내용 유형을 application/json로 설정합니다.
    마지막으로 본문에 대해 JSON 문자열을 만들 것입니다. 이 문자열은 TickTick에서 처리해야 할 사항의 데이터를 포함하고 IFTT의 도움말에 따라 자동으로 끌어옵니다.
    모든 양식 필드는 다음 화면 캡처와 같이 표시되어야 합니다.

    일단 그것이 보존된다면, 우리는 그것을 테스트할 준비가 되어 있다.
    TickTick 응용 프로그램으로 가서 새로운 업무를 만듭니다.IFTTT에서 트리거할 때 특정 목록이나 탭과 같은 선택 가능한 요구 사항을 설정하면 이 요구 사항을 설정하여 모든 것이 정상적으로 작동하도록 하십시오.
    약 1분 안에 브라우저에 주 /dev/todos API 포트를 불러올 수 있고, 테스트에 TickTick에 추가된 모든 항목을 포함하는 그룹을 되돌려 주어야 합니다.각각 작업 이름, 목록 이름, 시간 스탬프, 유일한 ID를 포함해야 합니다. 이 ID를 사용하면 하나의 항목을 끌어올리거나 업데이트하거나 데이터베이스에서 완전히 삭제할 수 있습니다.

    항목 완료 표시


    항목을 작성할 때만 이러한 컨텐트를 API로 가져오는 것을 알 수 있습니다.그러나 TickTick에서 API의 항목을 체크 아웃할 때 업데이트하려면 어떻게 해야 합니까?
    우리는 할 수 있어!먼저 IFTT 대시보드로 돌아가서 새 애플릿을 만들고 TickTick을 서비스로 사용합니다.이번에는 다른 트리거를 선택해서 새로 완성한 작업을 선택하십시오.마찬가지로 원하는 필터 (목록, 탭 등) 를 선택한 다음 작업 단계에 들어가서 웹훅스를 선택하십시오.
    API/dev/todos/complete의 엔드포인트에 요청합니다.걱정하지 마라, 우리는 곧 이것을 만들 것이다.PUT 방법을 사용하여 application/json 내용 유형을 만들고 작은 프로그램에서 같은 주체를 선택한 다음 저장합니다.
    이제 ticktick api 코드 백업을 열고 update.js 파일을 봅시다.이것은 todo 항목을 업데이트하기 위해 URL에 있는 ID와 이 URL에 발표된 데이터 속성이 필요합니다.그러나, 목록의 어떤 항목을 업데이트해야 하는지 확인하고, DynamoDB 실례에서 checked로 표시할 수 있도록 경미한 수정을 할 것입니다.
    업데이트된 파일은 다음과 같아야 합니다.
    'use strict';
    
    const AWS = require('aws-sdk');
    
    const dynamoDb = new AWS.DynamoDB.DocumentClient();
    
    module.exports.update = (event, context, callback) => {
      const timestamp = new Date().getTime();
      const data = JSON.parse(event.body);
    
      const params = {
        TableName: process.env.DYNAMODB_TABLE,
        ExpressionAttributeValues: {
          ':text': 'text',
          ':list': 'list',
        },
        FilterExpression: 'list = :list and text = :text'
      };
    
      dynamoDb.scan(params, function (error, result) {
    
        result.Items.forEach(function (element, index, array) {
          const updateParams = {
            TableName: process.env.DYNAMODB_TABLE,
            Key: {
              id: event.pathParameters.id,
            },
            ExpressionAttributeNames: {
              '#todo_text': 'text',
              '#todo_list': 'list',
            },
            ExpressionAttributeValues: {
              ':text': data.text,
              ':list': data.list,
              ':checked': true,
              ':updatedAt': timestamp,
            },
            UpdateExpression: 'SET #todo_text = :text, #todo_list = :list, checked = :checked, updatedAt = :updatedAt',
            ReturnValues: 'ALL_NEW',
          }
    
          dynamoDb.update(updateParams, (error, result) => {
            const response = {
              statusCode: 200,
              body: JSON.stringify(result.Attributes),
            };
            callback(null, response);
          });
        });
      });
    };
    
    지금 우리가 해야 할 일은 터미널 운행serverless deploy에서 람다의 실례를 다시 업데이트하는 것이다. 우리는 시작할 수 있다!TickTick의 항목을 선택하면 API의 동일한 항목에 checked: true 속성이 있습니다.

    이렇게!


    목록에 추가된 항목을 저장하고 다른 응용 프로그램에서 프로그래밍 방식으로 참조할 수 있는 개인 TickTick REST API가 있습니다.궁금한 점이 있으시면 언제든지 댓글로 알려주세요.
    이 API를 사용하는 내용과 제가 종사하고 있는 다른 웹 개발 프로젝트에 대한 더 많은 업데이트를 알아보기 위해 여기 있거나 계속 저를 주목해 주십시오.

    좋은 웹페이지 즐겨찾기