UT SSL-VPNを便利に使うブックマークレット
UT specificな話題で恐縮ですが、学生向けに大学が提供しているSSL-VPN Gatewayというサービスがあります。これを利用すると外部から学内ネットワーク経由でウェブを閲覧することができ、出版社のページから本来学内からしか利用できない論文のフルテキストを取得したり、その他、大学が契約しているデータベースを自宅から利用することができます。コロナ禍で大学へ行く機会が減少している今では特に役立つ便利サービスかと思います。
ただ、このサービス、使いにくい点がありました。プロキシ外の世界から中の世界に直接移動する手段がなく、毎回サービスにログインしてポータルサイトから望みのサイトへリンクを辿る必要があったのでした。例えば、ウェブを彷徨っていてたまたま見つけたこの論文の本文を読みたい、という時、いちいちサービスへログインして(使いにくい)ポータルサイトからPubMedなどのデータベースに移動し、再度望みの論文を検索し、出版社のページにアクセスする、という手順を踏んでいたのです。
この一手間が地味に面倒だったので、今閲覧しているページをSSL-VPN Gateway経由に飛ばすブックマークレット(懐かしい響きです!)を作ってみました。これで論文収集が捗りますね!(ただし、読むとは言っていない。)
javascript:void(location.href.indexOf(',DanaInfo=') !== -1 ? null : (location.href = 'https://gateway2.itc.u-tokyo.ac.jp/'+ (location.pathname.lastIndexOf('/') !== -1 ? location.pathname.substring(1, location.pathname.lastIndexOf('/')+1) : '') + ',DanaInfo=' + location.hostname + (location.protocol === 'https:' ? ',SSL+' : '+') + (location.pathname.lastIndexOf('/') !== -1 ? location.pathname.substring(location.pathname.lastIndexOf('/')+1) : '') + location.search))
これをブラウザのお気に入りに登録しておき、出版社の論文ページなどを開いた状態でこのブックマークレットを起動すると、同じページをUTのSSL-VPN Gateway経由で開くことができます。サービスに未ログインの場合はログイン画面が表示されて、ログイン後にもとのページにリダイレクトされます。すでにGateway経由でアクセスしている場合は何も起きません。
何をしているの?
やっていることは現在のURLをSSL-VPN Gatewayの変形規則に合わせて書き換えて、リダイレクトしているだけです。
Gatewayを通して閲覧するとhtmlのリンクがGatewayを通すように書き換えられているので、これと元のURLとを対照させることで、変形規則を類推できます。例えば、もとのURLがhttps://{domain}/{dirnames}/{filename}{query}
としたら、rewrite後のURLはhttps://gateway2.itc.u-tokyo.ac.jp/{dirnames}/,DanaInfo={domain},SSL+{filename}{query}
のようになっています。それぞれが空文字列のケースや(今となっては殆どないですが)SSLを使っていない場合なども確認して、実際の挙動に合わせてあります。
手元でいくつか試した限り正常に動作していますが、クエリ文字列のエスケープなどは何も考慮していないのでひょっとするとコーナーケースで失敗するかも知れません…。不具合に気づいたらご連絡をいただければ修正したいと思います。
Bookmarkletって一時期流行ったけど今はすっかり廃れてしまったイメージがありましたが、開いているページに対してこういう単純なjavascriptを実行するには、例えばブラウザの拡張機能を作ったり、Greasemonkeyのようないわゆるuserscriptを使ったりするよりずっと簡便でよい方法だと思います。
それにしてもdirnameとfilenameが別の箇所に分かれていたり、謎のカンマがあったり、妙に複雑怪奇な書き換え規則になっているのは何故なんでしょうね…。例えば、海外の大学でよく採用されているEZProxyでは、多くの場合URL書き換えルールはhttps://proxy-host.org/login?url={source_url}
のように非常にシンプルになっているようなのですが。