Wikipedia の短縮 URL を取得するブックマークレットを作ってみた

Wikipedia には短縮 URL というか、ページ ID を指定して参照できる URL が用意されていることを知った。

たとえば「World Wide Web」のページの URL は以下のようになっている。

ココで左メニュー「ツール」内にある「ページ情報」を見ると、ページ ID : 2459 と書かれている。

上述の参考文献では、Wikipedia の API からページ情報を含む JSON データを取得してページ ID を取得するツールが公開されていたのだが、別の方法でページ ID を拾えないか調べてみた。

すると、当該ページのソース内に wgArticleId という名前で、ページ ID の情報が含まれていることが分かった。

<!-- ページ内のデータ抜粋 : 適宜改行を入れて整形している -->
<script>
(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({
  "wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"World_Wide_Web",
  
  // ページタイトルが見えた
  "wgTitle":"World Wide Web",
  
  "wgCurRevisionId":67280551,"wgRevisionId":67280551,
  
  // コレがページ ID!
  "wgArticleId":2459,
  
  "wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,
  // 以下略……
});
</script>

というワケで、この情報を引っこ抜いてきて短縮 URL を案内する JavaScript を組んでみた。

function getCurId() {
  // ページ ID が拾えたらこの変数に入れておく
  let id;
  
  // 「wgArticleId」情報は script 要素内に含まれているので、script 要素を探索する
  Array.prototype.forEach.call(document.querySelectorAll('script'), (script) => {
    const result = script.innerHTML.match(/wgArticleId.*?(\d+)/);
    // 'wgArticleId' の文字列の後ろに登場するページ ID を取得する
    if(result) {
      id = result[1];
    }
  });
  
  // ページ ID が拾えたらプロンプトで表示、拾えなければアラートを表示する
  if(id) {
    prompt('URL', 'https://ja.wikipedia.org/?curid=' + id);
  }
  else {
    alert('探索失敗');
  }
}

コレをブックマークレットとして使えるよう、オレオレ Uglify していく。

javascript:
((result, id) => {
  [].forEach.call(document.querySelectorAll('script'), (script) => {
    result = script.innerHTML.match(/wgArticleId.*?(\d+)/), id = id ? id : result ? result[1] : '';
  });
  id ? prompt('URL', 'https://ja.wikipedia.org/?curid=' + id) : alert('探索失敗');
})();

さらに変数を短縮。s => { } というアロー関数部分は、ブレースを省略すると上手くいかなかったので、ブレースを残した。

javascript:
((r,i)=>{
  [].forEach.call(document.querySelectorAll('script'),s=>{r=s.innerHTML.match(/wgArticleId.*?(\d+)/);i=i?i:r?r[1]:''});
  i?prompt('URL','https://ja.wikipedia.org/?curid='+i):alert('探索失敗')
})();

1行にまとめて完成。

javascript:((r,i)=>{[].forEach.call(document.querySelectorAll('script'),s=>{r=s.innerHTML.match(/wgArticleId.*?(\d+)/);i=i?i:r?r[1]:''});i?prompt('URL','https://ja.wikipedia.org/?curid='+i):alert('探索失敗')})();

ページ ID を取得する正規表現部分が怪しいが、現状とりあえずこれで動いている。