LINE Notify×Alexa『飲み会行きたいです🙇』の許可をAIに任せて心理的負担を減らしたい


# 🍻はじめに🍻
 毎日の飲み会に参加したい夫は、奥さんにその願いを伝えることに躊躇しています。彼は奥さんに頭が上がりません。奥さんとの関係を大切にし、彼女の気持ちを尊重したいと願っていますが、同時に自分の趣味や友人との交流も大切にしたいと感じています。

そんな方へ、「飲みに行きたいです🙇」をAlexaを通してLINEに通知してもらうんです。

# 🍺完成（LINEのメッセージ画面）🍺
LINE Notify から通知してくれるので、確実にあなたへの心理的負担が減ります。もし怒られたとしても「AlexaがLINE通知したからAlexaが怒られているんだと！」気持ちを切り替えることも可能です。

![スクリーンショット 2024-05-11 19.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/2c8d63ea-d2e4-c202-421e-b02acc4f27a6.png)

# 🍾設定🍾
### LINE Notify

※最新の情報を取ってきてください（2024年4月現在）

https://notify-bot.line.me/ja/

マイページ→トークンを発行
•トークン名を記入してください (通知の際に表示されます)→おこのみで（上のラインでは『ぴよこ』部分）💗かわいい和む名前をおすすめ
•通知を送信するトークルームを選択してください→おこのみで（事前にライングループ作っておけば多数でやり取り可能）


![スクリーンショット 2024-05-11 20.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/e1dcd290-eeb1-6e30-fe93-66daa57d8aeb.png)

↓
![スクリーンショット 2024-05-11 20.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/d6057496-d5ee-2961-5f5a-961a9862a71b.png)

:::note warn
Alexa内のコードで使用するので発行したトークンは絶対にメモしておくこと（今後発行されない）
:::

Line（携帯）の画面に戻る→LINE Notifyをそのグループ招待
＋奥さんのラインもグループ招待　※Alexa用（3）になる


### Alexaのスキル

#### -スキルの作成
Alexa developer console　を検索
![スクリーンショット 2024-05-11 20.14.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/10b421a1-095c-5d1d-4ce7-13d9364d002c.png)

1. スキルに名前を付ける→おこのみで
2. プライマリロケールを選択→お住まいの地域を選択
--次へ--
1. エクスペリエンスのタイプを選択します→おこのみで
2. モデルを選択する→カスタム
3. ホスティングサービス→Alexa-hosted (Python)
ホスト地域→お住まいの地域を選択
--次へ--
Templates→スクラッチで作成

#### -コーディング

![スクリーンショット 2024-05-11 20.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/b0d8423e-5ae0-e5b5-79c4-71f9e2d38bc5.png)

以下のコードをコードエディター内に添付してください（編集する箇所あり）

```ruby:python・json
import logging
import requests
import json

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

def send_to_line_notify(message, token):
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {token}'}
    payload = {'message': message}
    try:
        response = requests.post(line_notify_api, headers=headers, data=payload)
        response.raise_for_status()
        return response
    except requests.RequestException as e:
        logger.error(f"Failed to send notification: {e}")
        return None

def lambda_handler(event, context):
    logger.info('Received event: {}'.format(json.dumps(event)))
    
    # LINE Notifyのアクセストークンを設定（ここ変更）
   
    line_notify_token = 'あなたのLINE Notifyのアクセストークン'
    

    try:
        # Alexaスキルの起動リクエストかどうかをチェック
        if event['request']['type'] == "LaunchRequest":
            # このメッセージがラインに飛んできる（ここ変更）
            message = '大変恐縮ですが、今夜飲み会に行ってきます。10時には帰ります。ケーキ買ってきます。'
            response = send_to_line_notify(message, line_notify_token)
            if response and response.status_code == 200:
                # 通知が成功したら成功レスポンスを返す
                return {
                    'version': '1.0',
                    'response': {
                        'outputSpeech': {
                            'type': 'PlainText',
                            # Alexaが返答する言葉（ここも変更できる）
                            'text': '通知しました'
                        },
                        'shouldEndSession': True
                    }
                }
            else:
                # 通知が失敗したら失敗レスポンスを返す
                return {
                    'version': '1.0',
                    'response': {
                        'outputSpeech': {
                            'type': 'PlainText',
                             # Alexaが返答する言葉（ここも変更できる）
                            'text': '通知に失敗しました'
                        },
                        'shouldEndSession': True
                    }
                }
        else:
            # 起動リクエスト以外のリクエストには対応しない
            return {
                'version': '1.0',
                'response': {
                    'outputSpeech': {
                        'type': 'PlainText',
                         # Alexaが返答する言葉（ここも変更できる）
                        'text': 'このスキルは起動リクエストにのみ対応しています'
                    },
                    'shouldEndSession': True
                }
            }
    except Exception as e:
        logger.error(f"An error occurred: {e}")
        # エラーが発生した場合はエラーレスポンスを返す
        return {
            'version': '1.0',
            'response': {
                'outputSpeech': {
                    'type': 'PlainText',
                     # Alexaが返答する言葉（ここも変更できる）
                    'text': 'エラーが発生しました'
                },
                'shouldEndSession': True
            }
        }


        

```

「デプロイ」を必ず行ってください。コードを保存できます。

####  -呼び出し名の変更

Alexaに呼びかける時の言葉です。※注意がたくさんあるのでよく読んで設定してください。簡単な言葉だとあなたの作成したスキルだとAlexaが反応しなく、実行できないです。多くの改良が必要です。

![スクリーンショット 2024-05-11 20.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/2eb33531-b086-2428-dcfb-22a633f0a240.png)

「デプロイ」を最終的に行ってください。


# 🍶Alexaに呼びかけ🍶

「呼び出し名の変更」で設定した文言をAlexaに言ってみてください。
Alexaから「通知しました」（上のコードを変更しなければ）と同時にLINEにメッセージを通知します。
![スクリーンショット 2024-05-11 19.55.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/ee52f295-f42c-bfc6-d934-72af9f32c498.png)

# 🍸その他🍸
:::note warn
注意点
失敗する時があります。
Alexaも完璧ではありません。例えば、アレクサが聞き間違えることも。そんな時は、発音を少し変えて再挑戦、もしくはコードの文言やスキル呼び出しの言葉も再修正。失敗を恐れずに、試行錯誤を楽しんでください！
:::

人生において、奥さんは一番と言っていいほど大切ですが、同時に自分の趣味や友人との交流も大切でしょう。私は、少しでもあなたの心理的負担を減らすことに貢献できたら幸いです。

応援よろしくお願いします🥰


# 🍺使用機器🍺

今回、使用したAlexa ↓

https://www.amazon.co.jp/Echo-Show-5-エコーショー5-第3世代-スマートディスプレイ-with-Alexa-クラウドブルー/dp/B09B2T3QBN?__mk_ja_JP=カタカナ&crid=12Q8CV9C1LIA7&dib=eyJ2IjoiMSJ9.aDg1_cb5kBwbx2YbPVrXHs6HTB_eulkMABjIh_tz7aOVjjQGkT7DrgdSTuoEJ1F_JT_ydWX-M2Tj9AS55st2NpJ12eLa19GVAwO5gCELQCVyd4ap8jOktW8f-hnBC8cK1FULASC3eDwri3Ho8vJgeEQPJdk-NLWfE4ouLig77iNSr8k6BP7tm8Vk1z1JGIqcO0yWVmvN1iPVDEuH-NZnNKtP14woTzJhbEK07NhKwMkm6YbAmeTmgGiTQ8NavZZidw80iN3Laeqjz5AvNdfcRsYV-4dP58B2EPNTgKZYqBE.dAGoY0hfvpFVNuljgGOORzVTSwFbva9tMLAK_o7xiH0&dib_tag=se&keywords=amazon+5&qid=1714525963&s=amazon-devices&sprefix=amazon5,amazon-devices,232&sr=1-1&linkCode=sl1&tag=riicon09-22&linkId=10c6cb14c0434347d18126fab065228a&language=ja_JP&ref_=as_li_ss_tl