†Amexの明細(速報)の自動取得パズル認証や2段階認証は、正面から突破するより、1回は手動で補助してログインし、cookieをやりとりすれば、たいていはしばらく追加認証を回避できる。(毎回、追加認証を課すサイトには通用しない。)cookieはPuppeteerのコードで明示的に取得・保存する必要がある。headlessブラウザに(自動的に)保存されるものは助けにならないようだ。(サイトによって違うかも。)(毎回の)パズル認証を(簡単に)回避できたサイト:三井住友カードheadlessだとうまく巡回できない(headlessを無効にすれば順調な)サイトもある。三井住友カードはheadlessだといまのところ巡回に成功していない。Windowは入れない。cronで定期的に実行するには、VPSが望ましい。Chromeは動かないようだ。)これでいまのところ三井住友カードも自動巡回できている。cronで動かすならtry-catchを書かないと、時間切れなど何か予期せぬことが起きる度にメモリに貯まっていく。指定したセレクタが複数あるだけかも。page.focusなどは上記エラーが出る(ことがある)。ElementHandleでオブジェクトのリストを取得し、リストの番号で目的のオブジェクトを操作すればよい。page.$$('input[name="password"]');items[1].click();pageクラスと書式が同じものもあれば違うものもある。elementHandle.typeは、セレクタを引数に取らない。†スマートメーターの情報をグラフで表示するページを電力各社は提供している。私が契約している「あしたでんき」は、データをCSV等でダウンロードできないので、画面から取得している。当初、Greasemonkeyで試したが失敗したので、Puppeteerに切り替えた。このサンプルでは、前月のデータをTSVで書き出している。当月を取得したいなら前月に移動するコードを削除すればよい。table').remove();//8列目が存在しない行を削除。全ての行の内、8列目が不存在の行を全て削除。$('tr:not(:has(td:nth-child(8)))').remove();//8列目が空の全ての行を削除。全ての行の内、8列目が空の行を全て削除。8列目が存在しないと効果なし。8列目がない行を削除という意味(存否判断)では使えない。td.blue以外の全てのtdを削除。全てのtdを、td.blueを除き、削除。†(先ず簡単な方から。)URLエンコードされている文字列を取り扱う(例えばApacheのログファイルの解析)には、単にURLデコードしただけでは駄目。URLデコード後、直ちにPerlの内部表現に「デコード」する。ないと他の文字列と整合性がとれなくなる。一般に全ての文字列は、出力の際、エンコードする。URLデコードした文字列について、デコードされる前にエンコードされると二重エンコードになり、文字化けする。utf8;前提)と(正規表現や文字列比較演算子で)マッチしなくなる。リテラルによる正規表現や文字列比較演算子が使えない。文字化けはないので、上記より気付きにくい。INを便利なプラグマとして、雛形として使っていることは少なくないのでは。「<:utf8」ではなく「<:encoding(UTF-8)」でも変わらず。":utf8";」でも同様に駄目になる。下記のコードで試せる。print」と言われるが、それが正しい。3番目の出力箇所で出ないことの方が意外だった。このような結果になる。indexprintfの記法は気が滅入る。qq($_[0]);}}CGIプログラムをroot名義で動かしたいことがある。sudoを使えば可能。当初誤解していたのだが、sudoersに適切な記載をすれば、その条件で、自動的に実行ユーザーが変わるのだと思っていた。(mod_rewriteのように。)正しくはsudoコマンドが必要。sudoコマンドで、対象コマンド等を呼んで初めて実行ユーザーが変わる。CGIスクリプトそれ自体をsudoで呼び出し実行する(CGIとして)ことは非現実的なので、CGIスクリプトの中で本命のスクリプトないしコマンドをsudoで呼び出すことになる。sudoersに登録する対象コマンド等は、その本命スクリプトないしコマンドになる。/bin/cpや/sbin/iptablesのようなコマンドを登録するのは影響範囲が広すぎ、危険だ。スクリプト」しておくとよい。理由不明の文字化けで困っていたが、PerlのCGIモジュールを更新したら直った。同じコードが別環境で問題なかったので気付いた。CGI::escapeHTML()。utf8プラグマは、それより前の行に書いてあるリテラルを内部表現にしない。utf8;はその後に書くミスを犯した。