なんじゃくにっき

プログラミングの話題中心。

日本語ドメインにプログラムからアクセスする方法

プログラムから日本語ドメインのページにアクセスしたい

例としてRuby、HTTPクライアントとしてFaradayを使ってみます。

アクセス先のドメインは"日本語.jp”にします

https://日本語.jp/

まずはそのまま日本語ドメインでGET

素の日本語ドメイン名でGETしてみます。

$ gem install faraday
$ irb

irb(REPL)を立ち上げて

irb(main):001> require 'faraday'
irb(main):002> Faraday.get('https://日本語.jp')

おもむろにGET。

/hogehoge/.anyenv/envs/rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/uri-0.13.0/lib/uri/rfc3986_parser.rb:84:in `split': URI must be ascii only "https://\u65E5\u672C\u8A9E.jp" (URI::InvalidURIError)

エラーになります。

URIにはascii文字以外使えませんと言われます。そらそーや。

Punycode

日本語ドメインのURLのドメイン部分の符号化は、Punycodeを使う必要があります。(Base64ではなく)

読み方はプニコードかピュニコードです。なんか可愛い。

Punycode - Wikipedia

詳しい解説はサボってwikipediaの記事を見てもらうとします。

変換した結果のURLは

https://xn--wgv71a119e.jp/

になります。

Ruby

Ruby日本語ドメインからpunycodeに変換するにはsimpleidnというgemを使います

$ gem install 'simpleidn'
require 'faraday'
require 'simpleidn'

url = SimpleIDN.to_ascii('https://https://日本語.jp')
res = Faraday.get(url)

Python

Pythonだとそのままの名前のpunycodeというライブラリがあります

$ pip install punycode
import punycode 

domain = punycode.convert("日本語.jp")
req = urllib.request.Request("https://" + domain)
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
    body = res.read()
print(body)

Chrome

ちなみにChrome Developer Tool使ってるとNetworkタブから該当のリクエストを選んで"Copy as url"でpunycode化されたURLを取得することができます。