プログラムから日本語ドメインのページにアクセスしたい
例として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ではなく)
読み方はプニコードかピュニコードです。なんか可愛い。
詳しい解説はサボってwikipediaの記事を見てもらうとします。
変換した結果のURLは
になります。
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を取得することができます。