【備忘】LambdaからDiscordへのbot配信【LINE Notify 代替】

# 目的
LINE Notifyが終了するので、今までLINEに通知していたbot配信をすべてDiscord配信に切り替える
(EventBridge→Lambda→DiscordのLambda→Discord部分の備忘)

# 手順
## Discrod Botの設定
サイトにアクセス(Discordへのログインが必要)
https://discord.com/developers/applications
右上のNew Applicationをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/d22b3c22-46ea-4e28-af77-b11170ea6e6c.png)


任意のアプリケーション名を入力し、チェックを入れCreate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/ebd44902-61e8-4842-929f-507d8209455e.png)



設定画面に遷移するので、名前やアイコンなどの設定をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/ef7aaa7e-34c1-4eb8-9f56-d5038cd8e442.png)


左メニューからBotをクリックし以下を有効にする
・Presence Intent
・Server Members Intent
・Message Content Intent
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/a04333a2-456f-4c1c-97e5-0ace18e0af7c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/cac52771-ea4f-4b89-8a7c-4a07d5491e8d.png)



左メニューからOauth2をクリックしてScopes>bot,Bot Permissions>Administratorにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/2f5f79da-75bc-4a46-94bd-f5e391bb1eb7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/7fe23274-6283-421f-9a87-14e39f1694b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/2b7fd496-1b46-4763-a852-9defdc93c0e5.png)




Integration TypeをGuild installにし、Generated URLをコピーしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/cb0ea033-e859-40a9-aed0-ac1a0eb3166b.png)


botを参加させたいサーバーにGenerated URLを貼り付けて開くと、アクセス認証画面へ遷移するので参加させたいサーバーを選択肢認証する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/048ac490-684a-46d7-ba96-1a8641f20843.png)


成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/588a9ddc-3b7f-4163-b0b4-f39959cc8959.png)


Discordのサーバーを見るとオフラインにbotが追加されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/dfbdf354-0959-4814-a308-69cf46ec8874.png)



左メニューからBotをクリックし、TOKENのReset TokenをクリックするとTOKENが発行される
漏洩した場合などもここからリセットする
TOKENは後で利用するので控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/e0fdee6d-e804-483c-a91a-e8831087e232.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/96af8bd2-a6dd-4dcb-953d-a52bc1150856.png)


Discordの開発者モードをONにして、通知先のチャンネルIDをコピーして控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/0ca8911e-69e6-4244-9c00-5cd74d11960e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/4c54499b-81cd-4347-a4be-e2e4acfa56e7.png)




## Lambdaの設定
例として、自分のサイト(https://tritake.net/) をスクレイピングし、動画のURLを取得してその中からランダムなものをDiscrodに通知する

### レイヤー作成
ローカルで以下コマンドを実行し、zipコマンドなどでpython.zipにする
参考：https://twinkangaroos.com/how-to-use-aws-lambda-for-periodic-scraping-3.html
```
mkdir python
pip3 install requests -t ./python/
pip3 install beautifulsoup4 -t ./python/
```


Lambda>レイヤー>レイヤーの作成からzipを用いてレイヤーを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/77779052-65e0-4ebd-ba2a-20ece7da5a3c.png)




### 関数の作成とレイヤー追加
Lambda関数を作成する
今回はPython3.12

【コードソース】
```
import os
import requests
from bs4 import BeautifulSoup
import random

# Discord設定を環境変数から取得
TOKEN = os.environ['DISCORD_BOT_TOKEN']
CHANNEL_ID = os.environ['DISCORD_CHANNEL_ID']

def lambda_handler(event, context):
    # tritake.netのページをスクレイピング
    tritake_url = "https://tritake.net/"
    response = requests.get(tritake_url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # MANGA MUSIC VIDEOの取得
    mmv_section = soup.find('section', id='MMV')
    
    # すべての動画リンクを取得
    video_links = mmv_section.find_all('a', href=True)
    
    if video_links:
        # ランダムに1つの動画を選択
        random_video = random.choice(video_links)
        video_url = random_video['href']
    else:
        video_url = "動画が見つかりませんでした。"


    # Discord APIのエンドポイント
    discord_url = f"https://discord.com/api/channels/{CHANNEL_ID}/messages"
    
    # ヘッダー
    headers = {
        "Authorization": f"Bot {TOKEN}",
        "Content-Type": "application/json"
    }

    # 送信内容
    payload = {
        "content": f"MANGA MUSIC VIDEOから選ばれた動画:\n{video_url}"
    }

    # POSTリクエストを送信
    r = requests.post(discord_url, json=payload, headers=headers)
    data = r.json()

    # ログに結果を出す
    print(data)

    return {
        'statusCode': 200,
        'body': 'メッセージ送信成功'
    }


```

環境変数にDISCORD_BOT_TOKEN(TOKEN)とDISCORD_CHANNEL_ID(通知先のチャンネルID)を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/849bf410-ba96-4ed5-a9e4-299d12e1c56a.png)


レイヤーを追加したい関数>レイヤーを追加から作成したレイヤーを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/950d736e-7e12-49a9-8c8a-f55076cfdb19.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/49816fa5-9a25-42d5-bed9-33e8820a5e0d.png)


テストから実行してみる
成功し、Discordに配信されていることが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/57d0cc4e-fd4d-44d7-bcb2-74901af9c77f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574230/11bbaae3-dfda-4de2-9e22-57e3dca9906b.png)


# おわりに
EventBridgeと組み合わせて定期スクレイピング実行や、AWS使用料通知に利用している