現在、サイトのあるページがHTTPS化されているかどうかをチェックするプログラムを作成しています。
自分は一度以下のような形で試してみたのですが、ある疑問点にぶつかり他の方法を探している状況です。
※input_url
は入力フォームから受け取ったURLになります。
parsed_url = urlparse(input_url) # スキーム取得 access_url_scheme = parsed_url.scheme if access_url_scheme == "http": replace_scheme_url = input_url.replace("http", "https", 1) ssl_check = requests.get(replace_scheme_url) if type(ssl_check) is not dict: try: ssl_check.raise_for_status() except requests.exceptions.HTTPError: # ステータスコードが200番台以外の場合 print('ssl化されていません')
こちらのコードの問題点ですが、https://
から始まるページへアクセスし返ってきたステータスコードが仮に500
番台であった場合はSSL化されていないのではなく、サーバーエラーなどでサーバーが落ちてしまっているだけであり、実際はSSL化されている可能性は十分にあるという点です。
その為、あるページがSSL化されているかどうかをもう少し正確にチェックしたいと考えています。
他に方法などありましたら、ご助言頂けましたら幸いです。
追記です。
requests.get
を使用せずに、以下の関数を作成し、https化されていないページに対してリクエストを送ってみた所 except ssl.SSLError:
こちらの例外は捕捉されず、print("ステータスコード: ", response.status_code)
こちらの行が出力され、「404」と表示されました。
def check_ssl_certification(targetURL, waitsec_from=1, waitsec_to=3): err_msg = {} headers = { "User-Agent": ( "Mozilla/5.0 (X11; Linux x86_64; rv:57.0)" "Gecko/20100101 Firefox/57.0" ) } session = requests.Session() # retries = Retry(total=1, # リトライ回数 # backoff_factor=1, # sleep時間(リトライするごとに待機時間を指定した秒数加算する) # status_forcelist=[500, 502, 503, 504],raise_on_status=False) # timeout以外でリトライするステータスコード """ Session.mount(prefix, adapter) はこのセッションで行う URL が prefix で始まる HTTP 通信に対して、 アダプター adapter を設定する関数。 prefix="https://" の場合、URL が https:// で始まるすべての通信が対象 """ # session.mount("https://", HTTPAdapter(max_retries=retries)) # session.mount("http://", HTTPAdapter(max_retries=retries)) try: # print('ok') response = session.get( url=targetURL, headers=headers, stream=True, timeout=(20.0, 30.0) ) except ssl.SSLError: print("SSL認証エラー") except requests.exceptions.ConnectTimeout: print("タイムアウトしました。") err_msg["connection_timeout"] = "ホストへの接続に失敗しました。" except requests.exceptions.ConnectionError as e: print("ホストが見つかりませんでした(https)", e) err_msg["no_host"] = "ホストが見つかりませんでした。" return response # HTTP ステータスコードが 4xx と 5xx の場合は urllib.error.HTTPError 例外が投げられる except requests.exceptions.HTTPError as e: print(e.response.status_code) # except requests.exceptions.RetryError: # print('再試行制限に到達しました') except requests.exceptions.ReadTimeout as e: print("requests.exceptions.ReadTimeoutエラー : ", e) except requests.exceptions.TooManyRedirects as e: print("エラー: ", e) else: print("ステータスコード: ", response.status_code) return response return err_msg
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/15 10:59
2021/06/15 11:15
2021/06/15 11:51
2021/06/16 02:04
2021/06/16 02:22 編集
2021/06/16 02:26
2021/06/16 02:26
2021/06/16 02:34
2021/06/16 02:44 編集
2021/06/16 02:48
2021/06/16 02:50
2021/06/16 04:26
2021/06/16 04:32
2021/06/16 05:34 編集
2021/06/16 05:39
2021/06/16 06:28 編集
2021/06/16 06:27