【第三回】コロナ禍だから何かできることをー　自宅療養者連絡ツール　ー

#前回までのあらすじ
[【第二回】コロナ禍だから何かできることを](https://qiita.com/STYLE-D/items/9e0addd8df44be8590b7)

####実装イメージ図
LINEを利用して保健所の担当者の負担を軽減するとともに、自宅療養者はいつでもつながっている安心感を持たせるためのツールイメージです。
![メイン.00_00_51_12.Still002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/cf85391e-aef8-5a59-0a1d-63d8e15412ce.jpeg)

##まずはLINEからデータベースまでの流れを考えよう
![システム構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/ac5262ba-5db6-bdc3-d7f1-6c007182fce8.jpeg)

WebHookで取得したデータを解析して、メッセージの内容によって処理を分ける部分の説明をします。
今回はPHPで実装します。


やりとりする中身のフォーマットはこちらを参考にしてください。
[MessagingAPIリファレンス](https://developers.line.biz/ja/reference/messaging-api/#image-message)


###LINEbotからWebhookで取得したデータの取得処理
```php5
//ユーザーからのメッセージ取得
$j_str = file_get_contents('php://input');
$j_obj = json_decode($j_str);

//取得データ
$replyToken = $j_obj->{"events"}[0]->{"replyToken"};              //返信用トークン
$line_id = $j_obj->{"events"}[0]->{"source"}->{"userId"};         //LINE_ID
$message_type = $j_obj->{"events"}[0]->{"message"}->{"type"};     //メッセージタイプ
$message_text = $j_obj->{"events"}[0]->{"message"}->{"text"};     //メッセージ内容

//メッセージタイプが「text」以外のときは何も返さず終了
if($message_type != "text") exit;
```

###LINEbotからWebhookで取得したデータの取得処理
「体温報告」の文字が存在した場合
#####　　　　ボタンメッセージを返す
　　　　![体温報告ー結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/d6feddc7-6d06-f601-96d6-6d882fa874e1.png)

「体調報告」の文字が存在した場合
#####　　　　ボタンメッセージを返す
　　　　![体調報告ー結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/36a5f9cd-402e-3726-ffde-e5ca8a89218e.png)

以下の文字の場合
　　　　【体温調査】"平熱"、"微熱"、"高熱"
　　　　【体調調査】"OK"、"NG"、"HELP"          

データベースに更新して、メッセージを返す
　　　　![連絡しましたー結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/744261/31bc3057-9ba7-0fac-95a5-1e36ebc33fef.png)

それ以外は、

申し訳ありません。
「<strong>入力されたメッセージ</strong>」については返答しかねます

と返す

```php5
    if ((strpos($message_text,'体温報告')) !== false) { 
        //体温測定
        $response_format_text = [
            [
                "type" => "template",
                "altText" => "現在の体温を教えてください",
                "template" =>  [
                    "type" => "buttons",
                    "title" => "体温調査",
                    "text" => "現在の体温を教えてください",
                    "actions" => [
                            [
                                "type" => "message",
                                "label" => "平熱",
                                "text" => "平熱"
                            ],
                            [
                                "type" => "message",
                                "label" => "微熱",
                                "text" => "微熱"
                            ],
                            [
                                "type" => "message",
                                "label" => "高熱",
                                "text" => "高熱"
                            ],
                        ]
                ]
            ]
        ];
    } elseif ((strpos($message_text,'体調報告')) !== false) { 
        //体調返答
        $response_format_text = [
            [
                "type" => "template",
                "altText" => "現在の体調を教えてください",
                "template" =>  [
                    "type" => "buttons",
                    "title" => "体調調査",
                    "text" => "現在の体調を教えてください",
                    "actions" => [
                            [
                                "type" => "message",
                                "label" => "無症状",
                                "text" => "OK"
                            ],
                            [
                                "type" => "message",
                                "label" => "熱があるまたは息苦しい",
                                "text" => "NG"
                            ],
                            [
                                "type" => "message",
                                "label" => "熱があり息苦しい",
                                "text" => "HELP"
                            ],
                        ]
                ]
            ]
        ];
    }else{
        switch($message_text){
            case "平熱":
            case "微熱":
            case "高熱":
                //体温調査
            case "OK":
            case "NG":
            case "HELP":
                //体調報告
                $return_message_text = "連絡しました";
                break;
            default: 
                $return_message_text = "申し訳ありません。\r\n「" . $message_text . "」については返答しかねます";
        };
        // レスポンスフォーマット
        $response_format_text = [
            [
                "type" => "text",
                "text" => $return_message_text
            ]
        ];
    }
```

###生成した連想配列をjson形式に変更してLINEbotへ返す処理


```php5
$accessToken = '第二章で設定されていたアクセストークンをコピーする';

//ポストデータ
$post_data = [
    "replyToken" => $replyToken,
    "messages" => $response_format_text
];
 
//返信実行
sending_messages($accessToken, $post_data);

//メッセージの送信
function sending_messages($accessToken, $post_data){

    //curl実行
    $ch = curl_init("https://api.line.me/v2/bot/message/reply");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
    ));
    $result = curl_exec($ch);
    curl_close($ch);
}
```

次回はこの記述にデータベース更新処理の追加を説明します。


#コロナ禍だから何かできることをー　自宅療養者連絡ツール　ー
[【第一回】実装イメージ図と動画](https://qiita.com/STYLE-D/items/743bbecae1c52be15505)
[【第二回】LINEからデータを取得して返すまでの流れ](https://qiita.com/STYLE-D/items/9e0addd8df44be8590b7)
->>[【第三回】LINEからデータベースまでの流れ](https://qiita.com/STYLE-D/items/345e9142948c00330e71)
[【第四回】データベースへの更新までの流れ](https://qiita.com/STYLE-D/items/8af17d7f94f5c351ede0)
[【第五回】ユーザー登録の仕組み-LINEbotの設定部分](https://qiita.com/STYLE-D/items/a745bd5faeb68caa1d7c)
[【第六回】ユーザー登録の仕組みLIFFで表示する画面の開発](https://qiita.com/STYLE-D/items/321038c8028eb9e9231f)
[【第七回】データベースの構造](https://qiita.com/STYLE-D/items/71085dc9a04042f33f0e)
[【第八回】WEB画面上でできる機能](https://qiita.com/STYLE-D/items/c32e9098a3948e8f32f2)
[【第九回】まとめ](https://qiita.com/STYLE-D/items/77eb6a8e61ae2201565f)