雑多に技術メモと他色々

主に自分用な技術メモが多くなる気がする。他色々が書かれるかどうかは不明。

SBI証券の入力を爆速にするブックマークレットをカスタムしてみた

自分用に作ったもの。

SBI証券IPO申し込み(Web)がめんどい。
公開ブックマークレットもあるけど、有力なやつは買付け余力に対して全力申し込みするし、もう一声という感じなので自作してみた。
コードに無駄なところがあったり、デバッグ用のconsole.logがあったりしますが、大目に見てください。

なお、既に他の方が作られているものとしてこちらを参照してみました。
ipo-tracker.com

作ったもの

新規上場の一覧ページで申し込んでないIPOを選択する

いちいちページ見ながら未申込を探してボタンクリックするのが面倒なので、一覧ページで実行すると自動で先頭の申込ボタンリンク先に移動してくれる機能を。

javascript:(function(){location.href=document.querySelectorAll('img[src*="b_ipo_moshikomi.gif"]')[0].parentNode.href;})()

申し込みフォームで100株ストライクプライス入力する

基本的に参照ページで公開されている機能マイナスα。
パスワードもブックマークレット登録してしまうのは気になったので、一応このコードでは自動入力から弾いている。

javascript:(function(){document.getElementsByName('suryo')[0].value=100;document.evaluate('//*[@id="strPriceRadio"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0).checked=true;})()

申し込みフォームで特定の余力に対して全力買いをストライクプライス入力する

自身の買付余力に対し、仮条件が最高価格で決定した場合に購入できる最大数を自動計算して入力してくれる。
買付余力は固定入力。「★自身の買付余力★」の部分をIPOに割り当てたい余力の金額に置き換えて実行する形。

javascript:(function(){var num=Math.floor(★自身の買付余力★ / document.evaluate('/html/body/table/tbody/tr/td/table[1]/tbody/tr/td/table[1]/tbody/tr/td/form/table[5]/tbody/tr/td[1]/table/tbody/tr[2]/td[2]/div', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0).textContent.split(/[~・]/).map(s => s.replace(/[^\d\.]/g, '')).reduce((a,b)=>Math.max(a,b))/100)*100;console.log(num);document.getElementsByName('suryo')[0].value=num;document.evaluate('//*[@id="strPriceRadio"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0).checked=true;})()

例えば、買付余力が「1,000,000円」で仮条件の最高額が「1,200円」であれば、自動的に購入可能な最大数として「800株」を入力してくれるといった具合。
ほとんど例外が無いので購入単元が「100株」以外のパターンは考慮外。
デバッグ用にフォーム入力される購入数がコンソール出力されます。

作ったもののjQuery版(2020/12/05更新)

参照ページ見てもjQuery使ってるし、そっちで整理したほうがスッキリしそうだったので追加。数量とストライクプライス入力は丸コピになっちゃってる。

申し込みフォームで100株ストライクプライス入力する

javascript:(function(){javascript:$('[name=suryo]:eq(0)').val(100)[0].select();$('#strPriceRadio').click();})()

申し込みフォームで特定の余力に対して全力買いをストライクプライス入力する

javascript:(function(){var num=Math.floor(★自身の買付余力★ / $('tr tr tr tr tr:contains(仮条件) td div')[1].textContent.split(/[~・]/).map(s => s.replace(/[^\d\.]/g, '')).reduce((a,b)=>Math.max(a,b))/100)*100;console.log(num);javascript:$('[name=suryo]:eq(0)').val(num)[0].select();$('#strPriceRadio').click();})()

注意

XPath利用でガチガチにページ構成に依存しているので、公式がページデザインを更新した瞬間に恐らく動作不可。
その時は改修すればいいか。

学んだコードテンプレ

何も難しいコードは書いてないので、ググれば出てくるようなものだけど、一応メモっとく。

文字列から数値(0-9)と小数点以外の文字を取り除く hoge.replace(/[^\d\.]/g, '')
配列要素(数値)の最大値を取る hogeArray.reduce((a,b)=>Math.max(a,b))
XPathで指定したDOM要素を取得する(ページ全体からの取得) document.evaluate('//xpath', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0)
name属性指定でDOM要素を取得する(ページ全体からの取得) document.getElementsByName('suryo')[0]