• JSRをスクレイピングする時のコツ


    リンクカードを実装する時にJSRだけ上手く情報を取得できなかったので、その解決方法を書いていく。

    JSRにリクエストを送る時はacceptヘッダーを付ける

    これが全て。

    JSRではhttps://jsr.io/@std/assert/meta.jsonのように、ドキュメントのURLの末尾にmeta.jsonを付けると、そのモジュールのメタデータが取れる。

    つまり、curl https://jsr.io/@std/assert/meta.json | jq '.name'なりすればブラウザを開かなくてもモジュールの情報を取得できる。

    ただ、このノリでドキュメントのHTMLを取ろうとすると404が返却される。

    curl https://jsr.io/@std/assert
    404 - Not Found⏎

    これを解決するには、acceptヘッダーを指定してやる必要がある。

    curl https://jsr.io/@std/assert -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'

    このブログでも、linkcardの取得時にoriginがJSRの場合のみこのヘッダーを付加してリクエストを飛ばす処理が含まれている。

    const resp = await fetch(req, {
      headers: isJSR
        ? {
          ...header,
          "accept":
            "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        }
        : header,
      signal: AbortSignal.timeout(timeout),
    });

    この挙動はバグとして報告されているので、近い将来修正されるかもしれない。