Googleアラート編輯時に誤った言語コードを送ってしまう不具合を修正する

もうかれこれ1年も前に書いたことの続き。Googleアラートの編輯をする時、その編輯画面自体のURLが例えば

http://www.google.com/alerts/manage?hl=en

とかになっていると、英語以外の言語で作ったアラートまで 一度編輯したが最後hl=enに書き換えられてしまってちゃんとニュースが拾えなくなる。

こういう事が何故起きるか。例えば「百人斬り」とかでアラートを作ってあるとして、それを

このように編輯しに行ったとする。当該行のソースのうち、table要素関連のタグを取り除いてフォームに関係するところだけ抜粋すると

1	<form action="/alerts/save?hl=en#idEA(中略)X8" method="post">
2		<input name="q" value="百人斬り" size="30" maxlength="2048" type="text">
3		<select name="t">
4			<option value="1" selected="selected">News</option>
5			<option value="2">Web</option>
6			<option value="3">News &amp; Web</option>
7			<option value="8">Groups</option>
8		</select>
9		<select name="f">
10			<option value="1" selected="selected">once a day </option>
11			<option value="0">as-it-happens </option>
12			<option value="6">once a week</option>
13		</select>
14		<input value="Save" type="submit">
15		<input name="ce" value="Cancel" type="submit">
16	</form>

と、1行目のformタグのactionhl=enになっている。これがいけない。Google先生が初めから此処をhl=jaにしておいてくれれば何も問題は起きない筈。


で、ここを正しい値(上の「百人斬り」の例の場合はhl=ja)に書き換えてやるGMスクリプトを書きたい。初めは上の編輯フォームを含む頁(http://www.google.com/alerts/edit?hl=...)そのものに適用するスクリプトを書こうとしていて、そのせいでhl=...の正しい値を何処から持って来ようかと悩んでいたのだけれども、実はそんな必要は全然無かった。編輯前の状態(全アラートの管理頁:http://www.google.com/alerts/manage?...)中の "edit" リンクのhref属性値に出て来るhl=...部分を書き換えてしまえば正しい編輯フォームを生成してくれる。

全アラートの管理頁(上図)の当該行のソースから、同様にtable関連のタグを取り除くと、

1	<a href="http://news.google.com/news?ie=utf8&amp;oe=utf8&amp;q=%E7%99%BE%E4%BA%BA%E6%96%AC%E3%82%8A&amp;hl=ja">百人斬り</a>
	    :
2	<a href="/alerts/edit?hl=en&amp;s=EA(中略)X8" onmouseover="return ss('');">edit</a>
3	<a href="/alerts/remove?hl=en&amp;s=EA(中略)X8" onclick='return del("Do you want to delete [ 百人斬り ]?","/alerts/remove?hl=en&s=EA(中略)X8#idEA(中略)X8")' onmouseover="return ss('');">delete</a>

と、1行目のhl=jaだけ合っていて2行目と3行目は間違っている。此処で2行目のqueryを1行目のと同じ値に書き換えてやれば、前述の編輯フォームが初めから正しい値で生成されてくれるのではと思い試してみる。結果的にはこれで万事解決した。

// ==UserScript==
// @name           GoogleAlert::LangBugFix
// @namespace      http://d.hatena.ne.jp/a6m5/
// @description    Fix the invalid language-code values of 'hl' queries in the links to alert edit pages
// @include        http://www.google.co*/alerts/manage*
// ==/UserScript==

(function(){

var anchors = document.getElementsByTagName('a');
var correct_lang;
var tmp;

for (n=0; n<anchors.length; n++) {
	if (anchors[n].href.match(/^http:\/\/(?:www|news|groups)\.google\.co.+\/(?:search|news|groups)\?.+(?:lr=lang_|hl=)([^\&]+)(\&?)/)) {
		correct_lang = RegExp.$1;
		tmp = anchors[n+1].href.replace(/hl=[^\&]+/, 'hl=' + correct_lang);
		anchors[n+1].href=tmp;
	}
}

})();

各アラートへのリンクを見つけるチェックだけ少しうるさめにやって、その直後にはeditへのリンクがあるものと仮定してしまっているのが乱暴といえば乱暴だけれども、まぁ実用上差し支えないからいいや。あと、各アラートへのリンクでwebサーチの時だけはqueryがhl=jaではなくlr=lang_jaという形なので注意すること。

あと、"edit" リンクだけいじって "delete" のほうは面倒臭いからそのままにしてある。deleteのほうのhl=...は「アラートを削除しますか」という問い合わせのダイアログをナニ語で表示するか決めているだけで、日本語ニュースのアラートを消そうとする時に問い合わせが英語で出たりしても別段不都合は無いから。

ついでだが、元の管理頁を例えば英語表示(hl=en)にしている状態で日本語ニュースのアラートを編輯しに行き、何もせずにCancelボタンで戻ると、さっきの編輯頁からhl=jaを持って帰って来るため、それ以後 管理頁そのものが日本語表示になってしまう。マヌケといえばマヌケだけれども、これも実用上は別段差し支えないから放っておく。