任意の為替レートをteamsに通知するアプリの開発(楽天証券)

## 目的
積立NISAの話をしていたら、母から「為替やってみたら？」と言われたので、任意の為替レートより下回ったり上回った場合にteamsに通知をするようなアプリを作成する事にした


## 完成形


1ドル価格が157.1円を下回った場合に通知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/f1b11e4e-a664-fdd2-c77e-4544d852e091.png)

1ドル価格が154.9円を上回った場合に通知
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/ff082e86-f537-6562-89d8-d36742ae5916.png)


### 設定ファイルの書き方
下のファイルの様に、プログラムを指定し、第1引数に価格を指定する。第2引数にdownかupを指定する事によってその価格より下回ったか上回った時に通知をするか指定する。

以下の場合だと
- 1ドル価格が154.9ドルを上回った場合
or
- 1ドル価格が156.93ドルを下回った場合

の時に通知される様になる。通知する条件はいくらでも増やす事が可能である。

```bash
#!/bin/bash

source /home/shoma/money/bin/activate

process1(){
    /home/shoma/money/mon2.py 154.9 up
}

process2(){
    /home/shoma/money/mon2.py 156.93 down
}

# 各プロセスをバックグラウンドで起動する
process1 &
pid1=$!
process2 &
pid2=$!

# 各プロセスの終了を待つ
wait $pid1
wait $pid2

echo "全てのプロセスが完了しました。"
```


## 作り方
- mon.py (通知プログラム本体)
- money.sh (通知プログラム呼び出しスクリプト)
- mon.service (通知プログラム呼び出しスクリプト管理用ファイル)


## mon.py

```mon.pyimport requests

def download_file(url, local_filename):
    # URLからファイルをダウンロード
    with requests.get(url) as response:
        response.raise_for_status()  # エラーチェック
        with open(local_filename, 'wb') as file:
            file.write(response.content)

def extract_fields_from_third_line(file_path):
    # ファイルから3行目を取り出し、13フィールド目と14フィールド目を抽出
    with open(file_path, 'r', encoding='utf-8') as file:
        lines = file.readlines()
        if len(lines) >= 3:
            third_line = lines[2]
            fields = third_line.split()  # スペースでフィールドを分割
            if len(fields) >= 14:
                return fields[12], fields[13]  # インデックスは0から始まるため12                                                                                                             と13を使用
            else:
                return "3行目に14フィールドが存在しません。", None
        else:
            return "ファイルには3行目が存在しません。", None

# ファイルのURLと保存先のパスを指定
url = "https://www.rakuten-sec.co.jp/web/fx/RateData/RateData.dat"
local_filename = 'RateData.dat'

# ファイルをダウンロード
download_file(url, local_filename)

# 3行目から13フィールド目と14フィールド目を抽出して表示
field13, field14 = extract_fields_from_third_line(local_filename)
print(f"売値: {field13}")
print(f"買値: {field14}")
```

## money.sh
以下の様にシェルから呼び出す事によって、複数条件で通知をする事が出来る様になる。

```bash
#!/bin/bash

source /home/shoma/money/bin/activate

process1(){
    /home/shoma/money/mon2.py 154.9 up
}

process2(){
    /home/shoma/money/mon2.py 156.93 down
}

# 各プロセスをバックグラウンドで起動する
process1 &
pid1=$!
process2 &
pid2=$!

# 各プロセスの終了を待つ
wait $pid1
wait $pid2

echo "全てのプロセスが完了しました。"
```


## mon.service
pythonのプログラムをシェルスクリプトから呼び出し、systemdで管理する事にする。
ubuntuの場合、ファイルは`/etc/systemd/system`配下に配置する。

```mon.service
[Unit]
Description = 為替レート通知用プログラム管理

[Service]
Type=simple
User=root
Group=root
TimeoutStartSec=0
Restart=on-failure
RestartSec=30s

ExecStart   = /home/shoma/money/money.sh

[Install]
WantedBy    = multi-user.target
```

## プログラム起動

```bash
systemctl daemon-reload
systemctl start mon
```

## ステータス確認
```bash
systemctl status mon
```

起動確認
```bash
● mon.service - 為替レート通知用プログラム管理
     Loaded: loaded (/etc/systemd/system/mon.service; disabled; preset: enabled)
     Active: active (running) since Tue 2024-05-28 19:07:40 JST; 1s ago
   Main PID: 75309 (money.sh)
      Tasks: 11 (limit: 3910)
        CPU: 2.386s
     CGroup: /system.slice/mon.service
             tq75309 /bin/bash /home/shoma/money/money.sh
             tq75310 /bin/bash /home/shoma/money/money.sh
             tq75311 /bin/bash /home/shoma/money/money.sh
             tq75312 python /home/shoma/money/mon2.py 156.93 down
             mq75313 python /home/shoma/money/mon2.py 154.9 up

May 28 19:07:40 raspberrypi systemd[1]: Started mon.service - 為替レート通知用プログラム管理.
```

### マシン起動時にプログラムを自動起動する
以下の様にする事でマシン起動時に自動的にプログラムを起動する事が出来る。
```bash
systemctl enable mon
```



## 終わりに
デイトレーダーは、変わりゆく価格を常に追いたいと思います。既存のアプリを設定するのはめんどうだったので、自分で作ってみました。しばらく使ってみたいと思います。
反響が大きければ、teamsとpythonの接続等、もう少し詳細を書いて行きます。