Kindle에서 구입한 책을 자동으로 부크로그에 등록

⚠️ Amazon에서 보낸 Kindle 메일은 규격이 변경되어 현재 작동하지 않습니다.좋은 생각이 있으면 메시지를 남겨 주세요.

개시하다


갑자기 여러분은 독서를 어떻게 관리합니까?
제가 사용하는 것은 부크로그 서비스입니다.기존에는 독서계를 사용했지만, 책에 기재된 ISBN 코드와 아마존의 아스인 코드로 등록서[1]가 가능하다는 사실을 알게 된 브크로그는 최근에야 브크로그로 옮겼다.
어차피 자동화하고 싶어서 찾아봤어요.그래서 선조들이 같은 일을 고려했기 때문에 참고하면서 하기로 했다.이 기사는 그 소개입니다.

만든 물건


Kindle로 책을 구매할 때 아마존이 메일을 보냅니다.그 메일에서 사용하고 싶은 Assin 코드만 뽑아 구매한 책을 부크로그에 등록했다.처리 로그를 스프레드시트에 등록합니다.
이러한 프로세스는 Type Script로 작성되고 GiitHub로 버전 관리됩니다.GiitHub Actions를 사용하여 Google Apps Script로 자동으로 이동하며 Google Apps Script의 트리거를 통해 정기적으로 실행됩니다.

만들어진 물건의 전체상
소스 코드 여기 있습니다.
https://github.com/ega4432/kindle-booklog-sync

프로그램 만들기


다음 몇 가지만 고르세요.

Google Apps Script를 로컬로 사용


Gmail은 Amazon의 메일 주소이기 때문에 사용하기 편리한 Google Apps Script(이하 GAS)를 선택했습니다.
또한 Class를 사용하면 GAS를 로컬에서 처리할 수 있습니다.그 장점은 다음과 같다.
  • 코드를 Giit에 쉽게 관리
  • Clapp는 Type Script
  • 를 지원합니다.
  • 좋아하는 편집기의 점 사용 가능
  • 먼저 Class CLI를 가져옵니다.
    # Clasp をインストール
    $ npm install -g @google/clasp
    
    # 確認
    $ clasp --version
    
    # ブラウザが開くので、Google アカウントで認証します
    $ clasp login
    

    프로젝트 작성


    Class CLI를 사용하여 제작합니다.--type 옵션을 사용하여 프로젝트와 연관된 스프레드시트를 동시에 작성합니다.
    $ clasp create --title "kindle-booklog-sync" \
        --type sheets \
        --rootDir ./src
    
    로컬에서 appsscript.json 포함된 모형을 제작하면 OK.

    GAS로 Gmail 검색


    실제 ./src 디렉터리에 TS 파일을 만들어 쓰지만 Google 서비스를 사용할 때 GAS를 사용하면 다음과 같이 간단합니다.
    interface GmailApp {
      search(query: string): GmailThread[]
    }
    
    const searchEmail = (): GmailThread[] => {
      return GmailApp.search("from:[email protected] in:inbox")
    }
    
    참고로 메일 검색에서 실제로 Kindle로 책을 구매할 때 보내는 메일 주소는 from으로 지정되었다.

    Assin 코드로 부크로그에 책을 등록하다


    로그인 처리는 필요하지만 이번에는 실제 로그인 처리를 생략했다.UrlFetchApp.fetch() 이러한 방법으로 HTTP 요구 사항을 보낼 수 있습니다.되돌아오는 값은 HTTPResponse로 상태 코드와 응답 주체를 얻을 수 있습니다.
    const uploadBook = (cookies: string[], asinList: string[]): HTTPResponse => {
      const url = 'https://booklog.jp/input'
    
      return UrlFetchApp.fetch(url, {
        method: 'post',
        headers: {
          Cookie: cookies.join(';'),
          Referer: url
        },
        payload: {
          isbns: asinList.join("\n"),
          category_id: 0, // なし
          status: 4 // 積読
        }
      })
    }
    
    category_id는 부크로그의 종류다.그 아이디를 미리 만들어서 지목할 수 있어요. 저처럼 0이면未選択.status독서상황입니다.0: 未設定,1: 読みたい,2: いま読んでる,3: 読み終わった,그래서 먼저 샀어4: 積読.

    결과를 스프레드시트에 쓰기


    위의 HTTP 응답을 스프레드시트에 저장합니다.getSheetByName() 방법 매개 변수가 작업표의 이름을 지정했습니다.마음에 드는 이름을 미리 정해 두세요.
    const log = (asin: string, text: string): void => {
      SpreadsheetApp.getActiveSpreadsheet()
        .getSheetByName('log') // シート名を記載
        .appendRow([new Date(), asin, text])
    }
    
    실행 후 보니 데이터가 잘 보존되어 있었다.

    부크로거 확인


    부크로그도 확인해 봤는데 등록이 됐어요.듣기에 괜찮다.

    GiitHub Action으로 설계


    이번에 git tag를 트리거 프로그램으로 스크립트를 만들었다.길어졌기 때문에 전선을 잘 접어라.env 구역에서 사용하는 환경 변수는 반드시 사전에 GiitHub에 등록해야 한다.リポジトリ TOP>Settings>Secrets는 등록 화면에 들어갈 수 있습니다.
    .github/workflows/deploy.yml
    name: Deployment
    
    on:
      push:
        tags:
          - "v*"
    
    jobs:
      deploy:
        runs-on: ubuntu-latest
        strategy:
          matrix:
            node-version: ['14.16.x']
    
        env:
          CLASP_ACCESS_TOKEN: ${{ secrets.CLASP_ACCESS_TOKEN }}
          CLASP_CLIENT_ID: ${{ secrets.CLASP_CLIENT_ID }}
          CLASP_CLIENT_SECRET: ${{ secrets.CLASP_CLIENT_SECRET }}
          CLASP_EXPIRY_DATE: ${{ secrets.CLASP_EXPIRY_DATE }}
          CLASP_ID_TOKEN: ${{ secrets.CLASP_ID_TOKEN }}
          CLASP_REFRESH_TOKEN: ${{ secrets.CLASP_REFRESH_TOKEN }}
          CLASP_SCRIPT_ID: ${{ secrets.CLASP_SCRIPT_ID }}
    
        steps:
          - name: Checkout
            uses: actions/checkout@v2
    
          - name: Setup node
            uses: actions/setup-node@v2
            with:
              node-version: ${{ matrix.node-version }}
              cache: 'yarn'
    
          - name: Set env
            id: yarn-cache-dir-path
            run: echo "::set-output name=dir::$(yarn cache dir)"
    
          - name: Cache node modules
            uses: actions/cache@v2
            id: yarn-cache
            with:
              path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
              key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
              restore-keys: ${{ runner.os }}-yarn-
    
          - name: Create authentication file
            run: |
              echo $(cat <<-EOS
              {
                "token": {
                  "access_token": "${CLASP_ACCESS_TOKEN}",
                  "scope": "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/script.webapp.deploy openid https://www.googleapis.com/auth/script.projects https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/service.management https://www.googleapis.com/auth/logging.read https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/script.deployments https://www.googleapis.com/auth/drive.metadata.readonly",
                  "token_type": "Bearer",
                  "id_token": "${CLASP_ID_TOKEN}",
                  "expiry_date": ${CLASP_EXPIRY_DATE},
                  "refresh_token": "${CLASP_REFRESH_TOKEN}"
                },
                "oauth2ClientSettings": {
                  "clientId": "${CLASP_CLIENT_ID}",
                  "clientSecret": "${CLASP_CLIENT_SECRET}",
                  "redirectUri": "http://localhost"
                },
                "isLocalCreds": false
              }
              EOS
              ) > ~/.clasprc.json
          - name: Create clasp application file
            run: |
              echo $(cat <<-EOS
              {
                "scriptId": "${CLASP_SCRIPT_ID}",
                "rootDir": "./src",
                "fileExtension": "ts"
              }
              EOS
              ) > ./.clasp.json
          - name: Get version
            id: version
            run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
    
          - name: Deploy to GAS
            run: npx @google/clasp push --force
    
          - name: Add version
            run: npx @google/clasp version ${{ steps.version.outputs.VERSION }}
    
    GiitHub Actions가 정상적으로 완료되면 clasp open 완료 여부를 확인합니다.

    트리거 설정


    GAS 디버깅 후 정기적으로 실행되는 트리거를 설정합니다.왼쪽 메뉴에서 트리거를 선택하고 '트리거 추가' 를 통해 트리거를 설정할 수 있습니다.나는 매일 실행한다.

    총결산


    지금까지 GAS는 브라우저 편집기에 많이 쓰여 있기 때문에 자주 사용하는 편집기는 편집기의 기능을 직접 사용할 수 있고 효율이 높으며 스트레스 없이 실현할 수 있다.또한 Type Script를 사용하여 유형 정의를 수행할 수 있다는 점이 좋습니다.
    또 GiitHub에서 관리할 수 있는 곳이 상당히 크다고 생각합니다.(이번 내용은 개인적이지만) 팀 개발에 꼭 필요한 것과 GiitHub Actions를 사용하는 것이 큰 장점이다.
    이 책을 읽어 보신 여러분, 이런 독서 관리 방법이 있다면 꼭 알려주세요!

    사이트 축소판 그림


    https://tateren.hateblo.jp/entry/2016/10/03/025425
    https://rela1470.hatenablog.jp/entry/2018/02/05/205140
    https://panda-program.com/posts/clasp-typescript
    https://dev.classmethod.jp/articles/typescript-clasp-github-actions/
    각주
    브로그 웹 책꽂이 서비스 ↩︎

    좋은 웹페이지 즐겨찾기