[PYTHON] Eine Geschichte über das Schreiben eines Programms, das Ihre eigenen Asset-Übergänge automatisch zusammenfasst

Einführung

Ich habe vor ungefähr einem halben Jahr angefangen zu lagern, aber ich habe es nicht geschafft, wie sich mein Vermögen überhaupt verändert hat, also habe ich ein Programm erstellt, um es automatisch zusammenzustellen, also möchte ich es veröffentlichen.

Abkratzen der Vermögenswerte von der Wertpapierfirma HP

Da ich SBI-Wertpapiere verwende, ist die folgende Methode zum Erwerb des Vermögenswerts mit SBI-Wertpapieren. Ich denke, dass andere Wertpapierfirmen es verwenden können, wenn dieser Teil geändert wird (ich weiß nicht). Erhalten Sie das Barguthaben vom Startbildschirm und den Marktwert (inländische Aktien und Investment Trusts) vom Portfolio-Bildschirm.

** Barguthaben auf dem Startbildschirm ** Da die Menge hier geschrieben steht, werde ich sie mit Selen holen. Es wäre schön, wenn es eine API gäbe, die so viel unterstützt, aber da es keine gibt, werde ich den schlammigen HTML-Code analysieren und abrufen. Screenshot at 2020-08-18 21-37-41.png

** Erwerb von Marktwert ** Klicken Sie hier, um die CSV-Datei herunterzuladen. Ermitteln Sie den Marktwert, indem Sie die CSV-Datei analysieren (in der letzten Zeile der CSV-Datei). *** Ich wünschte, ich hätte eine API, die mich so sehr unterstützen würde. .. .. *** *** Screenshot at 2020-08-18 21-46-58.png

Automatisches Schreiben auf Google Sheet

Ich habe beschlossen, den Asset-Übergang mit Google SpreadSheet zu verwalten.

** Google-Blattstruktur ** Screenshot at 2020-08-18 21-31-24.png

Automatische Ausführung in Cron

Wenn Sie eine Aktie besitzen, ändert sich die Menge der Vermögenswerte jeden Tag, aber ich glaube nicht, dass Sie sie jeden Tag aufzeichnen. Sie können das Programm also nur am Sonntag unter crontab ausführen. Ich habe es pünktlich laufen lassen. Übrigens läuft es auf Raspberry Pi.

0 16 * * 0 cd /home/pi/asset-management && python3 run.py
#Minute Stunde Tag Montag Tag Befehl

Wo es stecken bleibt

Was wurde gemacht

Das Folgende ist der Code.

** Verzeichnisaufbau **

.
├── .credentials.json
├── .sbi.yaml
├── .token.pkl
├── data
│   └── 2020-08-16.csv
└── run.py

** Benutzerinformationen von SBI Securities **

yaml:.sbi.yaml


username:Benutzername von SBI Securities
password:SBI Securities-Anmeldekennwort (kein Transaktionskennwort)

** Hauptprogramm **

run.py


import os
import pickle
from datetime import datetime

import yaml
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

### constants
CHROME_DRIVER_PATH = "/usr/bin/chromedriver"
SBI_URL = "https://www.sbisec.co.jp/ETGate"
SBI_HOME_URL = #URL des Startbildschirms von SBI Securities
SBI_ASSET_URL = #URL des Roten hier
SBI_INFO = ".sbi.yaml"
DOWNLOAD_PATH = os.path.abspath("data")
# google api
CRED_TOKEN = ".token.pkl"
GSHEET_ID = #Google Sheet ID
GSHEET_RANGE = "sbi-jp!A1"

# webdriver
driver = None

def setup_webdriver(headless=True):
    global driver
    options = Options()
    options.headless = headless
    options.add_experimental_option("prefs", {"download.default_directory" : DOWNLOAD_PATH})
    driver = webdriver.Chrome(CHROME_DRIVER_PATH, options=options)

    
def quit_webdriver():
    global driver
    driver.quit()
    

def login_to_sbi():
    with open(SBI_INFO, "r") as f:
        info = yaml.safe_load(f)
    driver.get(SBI_URL)
    username_form = driver.find_element_by_id("user_input")\
                          .find_element_by_name("user_id")
    username_form.send_keys(info["username"])
    password_form = driver.find_element_by_id("password_input")\
                          .find_element_by_name("user_password")
    password_form.send_keys(info["password"])
    login_button = driver.find_element_by_name("ACT_login")
    login_button.click()


def get_cash_amount():
    driver.get(SBI_HOME_URL)
    cash = driver.find_element_by_class_name("tp-table-01")\
                 .find_element_by_class_name("tp-td-01")\
                 .find_element_by_tag_name("span")
    return cash.text


def get_market_value(timestamp):
    asset_file = f"{DOWNLOAD_PATH}/{timestamp}.csv"
    driver.get(SBI_ASSET_URL) 
    os.rename(f"{DOWNLOAD_PATH}/New_file.csv", asset_file)
    with open(asset_file, "r", encoding="shift_jis") as f:
        content = f.read()
        ll = content.split("\n")[-2].split(",")
    return ll[0]
    
    

def get_credential():
    creds = None
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly',
              "https://www.googleapis.com/auth/spreadsheets"]
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists(CRED_TOKEN):
        with open(CRED_TOKEN, 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                '.credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open(CRED_TOKEN, 'wb') as token:
            pickle.dump(creds, token)
    return creds


def update_gsheet(vals):
    creds = get_credential()
    service = build('sheets', 'v4', credentials=creds)
    body = {"values": [vals]}
    # Call the Sheets API
    resp = service.spreadsheets()\
                  .values()\
                  .append(spreadsheetId=GSHEET_ID,
                          range=GSHEET_RANGE,
                          valueInputOption="USER_ENTERED",
                          insertDataOption="INSERT_ROWS",
                          body=body)\
                  .execute()


def main():
    timestamp = datetime.now().strftime('%Y-%m-%d')
    setup_webdriver()
    login_to_sbi()
    cash = get_cash_amount()
    value = get_market_value(timestamp)
    quit_webdriver()
    update_gsheet([timestamp, cash, value])

    
if __name__ == '__main__':
    main()

Recommended Posts

Eine Geschichte über das Schreiben eines Programms, das Ihre eigenen Asset-Übergänge automatisch zusammenfasst
Die Geschichte des Exportierens eines Programms
Nogizaka46 Ein Programm, das Blog-Bilder automatisch speichert
Eine Geschichte, die es ermöglichte, automatisch eine Anison-Wiedergabeliste aus Ihren Musikdateien zu erstellen
Erstellen Sie mit Selenium ein Programm, mit dem Sie Ihr Lieblingsbild erstellen können
Eine Geschichte über einen Erstellungsfehler in einer gemeinsam genutzten Bibliothek, die auf libusb verweist
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird