Ruby Mechanize: Basic認証でのエラー時の対応

あるBasic認証が必要なサイトでアクセスのタイミングの問題なのか、通常は認証もページ取得も問題ないのに、認証エラーが発生することがあった。

require 'mechanize'

url = 'http://XXXX'
username = 'XXXX'
password = 'XXXX'
agent = Mechanize.new
agent.add_auth(url, username, password)
agent.get(url)

として、以下の「Mechanize::UnauthorizedError」エラーが発生する。

`response_authenticate': 401 => Net::HTTPUnauthorized for http://XXXX -- Basic authentication failed -- available realms: XXXX HTTP BASIC LOGIN (Mechanize::UnauthorizedError)

add_authからgetまでのタイミングが早すぎるのかと間にsleepを入れたりしてみたが改善しない。また、同時刻に何度かアクセスを繰り返すと成功する場合もかなりあり、失敗する条件がはっきりしない。

このため、次のように例外設定を入れて、再試行もするようにしてみたが、

agent.add_auth(url, username, password)
flag = 0
begin
  agent.get(url)
rescue Mechanize::UnauthorizedError => e
  flag += 1
  print "認証エラー: #{flag}"
  if flag <= 5 then
    sleep 1
    retry
  end
  print "エラー:接続できませんでした。"
  exit
end

結局は、いったんアクセスエラーになるとgetだけを再試行しても効果はないらしい。

そこで、add_authも含めて再試行することにした。

flag = 0
begin
  agent.add_auth(url, username, password)
  agent.get(url)
rescue Mechanize::UnauthorizedError => e
  flag += 1
  print "認証エラー: #{flag}"
  if flag <= 5 then
    sleep 1
    retry
  end
  print "エラー:接続できませんでした。"
  exit
end

こちらであれば、認証エラー時でも再試行でアクセスできるようになった。

リンク

AHBL停止でメールエラー

自身のメールアドレスに他から送信するとエラーメールが返ってくるようになってしまって、自身のアカウントとしてGmailも併用しているせいかとも思っていたのだが、他の方からも送信できないとの連絡があり、エラーメールを見直してみると次のような箇所(↓)があった:

The error that the other server returned was:
554 5.7.1 Service unavailable; Client host [XXX.YYY.ZZZ] blocked using rhsbl.ahbl.org; List shut down.  See: http://www.ahbl.org/content/last-notice-wildcarding-services-jan-1st

どうも、迷惑メール対策で使っていたAHBLのサーバが停止だかエラーになっていたらしい。/etc/postfix/main.cf中での該当サーバの指定箇所をコメントアウト(↓)し、

smtpd_client_restrictions =
    permit_mynetworks,
    #reject_rhsbl_client rhsbl.ahbl.org,
    ...

Postfixを再起動

# /etc/init.d/postfix restart

これで、メールが届くようになった…。

該当アカウントへのメールは届かせておいて、エラーメールは指定サーバのroot向けだかに送ったほうがいい気するが、そんな設定にはできんのか。

リンク

PHPでの月最終日取得

現在月の最終日の取得(t(その月の日数)を指定する)

<?php echo date("t");

任意年月の最終日の取得(mktime()に月,年を指定)

<?php $y=2015; $m=1; echo date("t", mktime(0, 0, 0, $m, 1, $y));

任意年月の最終日の取得(dを指定し、mktime()で翌月と日を0と指定して前月の末日に)

<?php $y=2015; $m=1; echo date("d", mktime(0, 0, 0, $m+1, 0, $y));

またはstrtotime()で”last day of 年-月”を使って

<?php $y=2015; $m=1; echo date("d", strtotime("last day of $y-$m"));

指定にtを使うなら以下でも可能

<?php $y=2015; $m=1; echo date("t", strtotime("$y-$m"));

リンク

Ruby Mechanize:きたももんがさんページ消失…

RubyのMechanizeの解説ページと言えば、「きたももんががきたん」さんのページ(Google検索)。ここを毎回ひじょーに参考にさせて貰っていたのだが、このところページのあったはてなにアクセスしても「見つかりません」と言われるばかり…。一時的なサイトの不具合かとも思っていたのだが、けっきょく1ヵ月近く経っても復活せず…。

しばらくはGoogleの検索キャッシュにも残っていたようだったが、いまはInternet Archiveのデータしか残っていないらしい。

ということで、Internet Archiveのデータへのリンクを:

よく検索で見つかる(念力やテレパシー等でしか連絡のできない)「Ruby Mechanize wiki (ja)」についても、「管理は kitamomonga」と書かれているので、同じ方が作成しているのかな(消えたほうの「はてな」のブログにもリンクが張られているし)。

[おまけ]
Firefoxのネット上のキャッシュ関連で見つけたアドオン:

HTMLフォームでのフォーム名の表示

Firefox等でフォーム入力値の自動補完をしていると、どのid名に対応してその補完値が入力されたのか確認したことがある。

HTMLソースを見れば判明するが、ソースを表示するのも該当箇所を探すのも面倒なので、そのフォーム位置にマウスを載せてオンマウスになった際にフォーム情報をポップアップしてもよさそうな気がするが、邪魔かなー。