Azure Functions でLineメッセージを送受信する

Azure Functions でLineメッセージを送受信する手順を解説します。  

## LINE Developersコンソールからチャネルを作成

下記手順を参考にLINE Developersコンソールからチャネルを作成します。  
[LINE Developersコンソールでチャネルを作成する](https://developers.line.biz/ja/docs/messaging-api/getting-started/#using-console)

- [LINE Developersコンソール](https://developers.line.biz/console/)へログイン
- `Messaging API`のチャンネルを作成  
![image](https://user-images.githubusercontent.com/38905609/181906073-e2371056-01c9-4329-abf1-5e3334fdc3f0.png)

## Azure Functions の作成

👇Azure Functions の作成及び関連設定は、以下記事参照下さい。  
[Azure Functions でPython関数を作成してデプロイする](https://docs.saurus12.com/azure/azure_function_python)

👇**HTTP trigger**関数の作成

```text
func new
```

- `select a template`で**HTTP trigger**を選択します。
- `select a Auth Level`で**ANONYMOUS**を選択します。

👇下記のように、リクエスト内容をログ出力するようコードを記載します。  

```python
@app.route(route="http_trigger", auth_level=func.AuthLevel.ANONYMOUS)
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    req_body = json.loads(req.get_body())
    logging.info(req_body)
```

👇以下記事を参考に関数をデプロイします。  
[Azure Functions でPython関数を作成してデプロイする](https://docs.saurus12.com/azure/azure_function_python)

## HTTP エンドポイントの取得

👇HTTPエンドポイント

```text
https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>
```

**APP_NAME:line-bot-sample**、**FUNCTION_NAME:http_trigger**の場合、HTTPエンドポイントは下記です。

```text
https://line-bot-sample.azurewebsites.net/api/http_trigger
```

## Webhookを設定する

下記手順を参考にWebhookを設定します。
[Webhook URLを設定する](https://developers.line.biz/ja/docs/messaging-api/building-bot/#setting-webhook-url)

- [LINE Developersコンソール](https://developers.line.biz/console/)へログインし、Webhookへ設定します。
![image](https://user-images.githubusercontent.com/38905609/181907710-9ccf73c4-06f1-44e2-b076-2918bbe33d8b.png)
![image](https://user-images.githubusercontent.com/38905609/181907763-3b3455e4-3220-4bbd-98ba-e020bc794a46.png)

- Webhookを有効化します。  
![image](https://user-images.githubusercontent.com/38905609/181908385-87fe6e32-702f-49bd-a160-47aed8746004.png)

- QRコードに表示されたQRコードを利用してAPIをお友達追加します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708851/017df4b9-2ff1-2844-ce9d-08845d88bf05.png)

- Lineからメッセージを送信し、関数ログに出力されることを確認します。  
※ また、LineのユーザIDをここから取得します。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708851/36edd425-002e-0599-2743-a0aa884df043.png)

## メッセージを送信する

### メッセージ送信のため、チャンネルアクセストークンを取得

- [チャネルアクセストークン](https://developers.line.biz/ja/docs/messaging-api/channel-access-tokens/)
- 手っ取り早く`長期のチャネルアクセストークン`を取得します。
- [長期のチャネルアクセストークン](https://developers.line.biz/ja/docs/messaging-api/channel-access-tokens/#long-lived-channel-access-tokens)
![image](https://user-images.githubusercontent.com/38905609/181907710-9ccf73c4-06f1-44e2-b076-2918bbe33d8b.png)
![image](https://user-images.githubusercontent.com/38905609/181912508-a7848d8d-dd7d-4e96-a4fb-16127187239e.png)
![image](https://user-images.githubusercontent.com/38905609/181913392-4faaf913-fe68-458b-b61e-ca1b323bd6fa.png)

### ユーザIDを指定してメッセージ送信

- 上記で確認したユーザIDを設定
- 上記で取得した`長期のチャネルアクセストークン`を設定
- [メッセージを送信する](https://developers.line.biz/ja/docs/messaging-api/sending-messages/)
- [プッシュメッセージを送る](https://developers.line.biz/ja/reference/messaging-api/#send-push-message)  

```python
import json
import urllib.request

main_logic()

def main_logic():
    print("main_logic start")

    access_token = "xxxx_access_token_xxxxxxxxxx"
    
    url = "https://api.line.me/v2/bot/message/push"
    method = "POST"
    headers = {
        'Authorization': "Bearer " + access_token,
        'Content-Type': 'application/json'
    }
    messages = [
        {
            "type": "text",
            "text": "テストメッセージです！！"
        }
    ]
    params = {
        "to":"Uxxxxxsend_userid_XXXXXXXXXXXXXXXXXXX"
        ,"messages": messages
    }
    request = urllib.request.Request(url, json.dumps(params).encode("utf-8"), method=method, headers=headers)
    with urllib.request.urlopen(request) as res:
        body = res.read()
        print(body)

```

## 👇関連記事

- [AWS Lambda でLine bot を作成する](https://docs.saurus12.com/aws/line_bot)  
- [Azure Functions でPython関数を作成してデプロイする](https://docs.saurus12.com/azure/azure_function_python)

## 👇参考URL

- [Azure Functions の HTTP トリガ](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=python-v2%2Cisolated-process%2Cnodejs-v4%2Cfunctionsv2&pivots=programming-language-python#customize-the-http-endpoint)

[keywords]  
Azure Functions Line bot

[Azure Functions でLineメッセージを送受信する](https://docs.saurus12.com/azure/line_bot)

更新日:2024年02月13日