freee API를 사용하여 영수증 이미지를 함께 업로드

11662 단어 apifreeeNode.js
이 기사는 freee API로 업무를 즐겁고 편리하게 해킹하자! 【PR】 freee Advent Calendar 2020의 25 일째 기사입니다.

소개



만나서 반갑습니다, 특정 비영리 활동 법인 뉴 크리에이터 오르그에서 이사장을하고 있습니다, yoshi (@ Yoshi 1125 Hisa)입니다.
이사장이라고 해도, 적은 멤버로 운영하고 있는 NPO 법인이므로, 경비 관리로부터 엔지니어링 등 폭넓은 업무를 실시하고 있습니다.

자, 본제에 들어갑니다.
freee API를 사용해 거래 데이터를 정리해 등록한다~ 같은 기사는 잘 보입니다만, 영수증을 정리해! 라는 것은 별로 없었던 것 같은 (간과할지도 모릅니다만) 생각합니다.
영수증의 파일이 정리되어 있는 폴더를 API를 사용해 정리해 업로드할 수 있으면 좋겠다~, 라고 생각했으므로, 이번은 freee API를 사용해 영수증의 화상 데이터를 정리해 업한다고 하는 것을 목표에 freee API와 node.js를 사용하여 바삭 바삭한 코드를 작성해 보았습니다.

환경


  • MacOS
  • Node.js v12.x

  • 바로 써보자



    요청 방법 확인



    회계 API 참조 Version: 2020-06-15에서 요청 방법을 확인합니다.

    이번에는 영수증 업로드를 원하므로 끝점은
    /api/1/receipts
    

    네요.

    또한,



    request body에는 이러한 요소가 필요합니다. company_id 는 사업장 ID, API 토큰을 취득할 때 확인할 수 있는 것을.

    curl 등으로 API에 액세스하는 방법은
    curl -X POST "https://api.freee.co.jp/api/1/receipts" -H "X-Api-Version: 2020-06-15" -H "accept: application/json" -H "Authorization: Bearer <API_TOKEN>" -H "Content-Type: multipart/form-data" -F "company_id=<COMPANY_ID>" -F "description=<FILE_NAME>" -F "issue_date=" -F "receipt=@<FILE_NAME>;type=image/<FILE_TYPE>"
    

    이런 형태가 될 것입니다.

    주의해야 할 곳으로 API 버전이 새로워지면 요청 헤더에 X-Api-Version: 2020-06-15를 추가해야 합니다.

    구현



    1) 작업을 위한 디렉토리 준비
    $ mkdir freee-receipt-uploader
    $ cd freee-receipt-uploader
    

    2) yarn에서 필요한 패키지 설치
    $ yarn init
    

    그 후,
    $ yarn add form-data axios dotenv
    

    에서 패키지를 다운로드하십시오.

    각각
  • form-data ... 브라우저의 FormData와 같은 거동을한다
  • axios ... API 호출
  • dotenv ... .env 파일에서 환경 변수 설정을 허용합니다

  • 위와 같이 할 수 있는 패키지입니다.

    코드 작성



    index.js
    const fs = require("fs");
    const path = require("path");
    const FormData = require("form-data");
    const axios = require("axios");
    require("dotenv").config();
    const auth_token = process.env.AUTH_TOKEN;
    const company_id = process.env.COMPANY_ID;
    
    const dirPath = path.resolve(__dirname, "img");
    const list = fs.readdirSync(dirPath);
    console.log(list)
    
    const URL = `https://api.freee.co.jp/api/1/receipts`;
    
    for (let i = 0; i < list.length; i++){
        const imagePath = './img/' + list[i]
        const file = fs.createReadStream(imagePath);
    
        const form = new FormData();
        form.append("receipt", file);
        form.append("company_id", company_id);
    
        const config = {
            headers: {
                accept: "application/json",
                "X-Api-Version": "2020-06-15",
                Authorization: "Bearer " + auth_token,
                "Content-Type": "multipart/form-data",
                ...form.getHeaders(),
            },
        };
    
        axios
            .post(URL, form, config)
            .then((res) => console.log(res.data))
            .catch((err) => console.log(err));
    }
    

    이렇게 설명합니다. 또, 이것에 대응하는 .env (을)를 써야 합니다만, 형식은 이러한 형태입니다.

    .env
    COMPANY_ID=XXX
    AUTH_TOKEN=XXXX
    
    AUTH_TOKEN는 응용 프로그램을 제작 한 후

    맨 아래에 나오는 URL을 연 후 인가하는 액세스 토큰입니다.COMPANY_ID는 shell입니다.
    curl -i -X GET \
      -H "Authorization:Bearer (さっきのアクセストークン)" \
      -H "Content-Type:application/json" \
    'https://api.freee.co.jp/api/1/companies'
    

    를 실행했을 때 나오는 ID입니다.

    실행하다



    이것을 실행해 아래와 같이 confirmed 가 되면 완료입니다!
    {
      receipt: {
        id: XXXXXXXX,
        status: 'confirmed',
        description: null,
        issue_date: '2020-12-25',
        created_at: '2020-12-25T00:30:09+09:00',
        mime_type: 'image/jpeg',
        origin: 'public_api',
        file_src: 'https://secure.freee.co.jp/api/p/receipts/revisions/XXXXXXX/download',
        user: { id: XXXXXXX, email: '[email protected]', display_name: null }
      }
    }
    

    무사히 영수증이 등록되었습니다!



    주의


  • FormData는 getHeaders 함수로 header를 보내기 위해 생성합니다
  • 영수증 이미지를 FormData에 추가 할 때 요소 이름을 반드시 receipt로 지정해야합니다

  • 결론



    이런 식으로 폴더의 이미지를 함께 freeee에 업로드 할 수있었습니다.
    모은 영수증의 데이터도 커맨드 하나로 편하게 업로드할 수 있으므로 필요한지 모르겠지만, 꼭 사용해 보세요.

    끝까지 읽어 주셔서 감사합니다.

    리포지토리



    좋은 웹페이지 즐겨찾기