週末DIYプログラミング
はてなブログでAmazonのリンクが切れているページを探すPHPプログラムを作りました。
何を作ったか
はてなブログの記事内で使うアマゾンや楽天のリンクが切れているものをチェックするプログラムです。自分用のPHPプログラムを作りました。
ことの発端
ことの発端は、ある記事で紹介したAmazonへの商品リンクが見えなくなっていたことです。へんな文字がそのまま表示されている状態でした。
リンク切れするとこうなりますね。
記事作成時の記載方法
はてなブログの右側のツールから持ってくると、こんな形になります。
展開がうまくいくと
商品があるときは、こんな形で表示されます。
展開がうまくいかないとき
何らかの理由で変換ができないときは、ブログ記事に書いた謎の文字列がそのまま記事内に露出します。主に商品がなくなっている場合ですね。
これが残っているのがとても残念なので、この現象を探すスクリプトを書いてみました。 自分がAmazonとRakutenしか使っていないので、2種類のはてな記法で文字残りしているものを対象にしています。
プログラムの仕様
今回のプログラムはシンプルです。やるべきことはこの2点です
- 記事URLを指定して、HTMLを取得する
- 取得したHTMLから怪しい文字が無いか確認する
記事URLを指定するといっても、ブログ内に200個以上のURLがあるので指定するのが面倒です。ということで、ブログ内の記事URLを全部取得する仕組みも入れます。
記事の全量を知るのに適したデータはサイトマップです。サイトマップインデックスファイル→サイトマップファイルと辿っていくと、公開されている記事URLを集めることができます。
つまり、プログラムで作るとこうなります
- サイトマップインデックスを取り出す
- サイトマップインデックスからサイトマップを取り出す
- サイトマップから記事URLをかき集める
- 記事URLを指定して、HTMLを取得する
- 取得したHTMLから怪しい文字が無いか確認する
最後に、何個のURLを調べて何個NGだったのかを教えてくれます。
今のところ自分用なので、PHPコマンド経由で実行する形です。
コード
特にライブラリを使わずに素のPHPで書いたので、PHPファイルを持ってくるだけで動くと思います。
<?php //自分のものに書き換える $sitemapUrl = 'https://kanaxx.hatenablog.jp/sitemap_index.xml'; $sitemapOrIndexUrls[] = $sitemapUrl; $entryList = []; do{ $url = array_shift($sitemapOrIndexUrls); echo '-getting XML >> ' . $url . PHP_EOL; $xml = file_get_contents($url); $urlSet = new SimpleXMLElement($xml); echo ' got ' . count($urlSet) . ' entries.' . PHP_EOL; foreach($urlSet as $name=>$data){ $loc = (String)$data->loc; if($name == 'sitemap'){ $sitemapOrIndexUrls[] = $loc; echo ' sitemap URL :' . $loc . PHP_EOL; }elseif($name == 'url'){ $entryList[] = (string)$data->loc; }else{ echo " somethign wrong <$name> tag." . PHP_EOL; } } }while(!empty($sitemapOrIndexUrls)); $errorList=[]; foreach($entryList as $n=>$entryUrl){ $html = file_get_contents($entryUrl); echo $entryUrl . PHP_EOL; if(preg_match_all('@\[asin\:[^:]*\:[^]]*\]@', $html, $_)){ $errorList[]=['url'=>$entryUrl,'error'=>$_[0]]; } if(preg_match_all('@\[rakuten\:[^:]*\:[^:]*\:[^]]*]@', $html, $_)){ $errorList[]=['url'=>$entryUrl,'error'=>$_[0]]; } usleep(50000); } echo "■結果".PHP_EOL; echo "チェックしたURL:" .count($entryList) .PHP_EOL; echo "エラーURL:" .count($errorList).PHP_EOL; echo "■詳細:".PHP_EOL; foreach($errorList as $n=>$result){ echo $result['url'].PHP_EOL; foreach($result['error']??[] as $n=>$e){ echo " $e" . PHP_EOL; } }
コードはこちらに置いてあります
https://github.com/kanaxx/hatenablog-omocha/blob/main/check-ng-ads.php
実行
コードを自分のマシンに持ってきて、PHPコマンドを実行すると、こんな感じで表示されます。
php check-ng-ads.php -getting XML >> https://kanaxx.hatenablog.jp/sitemap_index.xml got 18 entries. sitemap URL :https://kanaxx.hatenablog.jp/sitemap_common.xml sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2021&month=5 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2021&month=4 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2021&month=3 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2021&month=2 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2021&month=1 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=12 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=11 (省略) ■結果 チェックしたURL:224 エラーURL:2 ■詳細: https://kanaxx.hatenablog.jp/entry/rakuten-supersale-2021-Mar [rakuten:engei2:10257144:detail] https://kanaxx.hatenablog.jp/sharex-git-operation [rakuten:rakutenkobo-ebooks:1531948:detail]
どうやら、2か所に残ってるみたいですね。
あとは、ブログの管理ページからこのページを探して直すだけです。直すのは自分でやりましょう。
すっきりした
さいごに
コードも公開しているので自由に使ってよいです。公開されている情報を取り出しているだけなので、甚大な2次被害が起きるようなことは無いですが、実行は自己責任でお願いします。何かおきたときの責任は負いません。 誰でも簡単に使えるようにGoogle App Scriptを勉強して作ろうかな。