2024年1月1日:能登半島地震、輪島大火
2024年1月2日:羽田空港旅客機衝突事故
2024年1月3日:北九州小倉火災、秋葉原電車内無差別通り魔
最初からクライマックス過ぎな令和6年の年明け。
ずっと続くと思ってた。
「このまま終わらないんだ」どこかでそう信じていた。
冬休み
今日、冬休みから卒業します!
© ドラえもん/藤子・F・不二雄/小学館
働きたくないでござる!!!
絶対に働きたくないでござる!!!
© るろうに剣心 -明治剣客浪漫譚-/和月伸宏/集英社
自分まだ休めます!休ませてください!!
© 陰の実力者になりたくて!/逢沢大介/KADOKAWA
あなたがいると気が休まらないから早く出て行って(怒
SBI証券の特定口座における投資信託の利益を抽出しCSV化するスクリプトを作成した。
それで利益率グラフを作成してみたが古い情報は分からず歯抜け状態。
今後は定期的に利益情報を保存しておきたい。
ついでにツイッター(X)で毎週呟くBOTも作ってみた。
単なるBOTなので個人アカウントを紹介する予定はないけど、BOT作成方法だけはまとめとく。
フォロー者は0人でフォロワーも5人程度なのに、投資信託商品名を記載するとPVは400超えてこのブログ閲覧者の10倍……。
Twitter(X) APIを無料で使う際の注意点は次のとおり。
いつ改悪されるかは不透明
登録できるアプリは1つだけ
1,500ツイート/月まで無料
Twitter(X)のAPI利用方法
これはググれば簡単に見つかる。
ソースコードも短い。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ライブラリ
import tweepy
#Twitter Developer Portalから取得したキーを設定
ck = '<API KEY>'
cs = '<API KEY SECRET>'
at = '<ACCESS TOKEN>'
ats = '<ACCESS TOKEN SECRET>'
#ツイート内容
content = 'ツイート内容'
#認証
client = tweepy . Client ( consumer_key =ck , consumer_secret =cs , access_token =at , access_token_secret =ats )
#ツイート
client . create_tweet ( text =content )
まず、この実装に必要なKEYを取得する必要がある。
方法は簡単だけど、他のサイトで学んだ。
Twitterの無料APIを設定する方法
Twitter APIに有料プランが導入され、無料で使える機能が制限されてしまいました。開発者向けのページでカスタムアプリを登録する必要もあり、ちょっと手順が面倒ですが、基本的に一度設定すればOK。気まぐれな暴君にはもう少し付き合っていく必要がありそう…
この際「Developer agreement & policy」ページが表示される。
APIを何のために使うのか、説明の入力を求められるので、次のように記載すれば良いだろう。
I’ll utilize the Twitter API to post and schedule tweets, as well as to respond to feedback left on my tweets. I will provide stats about the effectiveness of my tweets, such as impressions, engagement rate, link clicks, and related metrics, using data from Twitter’s API.
Twitter API を利用してツイートを投稿およびスケジュールし、ツイートに残されたフィードバックに応答します。 Twitter の API からのデータを使用して、インプレッション、エンゲージメント率、リンクのクリック、関連指標など、ツイートの有効性に関する統計を提供します。
SBI証券口座情報をSeleniumを使って自動取得する
Selenium 4 は 2021 年 10 月 13 日にリリースされた。
本来は、Selenium 4を使うべきだけど過去の資産が稼働している場合は共存する必要がある。
使えるAPIが変わったので非常に厄介だが、その場合は次のような実装が可能。
import selenium
SELENIUM_VER = int ( selenium . __version__ [ : idx ] ) # スライスで"."ドット文字よりも前を抽出
if ( SELENIUM_VER > = 4 ) :
driver . find_element ( By . NAME , 'user_id' ) . send_keys ( account )
driver . find_element ( By . NAME , 'user_password' ) . send_keys ( pass_word )
driver . find_element ( By . NAME , 'ACT_login' ) . click ( )
else :
driver . find_element_by_name ( 'user_id' ) . send_keys ( account )
driver . fid_element_by_name ( 'user_password' ) . send_keys ( pass_word )
driver . find_element_by_name ( 'ACT_login' ) . click ( )
その上でSBI証券にログインするコードは次のようになる。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#coding: utf-8
import selenium
from selenium import webdriver
from selenium . webdriver import ChromeOptions
from selenium . webdriver . chrome . webdriver import WebDriver
from selenium . webdriver . common . by import By
from selenium . webdriver . support . ui import Select
import pandas as pd
import csv
import io
import os
import sys
import time
from time import sleep
import json
import datetime
WAIT_TIME = 5
sys . stdout = io . TextIOWrapper ( sys . stdout . buffer , encoding ='utf-8' )
idx = selenium . __version__ . find ( '.' )
SELENIUM_VER = int ( selenium . __version__ [ : idx ] ) # スライスで"."ドット文字よりも前を抽出
def login ( driver , user_file ) :
# 設定ファイルの読み込み
SETTINGS_DIR = "./settings/"
with open ( SETTINGS_DIR +user_file ) as fs :
info_mail = json . load ( fs )
account = info_mail [ 'account' ]
pass_word = info_mail [ 'pass_word' ]
global pass_word_odr
pass_word_odr = info_mail [ 'pass_word_order' ]
driver . get ( 'https://www.sbisec.co.jp/ETGate' )
sleep ( 2 )
if ( SELENIUM_VER > = 4 ) :
driver . find_element ( By . NAME , 'user_id' ) . send_keys ( account )
driver . find_element ( By . NAME , 'user_password' ) . send_keys ( pass_word )
driver . find_element ( By . NAME , 'ACT_login' ) . click ( )
else :
driver . find_element_by_name ( 'user_id' ) . send_keys ( account )
driver . fid_element_by_name ( 'user_password' ) . send_keys ( pass_word )
driver . find_element_by_name ( 'ACT_login' ) . click ( )
sleep ( 2 )
def main ( ) :
# setting folder for downloading
downloadsFilePath = '.\\logs'
options = ChromeOptions ( )
prefs = {
"profile.default_content_settings.popups" : 1 , # ポップアップウィンドウを許可
"download.default_directory" :
os.path . abspath ( downloadsFilePath ) + r "\\" ,
"directory_upgrade" : True
}
options . add_experimental_option ( "prefs" , prefs )
driver = webdriver . Chrome (
executable_path =r './chromedriver.exe' , options =options )
driver . implicitly_wait ( WAIT_TIME )
fn = [ 'settings_sbi.json' ]
for fname in fn :
login ( driver , fname )
sleep ( 2 )
# repeat end
sleep ( 3 )
driver . close ( )
if __name__ == '__main__' :
main ( )
因みにChatGPTに作らせると
sleep関数は固定の待機時間を設定するため、実際のウェブページの読み込みや処理が完了する前に次のステップに進んでしまう可能性があります。Seleniumでは代わりに、WebDriverWaitとexpected_conditionsを使用して待機処理を行うことが推奨されています。
SbiSecScraper クラスを導入し、関連するメソッドや変数をまとめました。これにより、オブジェクト指向の特性を活かし、コードがより構造化されています。
と上記のソースコードを入力としてリファクタしてくれるけど割愛。
おわりに
スタバで高校生カップルが
彼女「石川で苦しんでる人がいるのに。こんな普通にしてていいのかな」
彼氏「誰かが不幸だからって。君が幸せになってはいけない理由にはならないよ。でも君のそういうとこ凄く素敵だと思うよ 」
惚れてまうやろ~!
人生何周目の方ですか……
ご冥福をお祈りします。
昨年も本題が短いブログだけど、今年もこんな感じで進めようと思ってる。