LoginSignup
2
1

Serverless Frameworkを使ってKindleの価格を通知するLINE Botを作ってみた

Last updated at Posted at 2024-02-12

概要

Amazonのほしい物リストをスクレイピングし、その情報を通知するLINE Botを作成しました。
特に Kindle 向けに最適化されています。

Amazon EventBridgeによる定期実行、もしくはメッセージに対する応答として、Kindle版と紙の本の価格やポイントを通知するLINE Botです。
kindle-wishlist-to-line.jpg

プロジェクトの目的と動機

Kindleの値下げを見逃さないために開発しました。

Kindleの価格はセール時に大きく下がることがありますが、AmazonのスマホアプリではKindleの価格を確認できず、値下げを逃すことがしばしばありました。
その課題を解決するために、このLINE Botを作りました。

技術スタック

技術スタックは以下のようになっています。

technology-stack.png

  • Node.js: このプロジェクトはNode.jsで実装されています。
  • Puppeteer: Amazonのほしい物リストから情報をスクレイピングするために使用します。
  • LINE Messaging API: 通知をLINEに送信するために使用します。
  • Serverless Framework: AWSへのデプロイと管理を容易にするために使用しています。
  • AWS Lambda: バックエンドの処理を実行するために使用します。
  • API Gateway: LINEのWebhookを処理するために使用します。
  • Amazon EventBridge: 定期的な通知をスケジュールするために使用します。

構築手順

このプロジェクトでは、ほしい物リストのURLを環境変数で設定して利用します。
そのため、各ユーザーが自身のほしい物リストに合わせて設定を行う必要があります。

1. リポジトリのクローン

$ git clone https://github.com/GorillaSwe/kindle-wishlist-to-line.git

2. Serverless Framework が使う IAMユーザーの作成 と AWS CLI の設定

AWSコンソールにログインし、IAMのユーザーの作成をクリックし、任意のユーザー名を入力します。
click-create-iam-user.png

ポリシーを直接アタッチするを選択し、AdministratorAccessを選択し、ユーザーを作成します。
create-iam-user.png
IAMロールの権限を制限したい場合は以下サイトを参考に独自でセットアップして下さい。

ユーザーが作成できたら、アクセスキーを作成からアクセスキーシークレットアクセスキーを作成します。
create-aws-access-key.png

続いて、AWS CLIをインストールし、先ほど取得したアクセスキーシークレットアクセスキーを入力しIAMユーザーの認証情報を設定します。

$ aws configure
  AWS Access Key ID [None]: Your Access Key ID
  AWS Secret Access Key [None]: Your AWS Secret Access Key
  Default region name [None]: ap-northeast-1
  Default output format [None]: json

3. Line Bot の準備

まずは以下の公式サイトにアクセスします。

自分のLINEアカウントにログインします。
login-line-developper.png

作成をクリックし、任意のプロバイダー名でプロバイダーを作成します。
create-provider.png

Messaging APIを選択しチャネルを作成します。
チャネル名やアイコンは任意で設定して下さい。
スクリーンショット 2024-02-10 21.10.47.png

チャネルが作成できたら、チャネル基本設定からチャネルシークレットユーザーIDをメモしておきます。
スクリーンショット 2024-02-11 15.49.17.png

次に、Messaging API設定からチャネルアクセストークンを発行し、メモしておきます。
スクリーンショット 2024-02-11 16.05.54.png

最後に、Messaging API設定のQRコードを読み込み、LINE Botを登録しておきます。
スクリーンショット 2024-02-11 16.09.14.png

4. パッケージのインストール

$ npm install

5. .env ファイルの準備

  • プロジェクトルート直下に.envファイルを作成します。
  • LINE Messaging APIの認証情報とAmazonのほしい物リストのURLを.envファイルに記入します。
  • Amazonのほしい物リストが公開に設定されていることを確認します。
# .env
AMAZON_WISHLIST_URL="Your Amazon Wishlist URL"
CHANNEL_ACCESS_TOKEN="Your LINE Access Token"
CHANNEL_SECRET="Your LINE Channel Secret"
USER_ID="Your LINE User ID"

6. AWS へのデプロイ

  • 以下コマンドでAWSへのデプロイが実行され、API GatewayのエンドポイントURLが表示されます。
$ npm run deploy
 (中略)
 Deploying kindle-wishlist-to-line to stage dev (ap-northeast-1)
 ✔ Service deployed to stack kindle-wishlist-to-line-dev (49s)

 endpoint: POST - https://XXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/webhook
  functions:
   lineWebhookHandler: kindle-wishlist-to-line-dev-lineWebhookHandler (71 MB)
   scheduledHandler: kindle-wishlist-to-line-dev-scheduledHandler (71 MB)

7. Webhook URL の設定

LINE Developersに再度ログインし、取得したAPI GatewayのエンドポイントURLをWebhook URLに設定します。

スクリーンショット 2024-02-12 15.35.32.png

Webhookの利用もONに設定します。
スクリーンショット 2024-02-12 15.36.16.png

8. 結果

Amazon EventBridgeによる定期実行、もしくはメッセージに対する応答時に以下のように出力されます。
kindle-wishlist-to-line.jpg

定期実行のタイミング変更

serverless.ymlでAmazon EventBridgeの定期実行を定義しています。
現状は日本時間の朝7時に設定していますが、変更したい場合はrate: cron(0 22 * * ? *)を修正して下さい。
Amazon EventBridgeでは、Cronで設定するイベント時刻はタイムゾーンがUTC(協定世界時)となっているため、日本標準時(JST)との時差を考慮して下さい。

functions:
  scheduledHandler:
    handler: src/handlers/scheduledHandler.handleScheduledEvent
    events:
      - schedule:
          rate: cron(0 22 * * ? *)
          enabled: true

詳細なコードは、GitHubのリポジトリで公開しています。
興味のある方は是非チェックしてみてください。

注意点

Amazonへのスクレイピングを行う際は、アクセス頻度や速度に注意して下さい。
サーバーに過度な負荷をかけてしまうと、偽計業務妨害罪に問われる可能性があるので、使用する際は十分にご注意ください。

まとめ

この記事では、Amazonのほしい物リストを通知するLINE Botの作成過程を説明しました。
間違っている箇所や疑問に思ったことがあれば、ぜひコメントをください!

最後まで読んでいただき、ありがとうございました。
次回は、スクレイピングの実装について具体的に深掘りしていきます。

(2024/2/15追記)
スクレイピングの実装について、深掘りした記事を作成しました。
こちらも読んでいただけると嬉しいです。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1