【推し活】推しから寝起きとか仕事終わりにLINEが来たら嬉しくないか？？？

# きっかけ
`忘れっぽい`友達から`毎日決まった時間`に締め切りの連絡をして欲しいと言われたため iPhone のショートカットアプリを使って連絡していた．しかし，画像も送信して欲しいと言われたため，プログラミングの練習を兼ねて実装したのが1年前．そこから1年経って Qiita を始めたため思い出したように記事を書くことにした．当時は LINE Notify を使って画像を送信している人のうち動画で解説している人は[この人]((https://kino-code.com/pythonline/))だけだと記憶していて（今もいないのかな？），今回もこの人を参考にしているが，今では Qiita の記事が増えているため Python 以外で実装したい場合はそちらを参考にすると良いかも．

# 前提
- LINE を使っている（LINE Notifyは知らなくてもよい）．
- 使っている OS は `macOS Ventura 13.3` なので定時実行の部分で Windows と差異があるはず．そこは調べて欲しい．
- 言語は Python（作った当時はPythonしかできない初心者で，作りたいものを探している状態だった）
- CUIをいじる場面もあるためディレクトリやパス，Vi の知識がないと思わぬところで詰む可能性がある．
- 送信部分は[【仕事の自動化】PythonでLINEを操作。メッセージや画像を自分へ送信しよう！【初心者の方もわかりやすいように解説】](https://kino-code.com/pythonline/)というページを参考にしつつ，複数画像のランダム送信や定時実行部分を組み込んだ記事となっている．

# 今回やること
1. 送信部分
    1-1. 推しの画像を用意する
    1-2. LINE Notify の登録
    1-3. LINE Notify token の発行
    1-4. Python でソースコードをコピペ & 変更
2. 定時実行部分
    2-1. cronの有効化
    2-2. 定時実行

# 1.送信部分
## 1-1.推しの画像を用意する
メッセージを言ってほしいアイドルやキャラクターなどの画像を用意する．形式は `.jpg` か `.png`．今回のプログラムでは5枚の画像（ファイル名は適宜変更する）を用いることにした．

**推し活をしている人なら推しの画像を5枚ぐらい集めることなど余裕だろう（むしろ5枚に制限する方が難しい）．**

僕が利用している画像に関して，著作権の問題でここに載せることができないことは許してほしい．

## 1-2.Line Notify の登録
Line Notify [https://notify-bot.line.me/ja/](https://notify-bot.line.me/ja/) に登録する．Line Notify を使えば自分もしくは自分が入っているグループに LINE から入力せずとも定型文を送ることができるようになる．登録は LINE アカウントに登録したメアドとパスワードでできると思うが QR コードを使用してもできるかも．この記事を書くために1年ぶりにログインしたら QR コードでログインできるようになっていて，ユーザビリティの向上を感じた（前もそうだったっけ？）．

## 1-3.Line Notify token の発行
Line Notify に登録してログインした後，右上の自分の LINE 名をクリックし，マイページをクリックする．そのページにある`トークンを発行する`ボタンをクリックし，トークン名とメッセージを送りたい先を選ぶ．

:::note info
トークン名はメッセージとともに表示されるため，推しの名前などを用いるのが良い．
:::

前述の通り，僕の目的は友達1人が定時に写真を受け取ることだったので，自分だけがメッセージを受け取る「1:1でLINE Notifyから通知を受け取る」ではなく，友達と自分だけが所属するグループを指定した．


:::note info
自分を除いて友達だけに送ることは不可能なので（もし可能だとしたら超迷惑，いちいちブロックするしかない），この時点で友達と自分だけが所属するグループを新たに作成し，僕はそのグループをミュートにすることにした．
:::

`発行する`をクリックして，トークンをコピーする．もし忘れたら新たに発行し直そう．

## 1-4.Python でソースコードをコピペ & 変更
[参考にしたページ](https://kino-code.com/pythonline/)では Jupyter Lab を利用しているが，僕の場合は Google Colaboratory でテストした後に，以下のソースコードをもとにしたファイルを作成した．ソースコードの意味を知りたい方は参考文献を参照してほしい．

HTTP 通信をするため requests ライブラリをローカル環境にインストールする必要がある．requests ライブラリをインストールしたら以下のソースコードをコピペ & 変更する．

（2023年6月追記）
requests ライブラリでエラーが出て詰まっている方へ新たな記事を執筆中．

```python
import requests

TOKEN = 'さっき発行したトークン'
api_url = 'https://notify-api.line.me/api/notify'
send_contents = '毎日早起きしてすごい！'  # 画像だけでは送信できない．メッセージ必須．

TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN} 
send_dic = {'message': send_contents}

# LINE通知を送る（200: 成功時、400: リクエストが不正、401: アクセストークンが無効：公式より）
# 5枚のうち，どの画像にするかを疑似乱数で決める
choice = random.randint(1,5)
image_file_dict = {1:'test1.jpg',2:'test2.jpg',3:'test3.jpg',4:'test4.jpg',5:'test5.jpg'}
# 画像ファイルのパスを指定
image_file = image_file_dict[choice]
# バイナリデータで読み込む
binary = open(image_file, mode='rb')
# 指定の辞書型にする
image_dic = {'imageFile': binary}
# LINEに画像とメッセージを送る
requests.post(api_url, headers=TOKEN_dic, data=send_dic, files=image_dic)
```

変更する場所は以下の3点
- TOKEN：発行してコピーしたトークンをペースト
- send_contents：受け取りたいメッセージを書く， ex）今日もお仕事頑張ってえらいね！など
- image_file_dict：各画像ファイルの名前に適宜変更する，僕の場合はテスト時からの名残で上記のように

これを test.py とでもして保存したら送信部分は終了．念のため Google Colaboratory で受信のテストをした方が良い（画像を配置するのを忘れずに）．もし動かないなら[参考にしたページ](https://kino-code.com/pythonline/)を元にコードの各部分を分けて個別に試して解決しよう！

# 2.定時実行部分
:::note warn
画面が点いている，~~もしくは電源につながっている~~ラップトップでしか動作確認をしていません．電源に繋がずに画面を閉じている時はプログラムが動きません．サーバで動かせば常に動くはずです……．

（2023年6月追記）
電源に繋いでいても動作しないことがあることを確認（起動させたい時間の10分前に画面を閉じた場合は動くため画面スリープなどの設定の問題かも？）
:::

## 2-1.cronの有効化
スクリプトの定時実行のやり方に関しては当時なにも知らなかったが，macOS や Linux では`cron`というデーモンプロセスが用意されていて定期的な処理を行ってくれるらしい．mac では他に Automator という標準アプリがあって，実はそっちの方が分かりやすそうなんだけど，当時の僕は cron を選んだ模様．Windows ではタスクスケジューラというソフトが担うらしい．

:::note warn
Mac では非推奨の crontab というコマンドを使う．またシステム設定アプリで`プライバシーとセキュリティ > フルディスクアクセス`と進んでいき，cron の項目をオンにする．
:::

## 2-2.定時実行
cron をオンにしたら terminal を開いて`crontab -e`と入力し，Enter を押すと Vi で入力できる画面がでてくる．初めての場合なにか表示が出てくるかもしれないが気にしない．ここに書くものは例えば毎日6時に test.py というファイルを python3 コマンドで実行したい場合は次のように書く．
```
0 6 * * * python3 /Users/.../test.py
```
このファイルの書き方については[「Macでスクリプトを自動実行する【cronとAutomator】」](https://selfs-ryo.com/detail/automatic_execution_on_mac)を参考にしてほしい．ファイルを保存する際ポップアップが出てくるが OK をクリックする．

ここまでやっても cron が動かない気がする．それはきっと用いている Python へのパスが通っていないからで，この記事を読んだ初心者が詰まるとしたらここだと思う．その時は[「cronの使い方とパスの注意点」](https://haitech-blog.com/cron-path/)や[「crontabの書き方や確認、仕組みや落とし穴を理解する」](https://blog.mothule.com/tools/how-to-use-cron)を読んで頑張って欲しい．これらを読んでも分からないかもしれないが，「1-4. Python でソースコードをコピペ & 変更」において Google Colaboratory でのテストに成功したのならプログラムは完成しているし，終わりは見えている！ぜひ Automator を使ってみたり，cron について検索してみたりして粘ってほしい．

# ディレクトリ構成
```
Users /
├─hoge1 /
    ├─test1.jpg
    ├─test2.jpg
    ├─test3.jpg
    ├─test4.jpg
    ├─test5.jpg
    ├─hoge2 /
        ├─hoge3 /
            ├─test.py
```
~~Users/hoge1/hoge2/hoge3/ に画像を配置してもエラーで動かず，上位のディレクトリに配置するとうまくいくところが分かっていないが公開することで誰かの参考になれば幸いだ．~~

この疑問を解決できたため新たに[記事](https://qiita.com/NAT/items/56cded8bedf6f148b7b4)にしました！
@tenmyoさん，ありがとうございます！

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [【仕事の自動化】PythonでLINEを操作。メッセージや画像を自分へ送信しよう！【初心者の方もわかりやすいように解説】](https://kino-code.com/pythonline/)
- 困った時は「公式ドキュメント」[LINE Notify API Document](https://notify-bot.line.me/doc/ja/)
- [Macでスクリプトを自動実行する【cronとAutomator】](https://selfs-ryo.com/detail/automatic_execution_on_mac)
- [cronの使い方とパスの注意点](https://haitech-blog.com/cron-path/)
- [crontabの書き方や確認、仕組みや落とし穴を理解する](https://blog.mothule.com/tools/how-to-use-cron)