新・日々の暮らしに疲れてない?

一人バンド、火頭工房

HTMLパーサーはいつだってしんどい。

HTMLパーサーはいつだってしんどい。

 

相変わらず更新が滞っております。とはいえ、最近はプログラミングしていることが増え、何かしら発信したいときはこちらのブログが良いのかなぁ、と思ったり。

 

さて、いつでも面倒なHTMLのパーシング、昔からHTML CSS 関連は苦手です。

今回のお題は、企業の株価の取得。

 

長年、趣味で投資をしています。

もっぱら個別株式のホームラン狙いで、昔からめちゃくちゃ損しています 苦笑

(いい加減、最近は手堅い投信に切り替えつつありますが)

 

で、昔から泣かされていたのは、いわゆる機関の空売り

特に海外の投資会社が空売りを仕掛けるんですよね、

で、キューキュー株価が落ちて、こちらはキューキュー言わされる、と。

や、半分冗談なので真に受けないでください。

 

それらの機関が空売りを仕掛けたとして、ちゃんと公開されています。

例えばこういうサイト:

空売り残高情報

karauri.net - 空売り残高情報を検索

 

わざわざ見に行くのも面倒なんで、バッチファイルとかで取得出来るだろう、と。

そこでHTMLパーサーなわけです。

 

例によって、サイトのデザインが変わってしまうと動作しないので、あんまりやる気も出ないんですが、今はChatGPTがありますからね(それでも苦労した)。

 

こんな感じで空売り情報を取得してくれます、適当に打った企業コード4444様には失礼。

上段が空売り情報で、下段はついでに直近の株価を表示してみました。

ちょっと上段の表示がバグってますね。

 

もちろん表示する企業は変えられるようにしてありますが、

もともと機能を拡大する気はなかったので、1社分しか表示しないように作ってある。

が、作っている内に結局複数の企業を表示したいよなぁ、と思うようになり作業が延々と伸びていくことになります。

 

まぁこんな情報取ってくるより、手固い投信に拝金しましょう。

 

おしまい

【Chrome拡張機能】ChapGPTで過去の作品の改善をした

Chrome拡張機能】ChapGPTで過去の作品の改善をした

 

こちらのブログを更新するのはとても久しぶりです。

プログラミングはちょいちょい学習を続けていましたが、ChatGPTの登場で世界が変わりました。皆さんにおかれましては開発スピードが格段にあがったことでしょう。

 

試したいけど億劫だったこと等が瞬時に出力されたりするので、私もそれなりに恩恵を受けているのですが、例えば最近ではクローム拡張機能を改善したこと。

グーグルのバージョンアップに伴って作成した機能が公開停止になったり、改善を求められたりしたのですが、放置していたんですよね。

 

コードのリファクタリングもChapGPTに任せればサクサク進みます。

将来に備えて拡張機能テンプレートを作ったりしました。

 

とりあえず一番のヒット作、「YouTube動画の画質を自動調整君」

chrome.google.com

 

それから新作「グーグル検索フィルター」。

chrome.google.com

グーグル検索の結果を赤線で囲ってハイライト入れたり、表示させなかったりする機能。

以前プロトタイプを作ったものの、グーグル側のサイト更新についていけなさそうだったので、公開しませんでしたが、ChatGPTの助けを借りて汎用的に作れたので、とりあえず公開しました。

 

やっぱり何か作るのって楽しいですね。

はて、何か作りたいものはあるかしら?

 

おわり

ウェブ広告退治 アドブロックできない要素を消す

ウェブ広告退治 アドブロックできない要素を消す

Chrome拡張機能関連のお話。

 

アドブロック系拡張機能を使っていても消せない広告が存在します。

よく考えるもんです、例えばこれ ↓

f:id:hiatama:20210128110855p:plain

まとめサイトでよく見るこういうのですね。

(特定のサイトを揶揄する意図はないので、もろもろ隠してあります)

 

ページの両側に配置されていて、ちょうどスクロールする時に間違ってクリックしてしまう憎たらしい配置。

 

アドブロックの自動感知に引っかからない工夫がしてあるようで、消えないんですよね。

 

拡張機能によっては、手動でクリックした要素を消せるのですが、それすら対策済みでクリックが出来ないように工夫されている。

 

HTML&CSSで、余白なしの状態にしてあって、リンクがミチミチなわけ。クリックした瞬間に広告ページが開かれて、元ページでは広告は消えていない。

 

この広告を、コンソール画面からHTML操作して、アドブロックがクリックする隙間を作って、手動で消します。

 

※以下、かなり修正があります、記事の下に修正を書きます。

 

↓ まず、コンソール開いて、Elementタブを選んで、広告の要素を調べる

それらしい id が出ました。

f:id:hiatama:20210128110900p:plain

 

そこからもう少し上に昇って、出来るだけ広告の大元の要素を調べます。

この辺かな? ↓

f:id:hiatama:20210128110904p:plain

 

コンソールタブに行って、要素を getElementById します

f:id:hiatama:20210128110907p:plain

変数に入れなくてもいいんですけど、要素の特定がうまく行ってない時は、parentNodeやchildNodesを調べて行く必要がありますので楽が出来るように。

この要素の特定が一番重要な部分です。

 

で、要素に css を足します。padding をつけて余白を設定。

f:id:hiatama:20210128110910p:plain

↓ 広告に余白が出来ました、緑の部分ですね。

f:id:hiatama:20210128110915p:plain

 

↓ 要素に padding が設定されていることがわかります。

f:id:hiatama:20210128110918p:plain

 

準備OK。

アドブロック機能を起動して広告にカーソルを当てると、余白があるおかげでクリック出来そうです。

f:id:hiatama:20210128110921p:plain

 

はい、消えました。

f:id:hiatama:20210128110926p:plain

 

以上です。

ちょっと面倒かも知れませんが、ご紹介。

 

広告を作る側、サイトを運営する側も色々工夫しているわけなので、このように広告を消すのが良いのかはユーザー次第です。

それに、こういうのいたちごっこですからね、また新しい仕組みが出てくるだけです。

 

ちなみに広告ブロック(html操作)で一番手を焼くのは...

iframe要素です。広告業界の皆さん、iframeで広告作らないでくださいね 苦笑

 

おしまい

 

 

※追記

要素の取得について

コンソール画面で要素をクリックしたあと、適当な要素までさかのぼるのは良いのですが、その後は右クリックして Copy の欄から Copy selector とするのがオススメです。

で、コンソールに

var x = document.querySelector('貼り付け');

などで要素の取得が出来ます、querySelector は神メソッドです。

あとは 要素.style.padding などで余白を設定する、このあたりは同じです。

【Chrome拡張機能】YouTubeとのアドブロック戦争 その2

Chrome拡張機能YouTubeとのアドブロック戦争 その2

 

さて、機能を作ると言っても公開しないので、あくまで個人的な楽しみです。

(グーグル先生に睨まれてはカナワン)

 

どのようにアドブロックするかというと、結局は自動クリック方式にします。

「自動で広告消すボタン押してくれる君」です。

 

こういうことやるには対象ページのHTMLをよく調べないといけないので面倒なんですが、根気よくすれば誰でも見つけられます。

 

ブラウザのコンソール画面を開いて、広告のHTML要素を調べる。

ものすごい木構造(親要素と子要素がある)になっているので、広告を消すボタンに辿りつくまで、

上の方の要素.childNodes[0].childNodes[2].childNodes[0]...

の様に階層を潜って調べることになります。

で、ボタンに辿りついたら、

ボタンの要素.click()

これでなんとちゃんとボタンを押したことになるわけです。

※修正、要素の特定にはquerySelector を使いましょう

 

ただこういうやり方すると、グーグルがページのデザインを更新した時に動かなくなります(結構頻繁に更新されます)。そして木構造を追っかけて行くのは本当に大変。

 

なのでもうちょいマシなやり方、再帰を使って実装。

 

クラス名やid名で要素を取得・特定するのは仕方ないので、まず解析の起点になる要素のクラスネームを保存。getElementsByClassNameします。←リストで帰ってくるので注意

 

特定する要素の名前を、あらかじめ変数にリストアップしておく、今回はボタンのクラスネームです(広告の種類によって別々の名前がついています)。

 

「解析の起点になる要素」を再帰関数に渡します。再帰関数内では、以下の様に処理されます。

 

・まず要素のタグをチェックして目的のタグでなければ終了。今回はDIVとSPANタグが目的のボタンでした。

 ↓

・要素のクラスネームをチェック → 変数に保存しておいた「ボタンの要素名リスト」と indexOfをかけて該当するか調べ、該当すればそれが目的の要素なので、要素を return する。

 ↓

・上の処理に該当しなければ、要素にchildNodes (childrenでも良し)がいるか調べる。いるとしたら複数存在する場合が多いので、ループで全て再帰関数に渡す

 

こんな感じです。イメージしにくいかも知れませんが、現実世界に例えると...

 

再帰関数君は事件の犯人を調べている。指名手配リスト的なものを持っていて、容疑者を一人一人部屋に呼んで調べている

1 まず再帰関数君が、見た目やら性別で事前チェックする → 明らかに犯人と違うと時間の無駄なので解放

2 解放にならなかった場合は、次に再帰関数君があなたの名前を聞く → 指名手配されている名前なら処理終了

3 違ったら、子供がいるか聞かれる → いなければ解放、いれば子供を一人ずつ部屋に呼ぶように言われる

4 あなたは解放され、あなたの子供Aが部屋に来て、1に戻る

 

これだけです。

子供、と書きましたが、その子供にも子供がいる可能性がありますので、一人一人調べていくわけです。

 

こういうの一度作っておくと、他の機能でも使いまわせて便利かもね。

検索にヒットさせる要素リスト → 今回はDIVとSPANでしたが、設定可能にする

特定する要素名 → これはページリニューアルの際に崩れる可能性はある、要素名が変わるとアウト。

 

あ、ちなみに広告がページに現れる瞬間というのを検知する必要があるのですが、これは MutationObserver という機能で実現します。

上に書いた「解析の起点になる要素」をMutationObserverに渡しておくと、要素に何らかの変更があった場合に通知してくれますので、再帰関数の発火に使います。

 

完成した機能を実際に使ってみると面白いです。

普通の広告は目に見える前に消えるようで、ストレスがない。

スキップボタンありの動画広告は「5...4...3...」とカウントダウンは見ることになりますが、0になった瞬間に消えます。

 

以上。文字ばっかで疲れた。

(グーグルさん、怒んないで)

【Chrome拡張機能】YouTubeとのアドブロック戦争 その1

Chrome拡張機能YouTubeとのアドブロック戦争

 

大変ご無沙汰してます、火頭です。

ここ数年は別のブログを書いていて、こちらの方に書く内容がめっきり減ってしまいました。

 

ローム拡張機能も、もう作るものもなく放置気味。

自作した機能の中で一番傑作だった「YouTubeの画質調整くん」はなぜかグーグル側からストップをかけられ、現在非公開になっています。

 

さて、標題の「YouTubeとアドブロック」について。

ウェブを快適に過ごすために、アドブロック系拡張機能は必須です。

普通のウェブサイトだけでなく、YouTubeの広告なんかも自然とブロックしてくれて、まぁ素敵。

 

ところが、グーグル的には当然広告を見てもらわないとマズイわけで、アドブロック界隈といたちごっこを繰り広げている模様(しらんけど)。

 

ちょっと前からユーチュ-ブページでアドブロックが効かないことに気づく。

つべの動画広告あるじゃないですか、あれがスキップできなくなっていて

「なんじゃこりゃ!1分以上拘束されるやんけ!」となる。

 

てっきりグーグルが、もう動画広告のスキップ機能を思い切ってカットしたのかと思いましたが。なんとアドブロックのせいでした。

 

その手法が笑っちゃいます ↓

アドブロックは、HTML要素をざざっと調べて疑わしき要素を自動で排除する。

「疑わしき要素」とは例えば「広告、ad、advertisement」などの文字列を含む要素。

これらを最初からブロックしちゃうわけですね、ユーザーのためを思ってやることですが、それらを個別に解除する機能がなければ困ったことになります。

 

グーグルはその便利さを利用し、広告スキップボタンにわざとらしく怪しい名前を付けたわけです、アドブロックはそれをまんまと検知し、ボタンを消してしまう、と。

ボタン消されてはたまったもんではありません、ユーザーは泣く泣くアドブロックを解除するのでした...

 

はぁ~、なるほどよぉ~。

シンプルかつ強力な手段、さすがグーグル大先生。

私の使っているアドブロックは、機能のオンとオフしかなく、オンにすると自動でブロック機能が働きます、オートでブロックされたものを解除することは出来ないが、ブロックする要素を追加することが出来るという仕様です。

 

まぁこういうのはいたちごっこなのでしばらくしたら改善されるかも知れませんが、久しぶりに拡張機能を作りました。

 

長くなったので次回へつづく

【Chrome拡張機能】オートクリック、考えてみたが...

ローム拡張機能シリーズ、非公開モノです。

オートクリックは前から手がけてみたかったので実際に試してみた。

 

日ごろルーティン的に、このサイト行ったらここをクリックして、ということありますよね。あるいはヤフオクに出品しているとかで、期限切れになったアイテムを再出品したりとか、そういうクリックの手間を減らしたい等。

 

で、作ってみて、個人的には問題ないしとても便利ですが、これは公開できない。

 

JavaScriptを通じてクリックすることは、HTMLの要素.click() で出来ます。

簡単に思えますね。

 

でも、HTMLの要素を絞り込むのが難しいのです。

クリックしたい要素というのはそもそもリンクがあるからクリックしたいわけです(たいていは)、そのリンクの設定の仕方が今時のサイトだと複雑になっていて、見た目通りにいかないことが多いのです。これは別の拡張機能を作る時に体験しました。

 

それぞれのサイトのhtmlを詳しく見て的確に要素を割り出さないと動作しないので、ユーザーにGUI(いわゆるガワです)を用意するのが非常に難しい。

 

実際やるとしたら...

拡張機能を起動させて、チェックモードみたいな状態にしてポップアップ外のクリックが出来る状態にする(じゃないとページの要素を選んでもらえない)

・その状態でオートクリックしたい要素をクリックしてもらう

・その要素をチェックし(親要素や子要素を含めて)リンクを取得する

・ユーザーにリンクが取得できているかをチェックしてもらい、問題なさそうならサイトと要素を保存する

・サイトのURLを常に監視し、保存されているサイトなら機能を実行する

 

こんな感じですかね。

チェックモードと表現した状態はどうやってするのかわかりませんが、広告ブロック系拡張機能で見たことがあります。アレは調べる価値ありそう。

 

まぁやって出来ないことはなさそうだけど、そこまでの手間かけるのもなぁ...

サイトがデザイン変えたら動作しなくなるし。

 

自分用のは、コンソール画面からサイトのhtmlを調べて直接コードに打ってます。汎用性ゼロですが、はっきり言ってかなり便利。

【Chrome拡張機能】ブラウザ履歴のワンタッチ削除

前回、拡張機能のアイコンをクリックすると機能を実行してくれる、という方法を書きました。これで作ろうと思ったのは「ブラウザの履歴を消すこと」です。

まぁ定番といえば定番。

 

当然、この手の拡張機能はすでに作られているんですけど、なんか怪しいんですよね。

広告ついてたり、あるいは余分なデータまで消してて不便だったり。以前はブラウザを閉じる時にオートで履歴を消すものを使っていたのですが、毎回消されるのはやはり不便でした。で、拡張機能のアイコンをクリックしたら履歴を消去してくれる、というのは便利だろうと思ったわけです。

 

ちょっと調べてみたらちゃんとグーグル本家から機能が公開されているし、細かく設定が出来るようなので作ってみた。

 

1. マニフェストファイルに「 browsingData」を明記する。

2. ポップアップファイル内で実行する。

chrome.browsingData.remove();

 

以上。やべぇ、すごく簡単。

 

色々と設定が指定できます。

・いつから消すか(ちょっと時間指定にコツがいりますがサンプルがあります)

・どのデータを消すか。履歴・クッキーなどはもちろんindexedDbやプラグインデータなど細かく指定可能

 

これで個人的には大満足なんですけど、これを公開するにはいわゆる「ガワ」が必要なわけで...設定を保存するのにstorage機能と連携させないといけなかったり、htmlで機能のリストやボタンなどを用意しないといけないですよね、これがキライ。

 

storageに保存するってことゎ、ポップアップぺーじを開いたとき、保存したなぃよぅを読み込みなぉして、htmlにはんえぃさせるってこと。それゎとてもめんどぉなこと。

 

という感じ。そもそも私は機能を作ったらあまり設定をいじらなくて良いように作るし、変えたかったら直接ファイルに書き込むし...ブチブチ思いながらも完成しました。見た目は酷いですが、あとはストアにそのうちアップしますので、よろしくお願いします。

 

どこまでさかのぼって履歴を消去するか指定できますし。消去する項目も選べるようにしてあります。

 

ぉしまぃ

 

 

追記:

公開しました。

chrome.google.com