0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-05-28

目的

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

完成形

1ドル価格が157.1円を下回った場合に通知
image.png

1ドル価格が154.9円を上回った場合に通知
image.png

設定ファイルの書き方

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

以下の場合だと

  • 1ドル価格が154.9ドルを上回った場合
    or
  • 1ドル価格が156.93ドルを下回った場合

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

#!/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

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

#!/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

プログラム起動

systemctl daemon-reload
systemctl start mon

ステータス確認

systemctl status mon

起動確認

● 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 - 為替レート通知用プログラム管理.

マシン起動時にプログラムを自動起動する

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

systemctl enable mon

終わりに

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?