WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

また reCaptcha が動かなくなりました

by WebSurfer 2013年11月23日 15:13

ブログのスパムコメント防止のため、BlogEngine.NET には reCAPTCHA というツールが実装されていますが、今日、これが動かなくなっていることに気がつきました。

reCAPTCHA のスクリプトエラー

reCAPTCHA に関係するコードは一切いじってないのに、上の画像のように Recaptcha が定義されてないというスクリプトエラーが出ます。

この Recaptcha の定義は、Google のサーバーからダウンロードする recaptcha_ajax.js という外部スクリプトファイルに含まれています。

このスクリプトファイルの URL を直接ブラウザのアドレスバーに入力して要求をかけてみると HTTP 404(見つからない)エラーになります。

最初は Google が reCAPTCHA サービスをやめたのかと思いましたが、そうではなくてスクリプトファイルを提供するサーバーの URL が変わったのが原因でした。

変更前: http://api.recaptcha.net/js/recaptcha_ajax.js
変更後: http://www.google.com/recaptcha/api/js/recaptcha_ajax.js

ユーザー登録してあるのに Google から予告はなかったと思うのですが・・・ Google のサイトの Displaying reCAPTCHA Without Plugins を見ると確かに URL は変更後のものになってますが、後出しなんじゃないかと・・・

11 月の初旬にはこの問題が stachoverflow などに報告されていますので、自分は 2 週間ぐらい問題に気がつかなかったようです。(汗)

実は、ネットサーフィン時に不出来なサイト(?)で多発するスクリプトエラーがわずらわしいので IE のオプション設定で[スクリプトのデバッグを使用しない]にチェックを入れてました。そうすると上の画像のようなエラーメッセージは出ませんから。

原因が分かれば修正するのは簡単ですので早速対応しました。

この URL は以下のファイルの RecaptchaControl という名前の Web カスタムコントロールの中にハードコーディングされてます。

\App_Code\Extensions\Recaptcha\RecaptchaControl.cs

URL を web.config の AppSettings に設定するのがよさそうだとは一瞬思いましたが、面倒なのでハードコーディングした部分のみを修正して解決しました。(笑)

Tags:

BlogEngine.NET

reCaptcha が動かなくなりました

by WebSurfer 2010年6月20日 13:22

先のエントリ WP-Cumulus(3) で書きましたように、Widget の Tagcloud に WP-Cumulus を導入しましたが、その後 reCaptcha が表示されなくなっているのに気がつきました。

調べてみると、reCaptcha を表示するための JavaScript で、「'Recaptcha' は宣言されていません。」というエラーが出ています。

Widget の Tagcloud の WP-Cumulus を動かすため、Flash Player を起動する JavaScript を追加しましたが(詳しくは WP-Cumulus(3) を参照)、原因はどうやらこれと reCaptcha を起動するするスクリプトとの相性のようです。

WP-Cumulus の Flash Player 用の JavaScript を、reCaptcha 用の JavaScript より先に起動すれば問題はないのですが、逆だとダメでした(Widget の Tagcloud に WP-Cumulus を表示しようとすると、どうしても逆になってしまいます)。

タイミングの問題かと思って、setTimeout を使って reCaptcha 用の JavaScript の起動を遅らせてみたんですが、同じ結果でした。

BlogEngine の App_Code\Extensions\Recaptcha\RecaptchaControl.cs の中で、reCaptcha 本家のサイトからスクリプトをダウンロードしてくる設定になっています(下記参照)。"宣言されていません" というエラーになる Recaptcha はその中に定義されています。

<script type="text/javascript" src="http://api.recaptcha.net/js/recaptcha_ajax.js" defer="defer">

理由は全く不明ですが、recaptcha_ajax.js をダウンロードしてローカルに置いて、ローカルのファイルを参照するように変更したら、エラーは出なくなりました。

具体的には、RecaptchaControl.cs の中の RenderContents メソッドで、以下のように変更しました。

//output.AddAttribute("src", "http://api.recaptcha.net/js/recaptcha_ajax.js");
output.AddAttribute("src", "/BlogEngine/recaptcha_ajax.js");

本当にこれだけで問題解決になっているかイマイチ疑問ですが(汗)、とりあえずこのまま様子を見るつもりです。

***************** 2010/6/23 追記 *****************

やっぱり上記の処置では問題解決になっていませんでした。(涙)

reCaptcha を管理している google のサイトによると、recaptcha_ajax.js をダウンロードして自サーバーに置くのは、"Caching the reCAPTCHA javascript increases the risk that we might accidentally break your site in an upgrade." という理由で好ましくないとのことです。やむを得ず元に戻して、reCaptcha のサーバーからダウンロードするようにしました。

でもそうすると、IE ではスクリプトエラーが出て reCaptcha が動かなくなってしまいます。script タグから defer 属性を削除するとエラーを回避できるので、そうしてみましたが、今度は表示の遅れが目立つようになってしまいました。その問題を解決するため(defer 属性をつけたままでもスクリプトエラーが出ないようにするため)、問題のスクリプトの位置を HTML コードの最後の方になるように変更しました。そのため、2010/6/23 現在、コードは上記とは異なりますのでご注意ください。詳しい話は後日別途ポストします。

Tags: ,

BlogEngine.NET

reCaptcha の実装

by WebSurfer 2010年5月25日 22:18
reCaptcha の実装

BlogEngine 1.6.1 で新機能として追加された reCaptcha を実装しました。

データのストアが DB で(XML ではなく)、かつ、reCaptcha の Logging を有効にしていると現れるバグがあって、解決に手間取��ましたので、そのあたりのことを備忘録として書いておきます。

匿名ユーザーがコメントを書き込もうとすると "Sorry, the following error occurred while processing your comment: コールバックでエラーが発生しました" というメッセージが出て書き込めないことでこの問題に気がつきました。

ググって調べてみると、CodePlex のサイトの Dicsussion のページで同じ問題の報告があって、バグがあることが分かりました。

問題は、以下の 2 つのファイルの中での LoadFromDataStore メソッドの戻り値の処置です。

  • \admin\Pages\RecaptchaLogViewer.aspx.cs
  • \App_Code\Extensions\Recaptcha\RecaptchaControl.cs

ストアが DB の場合は String 型、XML の場合は Stream 型として処置すべきところ、いずれも以下のように Stream 型として処置しているので、DB をストアに使用した場合にエラーとなります。

Stream s = (Stream)BlogService.LoadFromDataStore(BlogEngine.Core.DataStore.ExtensionType.Extension, "RecaptchaLog"); List<RecaptchaLogItem> log = new List<RecaptchaLogItem>(); if (s != null) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List)); log = (List<RecaptchaLogItem>)serializer.Deserialize(s); s.Close(); }

これを以下のように修正しました(CodePlex に出ていたコードと同じ内容です)。

string s = (string)BlogService.LoadFromDataStore(BlogEngine.Core.DataStore.ExtensionType.Extension, "RecaptchaLog"); List<RecaptchaLogItem> log = new List<RecaptchaLogItem>(); if (!String.IsNullOrEmpty(s)) { using (StringReader reader = new StringReader(s)) { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<RecaptchaLogItem>)); log = (List<RecaptchaLogItem>)serializer.Deserialize(reader); } }

BlogEngine.Core の中にある LoadFromDataStore メソッドの方を修正する手もありそうですが、それは止めた方がよさそうです。何故なら、旧版 (1.5) では MemoryStream に変換して return するようにしているのに 1.6.1 で意図的に止めているところを見ると、何らかの理由がありそうなので。

あと、何故、認証されたユーザーなら書き込めるかも調べてみました。理由は、デフォルトの設定では、認証ユーザーの場合 reCaptcha の Logging がスキップされるので、問題のコードに処理が飛ばないためでした。

上記の修正後は CodePlex の Documentation に書いてあったとおりの手順で簡単にインストールでき、とりあえず今のところ問題なく動いています。

でも、ただでさえメールアドレスの入力が面倒なのに、これでさらに面倒になって誰もコメントしてくれなくなってしまうかもしれませんね。(汗)

追伸1
reCaptcha の Key の取得で、登録したドメインでのみ有効するのと、Global Key といってドメインに関係させない 2 つのオプションがあります。取得できる Key の数に制限はないので、自分は、本番用に前者を、開発用に後者を取得して使っています。

追伸2
コントロールパネルで Status の Enabled/Disabled の切り替えを行うと、web.config を書き換えに行くように見えます。これはファイルの中身を書き換えているのではなく、単に timestamp を変更するだけで、その理由はアプリケーションをリサイクルするためだそうです。(最初、これが原因かと思いましたがそうではなかったです。)

Tags:

BlogEngine.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年3月  >>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar