[PYTHON] Une histoire sur l'écriture d'un programme qui résume automatiquement vos propres transitions d'actifs

introduction

J'ai commencé à stocker il y a environ six mois, mais je ne gérais pas du tout l'évolution de mes actifs, j'ai donc créé un programme pour les assembler automatiquement, alors j'aimerais le publier.

Rachat du montant des actifs de la société de titres HP

Puisque j'utilise SBI Securities, voici la méthode pour acquérir le montant des actifs avec SBI Securities. Je pense que d'autres sociétés de valeurs mobilières peuvent l'utiliser si cette partie est modifiée (je ne sais pas). Obtenez le solde de trésorerie à partir de l'écran d'accueil et la valeur marchande (actions nationales et fiducies de placement) à partir de l'écran de portefeuille.

** Solde de trésorerie sur l'écran d'accueil ** Puisque le montant est écrit ici, je vais le chercher avec du sélénium. Ce serait bien s'il y avait une API qui prendrait autant en charge cela, mais comme il n'y en a pas, je vais analyser et obtenir le HTML trouble. Screenshot at 2020-08-18 21-37-41.png

** Acquisition de valeur marchande ** Cliquez ici pour télécharger le fichier csv. Obtenez la valeur marchande en analysant le fichier csv (écrit sur la dernière ligne du fichier csv). *** J'aurais aimé avoir une API qui me soutiendrait autant. .. .. *** *** Screenshot at 2020-08-18 21-46-58.png

Écriture automatique sur une feuille Google

J'ai décidé de gérer la transition des éléments avec Google SpreadSheet.

** Structure de la feuille Google ** Screenshot at 2020-08-18 21-31-24.png

Exécution automatique dans Cron

Si vous possédez un stock, la quantité d'actifs change tous les jours, mais je ne pense pas que vous enregistrez tous les jours, vous ne pouvez donc exécuter le programme que le dimanche sur crontab Je l'ai fait fonctionner à l'heure. Au fait, il fonctionne sur Raspberry Pi.

0 16 * * 0 cd /home/pi/asset-management && python3 run.py
#Commande minute heure jour lundi jour

Où ça se coince

--Spécifiez la destination de téléchargement du fichier avec du sélénium

Ce qui a été fait

Voici le code.

** Structure du répertoire **

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

** Informations utilisateur SBI Securities **

yaml:.sbi.yaml


username:Nom d'utilisateur SBI Securities
password:Mot de passe de connexion SBI Securities (pas le mot de passe de transaction)

** Programme principal **

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 de l'écran d'accueil de SBI Securities
SBI_ASSET_URL = #URL du rouge ici
SBI_INFO = ".sbi.yaml"
DOWNLOAD_PATH = os.path.abspath("data")
# google api
CRED_TOKEN = ".token.pkl"
GSHEET_ID = #ID de feuille Google
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

Une histoire sur l'écriture d'un programme qui résume automatiquement vos propres transitions d'actifs
L'histoire de l'exportation d'un programme
Nogizaka46 Un programme qui enregistre automatiquement les images de blog
Une histoire qui a permis de créer automatiquement une liste de lecture Anison à partir de vos fichiers musicaux
Créez un programme qui peut générer votre image préférée avec Selenium
Une histoire sur une erreur de construction dans une bibliothèque partagée qui fait référence à libusb
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine