LoginSignup
0
0

More than 5 years have passed since last update.

動的に作られる sitemap.xml を検証する

Posted at

概要

LFTV のレビューおじさんです。Xin Chao. ホーチミンは地獄のような暑さです。

さて、ベトナムでは、基本的にエンジニアは自分が作ったものを検証しないので、「たぶん大丈夫なはず」くらいで、気軽にレビューを依頼してくる。1回目のレビューでは、おそらく検証していないであろう点を検証し、指摘する。
まず最初に検証するのは、

  1. 異常系
  2. 検証ボリュームが多く、確認作業が単調なもの

などが考えられる。間違いない。

異常系はコードをサラッと舐めて当たりをつけ、おかしなデータを用意したり、おかしなリクエストを投げてみれば良い。コードを細かくレビューするまでもない。

検証ボリュームが多く、確認が作業が単調なものは、こちらもやってられないので、網羅はしたいが手は抜きたい。
例えば、リンク切れがないかとか、動的に作られた sitemap.xml が正しく作られているかとか。今回は簡単に URL を抽出できる、sitemap.xml について検証する。

方針

どこまで検証するかは悩みどころだが、ひとまず URL に関しては HTTP status が 200 となっていれば OK とする。当然いちいちブラウザで開いて確認してられないので、 curl する。

$ curl -I -sS $URL | grep HTTP
HTTP/1.1 200 OK

こんな感じ。URL リストを読み込みながら処理して行きたい。URL リストは、sitemap.xml の中に書いてある。
今は、URL さえ分かれば良いので、xml をパースしたりはせず、cat して加工する。

$ cat sitemap.xml | grep "<loc" | sed -e "s/^.*<loc>//g;s/<\/loc>.*$//g"

sitemap.xml の書き方として、URL は attribute なしの loc 要素として記述されているので、抽出は簡単(grep "<loc")。なお、xml は改行はされているものとする(されていない場合は、grep の前に工夫して改行して)。行頭・行末の不要なものを取り除けば(sed...)、欲しい URL リストの出来上がり。

読み込む sitemap.xml は複数に分割されている場合があるので、パラメータとして受け取れるようにしておく。そんなに頻繁に使うものではないので、ファイルの走査などはやめておく。
出力は、URL と HTTP Status の組み合わせを出していくものとする。

以上を組み合わせた bash スクリプトを書いておけば、それを叩くだけで、検証することが可能になる。楽ちん。

今更ではあるが、検証するサービスの Web サーバが curl を受け付けてくれないと使えない。

完成したスクリプト

chk_http_stutus_sitemap.sh
#!/bin/bash
cat $1 | grep "<loc" | sed -e "s/^.*<loc>//g;s/<\/loc>.*$//g" | while read line
do
    echo -n $line
    echo -n " : "
    curl -I -sS $line | grep HTTP
    # 負荷を気にするなら sleep 1 とかお好きに
    # sleep 1
done
exit;

使い方

$ ./chk_http_stutus_sitemap.sh sitemap.xml

エラー部分だけで良ければ、

$ ./chk_http_stutus_sitemap.sh sitemap.xml | grep -v "200 OK"

とか。(これがやりたかったので、出力結果は1行にした)

やってみた

実際のプロジェクトの sitemap.xml を検証してみた(バシっ

$ ./chk_http_stutus_sitemap.sh sitemap.xml
///****_st/ : curl: (3) <url> malformed
https://..... : HTTP/1.1 200 OK
^C

1つ目からかよ笑

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0