GOXアドレス監視BOT

タイトルの通りです。まぁ、GOXのだけではなく登録したアドレスを監視します。動きがあった場合はLINEに通知。どう動いたかとかは自由に改造してください。あとおかしな点があったので最後に変更点を追記しました。比較CSV(check_GOX_address.csv)の仕様も変更になっているので一旦消してください。あと、5/14にアドレスに動きがあり、きちんと通知しました。一安心。


あまりにも説明が適当だったので追記します。
このプログラムはブロックチェーンエクスプローラーのAPIを使用して監視対象CSV(GOX_address.csv)に記述されているアドレスを監視します。起動直後に監視対象CSVアドレスからそのアドレスが現在保持している残高、送信した額、受信した額を取得して別の比較CSV(check_GOX_address.csv)を作成し、残高を比較して指定する時間ごとにチェックします。現状は60秒毎にチェックするようにしています。監視対象CSV(GOX_address.csv)には監視したいアドレスを記入します。タイトルにGOXとか書いてありますが、別に監視したい大口さんや取引所のColdWalletでも構いません。
監視対象のアドレスに変更があった場合、LINEに飛ばします。(肝心のアドレスが通知に入ってなかったので入れました)
LINEに飛ばした後、最後まで比較し終わった後に比較CSVを更新します。
比較しているアドレスをログに出すようにしてます。いらなかったら消してください。あとログは夜中にローテーションします。10個までローテーションして11個になったら初めのログを消します(多分)
以上、一通りの説明でした。

#!/usr/bin/python3
# coding: utf-8

import requests
import csv
import json
import time
import logging
import logging.handlers
import pandas as pd
import numpy as np

def addressList_to_csv():
    # 監視したいアドレス一覧CSVを用意してそれを読み込み、口座一覧を取得して別のCSVに書き込む
    # 口座一覧用リスト
    sumarryadd_list = []
    # 監視アドレス一覧を読み込む
    with open('./GOX_address.csv', 'r') as af_list:
        ard = csv.DictReader(af_list)
        # アドレス一覧から取得したアドレスを使って口座の残高その他を取得
        for atc_row in ard:
            atc_r = requests.get('https://blockexplorer.com/api/addr/' + str(atc_row['address']))
            atc_data = atc_r.json()
            # 残高が0以外のアドレスをリストに登録(アドレス、残高)
            if atc_data['balance'] != 0:
                atc_add_list = {"addrStr": atc_data['addrStr'], "balance": atc_data['balance']}
                sumarryadd_list.append(atc_add_list)
        # あまり早くまわすとエラーがでるので休憩
        time.sleep(0.6)
    # リストをpandasのデータフレームに格納
    d_list = pd.DataFrame(sumarryadd_list)
    # CSVに口座一覧を書き込み(indexはなし)
    d_list.to_csv('./check_GOX_address.csv', header=True, index=False)
    logger.info("=========== Make AddressList ===========")

if __name__ == '__main__':
    # 自分のLINEトークンを入れる
    line_notify_token = ''
    line_notify_url = 'https://notify-api.line.me/api/notify'

    # logging設定
    # ログの出力名を設定
    logger = logging.getLogger('GOXLog')
    # ログレベルの設定
    logger.setLevel(10)
    # ログの出力形式の設定
    formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
    # ログの出力ローテーションハンドル
    trh = logging.handlers.TimedRotatingFileHandler(filename='./GOX.log', when='midnight', backupCount=10)
    trh.setLevel(10)
    trh.setFormatter(formatter)
    logger.addHandler(trh)
    # ログのコンソール出力設定
    sh = logging.StreamHandler()
    logger.addHandler(sh)
    sh.setFormatter(formatter)
    # アドレス更新監視フラグ
    flg_change = False
    logger.info("=========== Monitoring ===========")
    while True:
        try:
            # flg_changeがTrueの場合、監視を続ける
            if flg_change:
                # CSVの監視対象口座一覧を取得
                with open('./check_GOX_address.csv', 'r') as f_list:
                    rd = csv.DictReader(f_list)
                    for row in rd:
                        r = requests.get('https://blockexplorer.com/api/addr/' + str(row['addrStr']))
                        data = r.json()
                        logger.info("=========== Chack Address ===========:" + str(row['addrStr']))
                        # 監視対象の口座に動きがあった場合、LINEに飛ばす
                        if float(data['balance']) != float(row['balance']):
                            # 以前の残高と今回取得した値を比較して入金されたか出金されたかを判別する
                            t_value = (float(row['balance'])-float(data['balance']))
                            # 入金変数初期化
                            r_value = 0
                            # 出金変数初期化
                            s_value = 0
                            # 以前の残高から今回の残高を引いた値が0より大きい場合
                            if t_value > 0:
                                # そのまま送金変数へ
                                s_value = t_value
                            # 以前の残高から今回の残高を引いた値が0より小さい場合
                            else:
                                # 値がマイナスになってるのでプラスにして入金変数へ
                                r_value = -t_value
                            # LINEのメッセージを作成して飛ばす
                            message = ("Caution!!!!!\n" +
                                       "Address is :" + str(row['addrStr']) + "\n" +
                                       "Before is :" + str(row['balance']) + "\n" +
                                       "After is :" + str(data['balance']) + "\n" +
                                       "Received " + str(r_value) + "BTC" + "\n" +
                                       "Sent " + str(s_value) + "BTC")
                            payload = {'message': message}
                            headers = {'Authorization': 'Bearer ' + line_notify_token}
                            line_notify = requests.post(line_notify_url, data=payload, headers=headers)
                            # ログ出力
                            logger.info("Caution!!!!!\n" +
                                        "Address is :" + str(row['addrStr']) + "\n" +
                                        "Before is :" + str(row['balance']) + "\n" +
                                        "After is :" + str(data['balance']) + "\n" +
                                        "Received " + str(r_value) + "BTC" + "\n" +
                                        "Send " + str(s_value) + "BTC")
                            # アドレスが更新されているので次回のループではリストを更新する
                            flg_change = False
                    # あまり早く回すとエラーが出るので休憩
                    time.sleep(0.6)
            # flg_changeがFalseの場合、監視リストを取り直してflg_changeをTrueに戻す
            else:
                addressList_to_csv()
                flg_change = True
            time.sleep(60)
        except Exception as x:
            logger.info(x)
            time.sleep(5)

一応、GOX関連のアドレスも置いておきます。いらないのは消して、必要なのだけ監視してください。

address
1LLwo23YfX5Tfz7B9XUp8e9tP6qKhXa9ij
16Tq1FrWMxNQtWGGXyxYNzH9CMGDw6TjiF
12pa7SGMDtRtDUaZ6aUoTGiHJZKyngTjyL
19cBWV2ctKCS83KodhocGZx8deCdU6iHwa
16FuTEtt4rMEiaVHTDnnh6xDdJ1JY4qwDk
1PRmNhgidzGqCnkEaa2qf9qAyBPnnnk71k
13qQPQW5rpDe7Y2SEZK1LdpLWJzxX9NPAT
1JnZ1VKhZJTaEgz8FdUXVhHhvFydsL52CL
1KvuZPrEVsoko7cvz4gufiZnKeDZRqWtgb
1AsQogoKaJBWox8dVNVSUAEKjpnvcZSJuz
19oCuYc2qTj8ioCxSRAhrsQSALa9RhcHHh
13QpiaP6BG4yZZjS2Av7m53BSR7hWWhwoz
1HdVFS7fEhuxqPjALaoJxC6P8ryScYKMLS
14CXHJCeAkaPY4ikx6PnJYbhedrE9vxPiG
1BYkS7eEpaEatDfFTMkUgi8Avkczp5weoh
1DZMUX7WcGPmcRh8WbHTXS8XuFKoFMrR75
16xfP6XtmV7spDUaA7E5hXszd5DXZg58gm
16wHPGxoHY4j84TniZiGboQA8Bj745Q72g
1ExkV4rqf6rmTcnaRDb4CwkT75L8ihSa2
14GityfFbWGQTRcXvNAtctA3xkWa8d21xZ
15THRRAk4QrqhGHvgd4yWN5dkLicxH1F7C
1D2MRRk5kT7zCzCTFsXfHvZymty3SvaiEA
1LpisrbZHJAr89eoL6ZCeP3jRCxUbizz5a
18H4CsirZuKKmK7YTumN9A43jQyQhr1frm
1BCLtTJhFTVjhsE88m77HPeqpR7xudgs2r
17tpL2ZU8bePtuq3aK3VYxm5dRDpkvMFVc
15odTfunb2Sn4jAvHk4sgW6iKJTHjk9x8A
1wKLozrCCiQX9LAtjghy9Aj9b164oqsPX
1CpoyWoPcFzaMLRu7WmvegaiQFEpyDV9m7
19S8hcbFRqyRSMFnzodhjHcTrnfnYnuNgu
1AGotm2Z14mNn69SqepvkbtHENsrbM7aXo
1Dx8BNX8R2JELjFytwG1LQYc1DqPdB9pD4
1BabhY83EVpKak24G82kMLPKWFrjszefT4
15Cb1ABAG5eEtfFCibJrNokStgSrccnkFB
1HhQa5jetGgDhA7tBVjaaC97JADwBx79FS
1KLogjaYPqoW5zeK1YASkzF1CPf2RABPAD
1Exgak21zYUn51pHwtDGUsBnEeMsRV7vHE
1vXjjnXMsRZvHarx4JZFRf7rxm8tGqM8i
13PCfh3DPxkmukUxirwvDnJV2qiJ8Bb3D2
1Pbfe7VdJhTm3PyZwXiwtfLyFg116fM1po
1J4NhZFdBsuMLxVbYGa1qrdJ1aRgTX1NqD
1egofZrY1Nx8PLW6XjBxytGHVKtuRdfA2
13yF72mBTWyyDNHcrL5psiGbvsrgpizkGM
1B6iED861UPsbfCMTFahm5uuqwLo4s7Ymu
16pzkGcKprERsyBr2d5KKCTtTnd7c5nhh3
1PPuu4uXak2rL7VbedK6huiPtbHXApCVuG
114dSXVySv29bLc9cX6hX8xqRxwq4nUMo6
1JsrRV7XpJ7EComGxEQF6TK5tPzeiKUCSU
1H4xMgq6gud2RrEQyQVCJjnbhtLY9ZBQjZ
1Duv6NLt37YjxunBBfrz944zEKUbdtpzMG
1BzthXwUQhY46dLQq8TNukEAfDYtVmKS6z
12xNb2TaNWTHjYqT1Rgyv7am9YLGnbTVAb
1KN3VcxpGMANCuRgja4bibAvso1W2Tn2UR
1AYd2J2h5xocKVJJG3YcPfjqXLoLwQxDM
17MLL3a2RRwU6pofiaAszKYaHUhL8djrtY
1CkjB2F3SuBhUD1iRTxXdjpqaFdxbbS9fD
1GmvqRxzfKbjrshxuciuS4DDmFwh8WMLEo
1D6bW87AAJMxx2abhz86VQooye2Sc19FrS
1Bqwb8KYsBXFBmA5XiMAPNNR8YLo8sBdCB
1BbjzwUUyu3e5of3QQirktG1XcCXKcedSA
18YPwY65u8fyHYuwqqVtWY4NZCbQKsN5zw
11WhVxf1WS7oZ55qnJABVtsFQgvbL1Kkj
15GEHrRgxmGLHPqUArP9mTUwjYjidZpWXS
19PpkjaD8uNsqXr6ETmyHMqNpnrjLXCssW
1NqWDAtBewZnHPX6n2KgfhLzP5VVfWx4VN
1MGcaDAhXp9Q2zDEEjdXkL6EsZEZcRKYWX
16ZvPb21H6e8BhrWNuPyZj4RUcfygn8enj
1Mi6XtS7USxafnQ22CnszsUgd8Vya8ZK18
13LG87AzMxH4vy5fHiBKnU2hsVT8JSeCcJ
1HiBH2KSapjAsYBg15g7mRp9X22SbArnet
1EVMwbYRig9dKsiCfUkUnp7tCFsy6szj9a
196va1MHd9kmVmCtStVuXsGQvWuGpwE2Ym
1Bqj48ZvcmifgnAUYgRkTADGrmGLUZr7nv
1Cs86YafFQYYE3zXggaCrMM6aZq2C1NXdA
1Q9fXPanhH6BSCprUPZABLwmjBaDEkAPWQ
1237TZFnvH8oPe4upG3fuUVcxPh9uym4oD
1Lvao8sHCB3cxrfkowjpQBmu59dKNNVLkA
1BLEYvPQPAovxnAcU5sGdH7Fe5bcN3X4i
1MM7wg9KdqeY2RPsPd7m3c9jJYsebv4YNx
1MQRo4iL4NySkyh5676w1txoZtHGHd3vK1
16NK7eMinGcB7N8A1VDfKsM4ASr4Dbo3K8
14TstZoBGrcyuCUfD2rmCaPcWWZHk4Khj8
1CSQrc4k34wPQtS9yFCJG69hyN4mHTnULu
1DEZUAWLMcSXoJG443x1RSWLFLLDPq7q4u
1N1cCXJn8KiuL9KYkUWA9ru3oo4aSfAwYq
17eknwKbheM5F9Ji5QfjvaDMCo7tDNDces
1L9PzyD1qGh7JRMcPYG3cRNGs4ndNdRnMH
1Nu4jsD6zfL6tuSvp3FqtoUaqEMKqE21h2
1BRyiyT2JRa5FkefTkRog5RgmFWrDqfUc7
1BPdcWVAmrEDuZw1LUoNJyxPFvrWc9EK2K
1AXCskQbhuVQmYEbMmUxbUZsVS16Gi1qnK
158aTS1U1vVRke8QKbdJxE1otM4agFaAWi
1H7c79zeqiVCT57UGnu2JYd3ZJrNC6YhuS
1L5PpUtAZYyW9RSVigawUBTBHFsdp7yFAu
1GWKfdcW88EcHd2pks6owuWdEAURGofgkS
16fsSeGisREiY1i29GFrS64MdBB6s8Wi3Q
1MwMqRC66WwxLWMfTxpBrjm66HoczSgUiw
15VzaQzn46HdTre4BnTBuBPN4621ZfTJm9
1MYDefrL4C9KMBS5yn7F7CRLp3WW6CSo1h
1G9erGPeGmKZLNhZzRv7kT8F22pT1UPdnM
1F8ApgKspUmxFK1QrECzvSpARUWAXyRehA
1NkfnZ9vgxaLjyPoLeLUYnBkUHnwrt2qza
15m9NJ78qHPpzCSngfrHVjXei6DPXA76zJ
1EybDFqT26BRAnCYhTaPJyd621HiKFUWug
19nu6ejy6aBMttWwr9stKh3k29fzZkJuqR
1KxScB4118U657YseScUTQVqv3jjggBBfs
1LACgpzSMXv4XTsy9YhFrnFSoaqwXs8MUS
17mQoaEqaB4gBszLacL46XE9F59A4cfxt
1F4pmwH7ApgXeDhK1czmsgyWExgfrm9pbF
175cgHdaH2ZskV8tpw8m9zanXAHLyCf19R
1CTCCcy2133NdRMLeHDtnsfngg3kRt6ty3
1ABEucVByPNw2GKfpyESmNdxd4kiHG9Js8
17yGPQDzkc1io8MZ6N96HM9j7qEZX3Kh8w
1MbSQcinrHwqmihARK8BfybvLS795n2nqy
15vtUtooUe7vpCJBAxrBs6HAB9MYkr5WBz
15Q96WPvCbMgbPT5Bxc5yK2QsDHaYVXmrp
1KPCwZXZWg969UHqPGzDLxJru93dkEk5j9
14NYXcX6oD2BfEbm8RJcnz9RnwC5SpqVRi
1EiiKCCnFgHjEvPZdu29qqgdBm8zTvpU3U
13961brdoFyPgbsZXQ6rNNKBBwqoBHyd3o
14ciDmVkRCFGKLD8rC1Szxn5F58MSQJF6j
1LXi3x7hyt17cxncscGE887WCrC6XDNZ4P
1PdBr99gKNqcBJDFCGLf7KrqyMgasSMEom
155FsTtEFq4eGCcBxDseuwLKPbmtWbyHJR
1Q3BXwP8PnHoXzXYEw74sVSFtz4Gmco1Rm
1AZu7TQmKBAes2duNDctYwjAB9nhHczUnA
1MhHqhvTPkVq2tnv9wvrSSHyYQYFaxGxxK
1G4xQRfLny9EkAmF8iBJRKRUa4ZtNjB5gg
1Fu4YgM3Y9CxvioGPqkSzkydAC8MVaPN1D
1BHy966YVVvYyfhwCsKv7bkF9oYW7RW46v
1439q4Na8v88kPBqoyg8F4ueL9SYr8ANWj
18KDS3q6a4YV9Nn8jcyMvNoVPfcrfemeag
18rdHNbdZjt87FvvxFKrYUkkZdvjeD7mVh
1JjUrzbR3bxJQ91WEty4ajGh299CtavuQf
16zs5WXSDibnFvaEn9VNGrqJhFS4S8oo34
1K2ey1Rp5Gh1ES3Dy7UfnYwXAdxgTiYpPv
1Hm6XDmhKCHz68wDEYTapN9MEanke8iwUk
17HZjLcyaWYmDNmB3rHuxcfCY1u3BvRHYR
1EK8vW7UYaYHKiW4TZmYJKtwcZLM14VjvP
1B6kJM75iu5ty1HAHMMz6tT1HhjoGNTCa9
1ARsvb3LnVd2fDHCw3hJKhCX3eeWoc65Se
12GV6fFwTTdDoPNgcetinDHKq1ghdQS1np
1CRjKZJu8LvTutnSKq4zTJ4yiqrzMAArYW
1E42eg625VuhNoTx21dUjij8GVjDT9Fmp
16W4XcUAKPmSES9MiUCio28msSCp8rDZgs
1Pv78QPJJQatmFjFrvdqUoiaLZ4awrmzjx
17KcBp8g76Ue8pywgjta4q8Ds6wK4bEKp7
1MHouZkgzbBpRE4tVZkVjQkJMnoNxVxSM5
19c8sUa54yQuRTVDfJa3iDkkCaFkzBJLPB
1HdKXsNQtzDcfB6PGM7DWTgX9vhBWsz1ak
1KSTeMyVrraLUJ1G77Pyj8DK7CXne9juAk
1Mjzkku248auFoMaG7fx7pojbky1w2Raqy
1MvpYtqgBH7CXbTutrSVCTNHPzm9vakuRy
1QEnhqGjgF18gUn7qKvbNtuKpc2sbieSwd
18M1Z337NqLtK9V69bssnQUYsvb7hmfSFS
1NA3Tj4b1jtx9eGELe31Jw4DrzTqKP3ayH
1LhgitFyK6VA2XoAjcvkFN3zFtMSepGEpR
1BXyJc6BVuTFnHQCcjiWX2xmCPNVfaSZeb
1BJKnUDdj7fxtJEF7FHmByFTJaD8hyrDET
1BzK87zuqidZn489Wb2oLSktrjKrX7TLKe
1B3yYPZjxffWp2zvb9Dc9kWKr5RsU9Xog6
17pJMqT2XJkmtJXLfvb2HjNxv16vfmm5BX
14p4w3TRCd6NMRSnzTmgdvQhNnbrAmzXmy
1J2qKzZjT49VJVo5iSWxdvfujGmhaJYTmL
1KFDUSZuapMv7YaDmL6cyrHTQhma1MtFYs
17LMx6ekVtV2guHxBhZUbLPqEUUgsU9E8r
1K7UyiWmNes6TzwU5tsBVz8uedz7s9iBwT
1DedUxzgwErg4ipNi988wPgLk5thwciKcc
1Pq7hooZbEAz5y3QMnqFY8C5xqTdrjUwcA
12PeTJfKs1dHRVxspDXJQox1PRBWXoYYwq
1PSTeLiacS5npPWD8HFLkxZmGGhhejy2Xe
1FhRuUkk8Bfx8FJDemtxhKAR4F8GCNKrXG
1Drshi4RAuvxk4T6Bkq959ZvLbvy7b1wvD
1EibQ8NVDuobDxU53YCkXAmsZ8PG7bdZLD
1GNbviGhWRhaU88FvGSASwro5JzFmKD3Cu
13xGCc4TPSYY9GYxBGVNox82KxyjkFnxMX
15FX3VjA58Rhfb42JPnpqX3Wi2T3gXCUH4
1Hb8DmmvvtTYv5RBLuGtDxznkZwVpd5Vjy
13ahgw8sM95EDbugT3tdb8TYoMU46Uw7PX
17Tf4bVQaCzwWrDWGRPC97RLCHnU4LY8Qr
1B9CJFPZixh5PsQCivV2Zn2c6ckaHUAQod
13sXfpp2V16nnxYvW9FHHoBdMa3k98uJw8
1FWEKKzX7nRvpvZvmXNZ61sBc8VD4qkbbG
16akNmaasTnBVFNVDztT7UyGnPeTvdm3Xa
1JztCg7eKSkb1vi7NzGJynXpLZmoaFtYud
17cJ8umSWxm1ahkVPisTBRoZdjjukkVEes
13dXFMyG22EsUsvaWhCqUo7SXuX7rBPog6
1PushZoMCZaA1AiJXsvJr28cpbsPJTvp8V
1H7HkSot7TR96dB3SVqwaJja3UMC6XErwV
13Wv5hGhubAWgSPWtXYh6s1s7HX2N1psYg
14mP6caC5dFhHdVAPCjPKM8Nm36MBDR5pM
15d5PS3gvvUwWaWveUJhwoLCVsYCUMDHY6
14BdHydbTwH73SHTH3BFDmPWugscDwCL23
18YDgRhxsomuBZ1g9d8Y1JuRmxDhF8Bvff
1BAVodGwNr3q4MYmDTrC9bfhp1JeCFRN8W
1GyDutntMuYyA2vQGW5HFcKLfx4cbDdbJq
1N5X4kcZ56uRh24XrZoztS9Vb8G7j1Joop
1DrAa9UrG5YxNemBmxtHVSQsjGs3phjP2X
1JtgU6Uo1RAt5eiMf34EehyatUezBQP36C
15gEaRmGzq2xhMN64kpmfSbuuaoFNuiXbL
1BBPdQPCVBqenepTmvJY62L3LXL1gHdVDS
16jZZkMYqjUWUtQ9DfDvHdH5ko5BcnH9XQ
1GeBwquNj8K2ns2S62mdMnszEDTwBoxMoU
1HuPVqz2xvf1rdNFUqd62vRTyxP3jeX9Ch
12KkeeRkiNS13GMbg7zos9KRn9ggvZtZgx
1466YaUJJDRZdGAq3jRERLhgxQQjZvyrjN
1H4K3dGfNbAN4AUfyUrpkGpjrd83sntDpV
16zmFgT5uYoPQVajJZikEsFGu8RFqHrejB
1HzEPuenagLEWj68igDXBBXrzc293RuR5V
1Mh9Vkd2bHTck4TxTTRmx8gZvRivgNgpnx
12T4oSNd4t9ty9fodgNd47TWhK35pAxDYN
1ESrftUmq8fx9PT5R6bGHBjtMcJ8YrzHkk
195HvmjXgoF3M5vFaBC8swZPhwrE7VhxRD
1PEW2rjh7QHDkxD6c6E2vFa3AcmpZE6jqH
1Mm9brripN4RPTzkGnRrbt5uDWdqbfk2iX
17eSypJ7npFMEtwggr3MRdr4BR4EPmzRwU
1LzwbLgdKd4eFLkpRdeajkH1YJkVCip2zj
1MPJJzRaT8vLhowNB4dVyWRxxu79dq7WkB
1MfQDtHm9Zn4X3F5XAKzvc1edRq1oo6gQU
17SYksbjakzro9m93qBCvCfFRGcLByrBnq
19eihBKk6e5YD2QXAe4SVUsxRLLnTDKsfv
12MsHWzgXS4ViUrZ8psqG5ddemX4orv9Bj
1CZsoJfkknbnW5fKrt1oR7N1ALE5WmDGP1
1zMWRnC8AFrNqPgaGhGWAkFVNZA5Teu5Q
1GdWqB8GgiA27xvc4PUKQwuxjL5JX7RhWV
1GkZQcDy8V6pmHFZqUBUBCnN9dc2hoWasD
14USZ558Rr28AZwdJQyciSQkN4JT1cEoj2
1BMXodRtQmjtfbGBYHyMpwfpunnSd4qFPN
16JDKa7Zy4pTnUZad6tzqdM1WqAh9aXxeF
15SeCwVCFx5cWyrcdD1Zp1D1zxjH2SELPg
16ETbiBBu2QmPVJ9Waui6a7m6cPmJMe2tx
15U4VsmWG1cdXAtizvQsW4r7iMxzp64Tgu
1CPA2L16PpzNwPYGr6dN2Zgm2odVxNRgeF
1BDZBTb4KE5oq6wAgA6EvAe3uCFRrAbPao
13fVDs4cDvpkWA7AKvLJXr5aWdxg3apPgC
1LueUjEuBgc7cQhsWT8zAfTjcWmrNBZXaR
1Msgw3RguBZJG7QC1r7VWQX31u7kSE9CiN
1FrV9hv1AW34BGJvobJatyzUWYDWB9epRW
18w4vRRc8Qt7FsBWQMkUjMh12RCD5bpo5r
156HpsWfgkWYLT63uhTAGUSUF3ZMnB9WWj
1LVchLzd5deqBnjkMLdN6vkyLNxUfsxyJT
1HX4s3JeFU3x1eQgPNQVAdx6FoCtbb1hr8
1JgGbKeozTfTeafdKKJeqQXY3YhQoCczm
19KiFrafXEyJCUDYFEv3B6tBUwyfFo7kNU
1PRXQEoL8vzEzoJJ9hbtAP6NaV2daccAUn
1D67pweuWFm8PrH9irbXhEsK8aFmoiKXwC
16gqpZMJxXjkErRo3t1czbaN3xPtad2xvE
1G23Uzwj55k2A9TRwaTknqGav66oDTkWCu
18ok25NTkdrUzdByFJCNVsqVYkujZ8aP45
1KmKS6NAhPi7hMMUHuNMNKCF5HPeCuevcz
1KgbxuoFpmMxgK6oFQHhR7tw2g1bXRPc1m
1JVU43LNKXqa9W5fCh8tppxDDEWgfeNg46
1QED6St8BWhLQEiNxZon2UnqGXtd524HGn
1LLc8aA9C9LLULGbYCYSFKXgxKP2DXdCqP
1Jcztvw5cZ1Eha5aX8QuzkWNzqJzh5vPLT
18hcZVFPqDNAovJmb9vA6hEJrDz6uWXNGh
1MjhSLJTxhAL1Epsn51FaMskRiguNUaXr1
1HweN9p41BY2RBunsPqyVuheEq7gVoxA9u
1Dbfe8k6JMMp7z3VJkAGAKfYWszpbuxqgr
16w6sZBDP58yyeyZAcvnxcEGJpwR9amM6g
124XJHrP4n1KqsqfTt4dj3BbVZBYoyGEvz
19Cr4zXpKw43xLJhFZW9iv4DDNtQk2TDeB
19yFD6BUwvBMmRezbcY2g9N6ryWs7FLfsX
1C5aU4Xnpd3txbxehk46UZgiuNB8QdpHCH
1JPgnExJ1rWwsH7A1tc77nQ88WjpC9Z6DR
1DjZ6QY6MxwyH9UvCnDTBjEoKyctmQ1k1p
15kNZcrhxeFZgVVLK2Yjzd69tRidbFdJEZ
1N9wNAokywNSKrewJ8cpxRqAUDu7osnV1B
1Ar6meJQCkNoC9wnPcyRNNpzX5fBDaGcKd
1MZeP3eueVUq9UFzAvaTqVh6jVpQEBVM2P
17etv2L3nhk6SCcWSNW4eoZkBy84izAm17
15QcKCa84ZCHxbsqXDoKhi5XbmQB8jPEAd
17oW81QFAbESFH8UCHf7nARG2hy5ohDFka
1MkyfwJf7uhWTmVGGQXfcT5ip31DoHMxsz
1ErpSiEhoYrBJNxAye6v45h9jZMoqaxAhK
16s6WsVJXbzGahyPX3TcQvSXvjf1dqkeL5
1JVmoJT3471FjsX5H4hAeR1RyrDgpkHbpm
1DXoGLNHog4cQBEsuHheEGZMfdN7TnFvXA
1LS5EFRRMDgMQusW6zokQUHjzNUfy6HHCQ
1LNdrKUx4RJqQg1phcDKrRMFEKQnqHKznu
199Yxz2TJGtND3QKsHTptTJivqSaUZBvku
1PxGTuJzDx1ceFHx4Z5CHaWuhiPBNovmZD
14LuAvrRzAmeikgaafs7H5695xs5dVXqA5
1LncfoCX1yzuiW3hzejarvgZ1WahnAQ4o4

変更点:
5/13 LINE通知とログ出力に肝心なアドレスが入っていなかったので追記
5/14 入金、出金の値がおかしかったので計算して追記

この記事が気に入ったらサポートをしてみませんか?