Instagram APIで自分の投稿へのコメントに自動返信するAWS Lambdaの実装

# Instagram APIを使用して投稿へのコメントに自動返信する機能

この記事では、Instagram APIを利用して、投稿へのコメントに自動でDMで返信する機能をAWS Lambdaを使って実装する方法を紹介します。Facebook MessengerのInstagram APIを活用し、コメントを解析して自動的にDMを送信するプロセスを詳しく解説します！

## 1. はじめに

Instagramの投稿に対するコメントに自動で返信する機能を作成することで、ユーザーとのエンゲージメントを高め、迅速な対応が可能になります。本記事では、その実装方法を詳細に説明します。

## 2. アーキテクチャの構成

### フローチャート

1. ユーザーがInstagramの投稿にコメント
2. Webhookを通じてコメントデータを受信
3. コメント内容を解析し、自動返信メッセージを生成
4. DMを送信

### 使用する技術スタック

- **プログラミング言語**: Python
- **サーバーレスプラットフォーム**: AWS Lambda
- **APIゲートウェイ**: AWS API Gateway
- **外部ライブラリ**: requests

## 3. Instagram APIの設定

### 開発者アカウントの取得方法

1. [Instagram for Developers](https://developers.facebook.com/docs/instagram)にアクセスし、開発者アカウントを作成します。

### アプリの登録と設定

1. Facebook Developersサイトで新しいアプリを作成します。
2. **Instagram Graph API**を追加します。
3. **Webhook**を設定し、コメントのフィールドを監視します。

### 必要な権限の取得と設定

以下の権限を取得します：
- `instagram_manage_comments`
- `instagram_basic`
- `pages_messaging`
- `instagram_manage_messages`
- `pages_manage_metadata`
- `pages_show_list`
- `business_management`

これらの権限は、コメントの管理、メッセージの送信、ページの管理などに必要です。

### APIキーの取得

 - Facebook for Developersでアプリに関連付けられたアクセストークンを取得します。
こちらの記事がわかりやすいです！

https://tabiato.co.jp/biz/blog/instagram-graph-api-setup/

 -  取得したアクセストークンをAWS Lambdaの環境変数として設定します。

## 4. AWS API GateWayの設定

 - まずは、AWSで作成したLambdaに、トリガーを設定します。
![スクリーンショット 2024-05-26 213832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/1b8e0a16-7604-ec28-ab03-d39bebe329c7.png)
 - Lambdaのプログラムは、下に示したプログラムをそのままデプロイしてみてください。
 環境設定には、以下の三つのトークンを設定してください。
     1. VERIFY_TOKEN - これは、InstagramとAWSをWebhookでつなげるときのパスワードのようなもので、自分で設定してください。
     1. ACCESS_TOKEN - 先ほど取得したAPIキーを設定してください。
     1. PAGE_ID - [グラフAPIエクスプローラ](https://developers.facebook.com/tools/explorer/)で`https://graph.facebook.com/v19.0/me?fields=id,name`をリクエストすると取得できます。






### Webhookの設定

https://developers.facebook.com/apps/?show_reminder=true

 - まずは、こちらにログインをして下の画面で作成したアプリから、Webhookの設定を探して開きます。
 
![スクリーンショット 2024-05-26 212609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/0698eeb7-6b0a-a800-5e4e-bcf47404c32f.png)

 - コールバックURLには、AWSのAPIエンドポイントのURLをセットします。
    
![スクリーンショット 2024-05-26 224506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/fd15e85d-5ac4-bc61-dea6-a134145f17eb.png)

 - トークンを認証のところは、環境変数のVERIFY_TOKENに設定したものを設定します。

![スクリーンショット 2024-05-26 214325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/30dac41b-65e9-b2ac-6e31-c3d9b197de6d.png)

 - 認証が完了したら、`comment`のサブスクライブを有効化して設定は完了です。


## 5. プログラム

### 必要なライブラリのインストール

AWS Lambdaでは、`requests`ライブラリを含むパッケージをデプロイする必要があります。ローカルでパッケージを準備し、ZIPファイルとしてアップロードします。

### ソースコード

以下がプログラムコードです。

```python
import os
import json
import requests

VERIFY_TOKEN = os.environ['VERIFY_TOKEN']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
PAGE_ID = os.environ['PAGE_ID']

def verify_webhook(event):
    params = event['queryStringParameters']
    if params and params.get('hub.verify_token') == VERIFY_TOKEN:
        return {
            'statusCode': 200,
            'body': params['hub.challenge']
        }
    return {
        'statusCode': 403,
        'body': 'Verification token mismatch'
    }

def send_dm(comment_id, message):
    url = f'https://graph.facebook.com/v19.0/{PAGE_ID}/messages'
    params = {
        'recipient': {
            'comment_id': comment_id
        },
        'message': {
            'text': message
        },
        'access_token': ACCESS_TOKEN
    }
    
    try:
        response = requests.post(url, json=params)
        if response.status_code == 200:
            print("Direct message sent successfully.")
        else:
            print(f"Failed to send direct message. Status code: {response.status_code}")
    except Exception as e:
        print(f"An error occurred: {e}")

def lambda_handler(event, context):
    if event['httpMethod'] == 'GET':
        return verify_webhook(event)
    
    if event['httpMethod'] == 'POST':
        body = event.get('body')
        if not body:
            return {'statusCode': 400, 'body': 'Invalid event data'}
        
        data = json.loads(body)
        entries = data.get('entry', [])
        
        for entry in entries:
            changes = entry.get('changes', [])
            for change in changes:
                if change.get('field') == 'comments':
                    comment_data = change.get('value', {})
                    comment_id = comment_data.get('id')
                    comment_text = comment_data.get('text')
                    
                    message = f"あなたが送信したコメントは「{comment_text}」です。"
                    send_dm(comment_id, message)
        
        return {'statusCode': 200, 'body': 'Webhook received'}

    return {'statusCode': 400, 'body': 'Unsupported method'}


```

## 6. 参考文献
https://qiita.com/wada1355/items/d3101a8fc79e1953dfcc

https://qiita.com/te-k/items/4e6c6649e97eac1da998

https://developers.facebook.com/docs/instagram

https://tabiato.co.jp/biz/blog/instagram-graph-api-setup/