Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

BASIC認証のログインIDが文字化けする。

実現したいこと:
BASIC認証のあるHPにログインしたい。
ユーザーID:ABCD#002
パスワード:abcd1abcd

試したこと:
Seleniumとwebdriver(chrome ver84.0.4147.125)を使用し、driver.get('https://ユーザーID:パスワード@ログインurl')でログインを試みた。

結果:
ipアドレスのサーバーが見つからなかった。urlを見ると、大文字で入力しているはずのユーザーID(ABCD#002)が"abcd/#002"に文字化けしている。
fujiedi02.png

知りたいこと:
ネットで調べると#が文字化けの原因でURLエンコード?が必要らしいが、
具体的にコードでどう書けばいいのかわかりません。

       
使用しているコード:
(IDLE3.8.3で記述)
from selenium import webdriver

driver = webdriver.Chrome("パス")
driver.get('https://ABCD#002:abcd1abcd@ログインurl')

0 likes

1Answer

使用しているプログラミング言語は Python ですか? Python であれば,urllib.parse.quote 関数が使えます

from urllib.parse import quote
id = quote('ABCD#002')
print(id) #=> ABCD%23002

なぜ URL encode が必要かと言うと,# という文字が URL の中で特別な意味を持つからです.たとえば https://www.example.com/foo#bar という URL なら,「https://www.example.com/foo というページの #bar という場所」を表します.#barアンカーと呼ばれます.

質問にある URL https://ABCD#002:abcd1abcd@ログインurl なら,「https://ABCD というページの #002:abcd1abcd@ログインurl という場所」です.ただし,https://ABCD は自動的に https://ABCD/ と解釈され(正規化),また ABCD というドメインは abcd と変換される(case insensitivity)ので,https://abcd/#002:abcd1abcd@ログインurl になってしまうわけです.#002:abcd1abcd@ログインurl はアンカーです.

これは本来期待する動作ではありませんね.# はアンカーを示す記号ではなく,ユーザ ID の一部として認識してほしいのです.そういう場合には,# を URL encode することで「# はアンカーを示す記号ではなく # という文字そのもの」ということをブラウザ等に教える必要があります.ではどうやって「# という文字そのもの」を表すかというと,#%23 に変換してあげます.パーセントエンコードという別名の由来ですね.23# の ASCII コードです.

幸いにして,ほとんどのプログラミング言語では URL encode のための関数が用意してあります.Python なら,冒頭に揚げた urllib.parse.quote です.(URL encode の関数はいくつかバリエーションがあるので注意は必要です.)サンプルコードとしては,

from urllib.parse import quote

id = 'ABCD#002'
pw = 'abcd1abcd'

# ケース 1
url = 'https://' + quote(id) + ':' + quote(pw) + '@ログインurl'

# ケース 2
url = 'https://' + quote(id + ':' + pw, ':') + '@ログインurl'

ケース 1 とケース 2 はどちらでも動作します.詳しくは各自で調べてみてください.

1Like

Comments

  1. @takaekokaz

    Questioner

    Naughieさま
    URLエンコードについて丁寧に教えていただき、本当にありがとうございました。
    urllib.parse.quoteを用いてケース1のコードを当てはめてみたところ、ベーシック認証からログインできました。

    本当にありがとうございました。

Your answer might help someone💌