Misskeyに定期投稿するbotをAWS LabmdaとEventBridgeで作る

# はじめに
サクッと作れます。
「イベント開催時までのカウントダウンをしてMisskeyを盛り上げたい」などにお役立てください。

## 技術
Python
AWS lambda
AWS EventBridge
## 作業手順

1. misskeyでAPIキーを取得する
1. Lambdaにアップロードするファイルを作る
1. Lambdaの実行環境を整える
1. EventBridgeで定期実行設定
1. Lambdaにファイルをアップロードして動作確認
---

# 制作
## 1. misskeyでAPIキーを取得

1. 設定 > API >アクセストークンの発行を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/6280c2db-292b-7e68-f3c9-fc3ce45f2fe2.png)

2. 全部許可しちゃう(適宜必要なものを許可すれば良い)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/7195bb38-478c-9e43-c6c7-274352311e5a.png)

3. 確認コードが表示されるのでコピーしておく

## 2. Lambdaにアップロードするファイルを作る

1. ローカル環境の作業用フォルダに移動
`$ cd path/to/work`

2. Misskeyは`pip`で作業用フォルダにインストールする
`$ pip3 install Misskey.py -t .`

3. 投稿したい内容をコーディング

    ```python:2024年1月20日までのカウントダウン
    from datetime import datetime
    from misskey import Misskey
    import os
    
    def lambda_handler(event, context):
      # インスタンス(サーバー)とアクセストークンを環境変数から取得
      mk = Misskey(os.environ['MISSKEY_INSTANCE'])
      mk.token = os.environ['MISSKEY_TOKEN']
      today = datetime.now()
    
      # 指定された日付+1を入力
      target_date = datetime(2024, 1, 21)
    
      # 日数の差を計算
      delta = target_date - today
    
      # 日数の差を返す
      mk.notes_create(text="2024年1月20日まであと" + str(delta.days) + " 日")
    ```
4. Zipで圧縮
`$ zip -r upload.zip *`


## 3. Lambdaの実行環境を整える
1. AWSにログインし、画面の上にある 🔍 を押下し`Lambda`を入力後出てきた項目を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/e4eb31cb-50fa-b104-d473-4b86da77cfa8.png)

2. オレンジ色の`関数の作成`を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/f33b4db6-6146-5b2a-b3df-894e147781ed.png)

3. 任意の関数名を入力し、今回は`Python`を使うので選択  
`関数の作成`を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/30e207a2-faee-26c9-7cba-9b5d5b30fdeb.png)

4. インスタンス(サーバー)とアクセストークンを設定
　設定 > 環境変数 > 編集を押下
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/3c265374-deea-ab43-7293-f03497343a0b.png)
  キーを設定して、保存を押下
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/0a0185be-36cb-49d5-c5ee-a71d8716a411.png)

5. `+ トリガーを追加`を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/eacceaed-e89a-b171-a4ff-086f78de90a8.png)

6. EventBridgeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/96e7ae64-a725-ec73-37eb-73bc205c0e2f.png)

## 4. EventBridgeで定期実行設定
上でEventBridgeを選択すると、設定画面が表示されます。
1. 今回は毎日午前7時に動かしたいので`cron(0 7 * * ? *)`と記載しました。よくわからない方はお近くのAIに聞いてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/c3fc8020-a3e9-e4d9-403a-253f04ff40a9.png)

    [公式ドキュメント](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html)にも記載がある通り、AWSのCronは以下のルールがあります。
    >cron式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値(または *)を指定する場合、もう一方のフィールドで ?(疑問符) を使用する必要があります。



## 5. Lambdaにファイルをアップロードして動作確認
1. 右側の アップロード元 > .zipファイルを押下して、先ほど圧縮したZIPファイルをアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/5981277d-2d38-4a01-7842-9e7a0b6cf686.png)
2. 同じ画面にある青色のTestボタンを押下し、実際に投稿されていれば完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505609/81af22e6-7ac2-bd86-cf2d-8ae195bc0646.png)

## 参考記事

https://qiita.com/Toshinori_Hayashi/items/5b0a72dc64ced91717c0

https://qiita.com/Hironsan/items/0eb5578f3321c72637b4

### 今後参考になりそうな記事

https://qiita.com/CyberRex/items/e49828dba8e5867d8b26

https://dev.classmethod.jp/articles/lambda-github-actions/