Пример #1
0
def input_userdata_in_login(cfg, cookies, headers, form_data):
    """
    ログインページでユーザーIDとパスワード、セキュリティ番号を入力し、マイページに移動する
    """
    global http_req_num
    # headers = {
    #     'Origin': cfg['origin_url'],
    #     'Referer': cfg['mypindex_url'],
    #     'Content-Type': 'application/x-www-form-urlencoded',
    #     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    # }
    _form_data = form_data
    # ユーザーIDとパスワード、セキュリティ番号を入力する
    _form_data['layoutChildBody:childForm:userid'] = cfg['userid']
    _form_data['layoutChildBody:childForm:passwd'] = cfg['password']
    _form_data['layoutChildBody:childForm:securityno'] = cfg['securityid']
    # フォームデータからPOSTリクエストに含めるフォームデータをURLエンコードする
    params = urllib.parse.urlencode(form_data)
    # フォームデータを使って、マイページを表示する
    response = requests.post(cfg['mypindex_url'],
                             headers=headers,
                             cookies=cookies,
                             data=params)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'mypage.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    # ログインしたことによりcookieが再発行されるので、cookiesを更新する
    cookies[cfg['cookie_name_01']] = response.cookies.get(
        cfg['cookie_name_01'])
    # 次のPOSTリクエストのためにヘッダーを作成する
    headers['Referer'] = f'{response.url}'
    return cookies, headers, response
def go_to_confirm_reserve(cfg, headers, cookies, response):
    """
    前のページに戻り、申込に進むをクリックする
    """
    global http_req_num
    # ヘッダー情報
    headers['Referer'] = cfg['day_search_url']
    # フォームデータを取得する
    _form_data = get_common_formdata(response)
    # フォームデータの不要部分を削除する
    del _form_data['WeeklyAkiListCtrl$FilteringButton']
    del _form_data['WeeklyAkiListCtrl$PrevWeekImgBtn']
    del _form_data['WeeklyAkiListCtrl$PrevDayImgBtn']
    del _form_data['WeeklyAkiListCtrl$NextDayImgBtn']
    del _form_data['WeeklyAkiListCtrl$NextWeekImgBtn']
    del _form_data['WeeklyAkiListCtrl$NextMonImgBtn']
    del _form_data['WeeklyAkiListCtrl$ModoruButton']
    del _form_data['CartUC$RegistButton2']
    #print(json.dumps(_form_data, indent=2, ensure_ascii=False))
    # 予約をクリックする
    response = requests.post(cfg['day_search_url'], headers=headers, cookies=cookies, data=_form_data)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'confirm_reserve_court.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    return response
def go_to_reserve(cfg, headers, cookies, wanttime, response):
    """
    希望時間帯にチェックを入れて、予約内容の入力へをクリックする
    """
    global http_req_num
    # ヘッダー情報
    headers['Referer'] = cfg['reserve_url']
    # フォームデータを取得する
    _form_data = get_common_formdata(response)
    # フォームデータの不要部分を削除する
    del _form_data['TimeSelectCtrl$PrevWeekImgBtn']
    del _form_data['TimeSelectCtrl$PrevDayImgBtn']
    del _form_data['TimeSelectCtrl$NextDayImgBtn']
    del _form_data['TimeSelectCtrl$NextWeekImgBtn']
    del _form_data['ReturnButton']
    # 希望時間帯にチェックを入れる
    ## 希望時間帯からPOSTに使うフォームデータを作成する
    # 06:00~08:00とゼロ埋め4桁なのでこれを600:800:1にする
    _stime = int(wanttime.split('~')[0].replace(':', ''))
    _etime =int(wanttime.split('~')[1].replace(':', ''))
    _time = str(_stime) + ':' + str(_etime) + ':1'
    _form_data['YoyakuCB'] = str(_time)
    #print(json.dumps(_form_data, indent=2, ensure_ascii=False))
    # 予約のチェックを入れて、予約内容の入力へをクリックする
    response = requests.post(cfg['reserve_url'], headers=headers, cookies=cookies, data=_form_data)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'reserve_court.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    return response
Пример #4
0
def login_request(cfg, cookies, form_data):
    """
    トップページの「ログインする」ボタンをクリックして、ログインページを表示する
    """
    global http_req_num
    # 直前のリクエストURLからRefererを含んだヘッダーを生成する
    headers = {
        'Origin': cfg['origin_url'],
        'Referer': cfg['first_url'],
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    # フォームデータからPOSTリクエストに含めるフォームデータをURLエンコードする
    params = urllib.parse.urlencode(form_data)
    #print(headers)
    #print(cookies)
    #print(params)
    # フォームデータを使って、ログインページを表示する。リダイレクトを許可する
    response = requests.post(cfg['first_url'], headers=headers, cookies=cookies, data=params, allow_redirects=True)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'login.html'
    #print(_file_name)
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    #print(response.url)
    # 次のPOSTリクエストのためにヘッダーを作成する
    headers['Referer'] = f'{response.url}'
    return headers, response
def do_login_and_get_cookie(cfg, headers, cookies):
    """
    ログインし、ログイン後のcookieを取得する
    このcookieを以後、利用していく
    """
    global http_req_num
    # ヘッダー情報を作成する
    headers['Referer'] =  cfg['second_url']
    print(f'headers: {headers}')
    print(f'cookies: {cookies}')
    # ログインボタンをクリックする
    response = requests.get(cfg['login_url'], headers=headers, cookies=cookies)
    http_req_num += 1
    # レスポンスURLを取得する
    print(f'response url: {response.url}')
    hash_url = response.url
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'login.html'
    #print(_file_name)
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    # ログイン画面のフォームデータを取得する
    _form_data = get_common_formdata(response)
    # フォームデータを加工する
    ## 不要なフォームデータを削除する
    del _form_data['LoginInputUC$LoginImgButton']
    del _form_data['LoginInputUC$ReturnImgButton']
    del _form_data['id_nflag']
    ## ユーザーIDとパスワードをセットする
    _form_data['LoginInputUC$UserIdTextBox'] = cfg['userid']
    _form_data['LoginInputUC$PasswordTextBox'] = cfg['password']
    ## LoginInputUC$LoginImgButton.x, LoginInputUC$LoginImgButton.y に値を設定する
    _form_data['LoginInputUC$LoginImgButton.x'] = '30'
    _form_data['LoginInputUC$LoginImgButton.y'] = '26'
    ## id_nflag を 1 にする
    _form_data['id_nflag'] = '1'
    print(json.dumps(_form_data, indent=2, ensure_ascii=False))
    # ログインする
    ## ヘッダー情報を設定する
    headers['Referer'] = hash_url
    response = requests.post(hash_url, headers=headers, cookies=cookies)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'done_login.html'
    #print(_file_name)
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    ## 認証後のcookieを取得する
    print(f'cookies: {response.cookies}')
    return None
def go_to_date_court(cfg, headers, cookies, _param):
    """
    指定年月日のコートの空き状況ページに移動する
    """
    global http_req_num
    # URLを生成する
    _url = cfg['day_search_url'] + str(_param)
    #print(f'url: {_url}')
    #print(f'headers: {headers}')
    #print(f'cookies: {cookies}')
    response = requests.get(_url, headers=headers, cookies=cookies)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'search_court.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    # 予約希望時間にチェックを入れて、予約内容
    return response
def done_reserve(cfg, headers, cookies, response):
    """
    予約申込画面で、予約するをクリックする
    """
    global http_req_num
    # ヘッダー情報
    headers['Referer'] = cfg['result_reserve_url']
    # フォームデータを取得する
    _form_data = get_common_formdata(response)
    # フォームデータの不要部分を削除する
    del _form_data['ToYoyakuChangeButton1']
    del _form_data['ToYoyakuChangeButton2']
    del _form_data['CancelButton']
    #print(json.dumps(_form_data, indent=2, ensure_ascii=False))
    # 予約をクリックする
    response = requests.post(cfg['result_reserve_url'], headers=headers, cookies=cookies, data=_form_data)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_reserve_court.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    return response
def go_to_input_reserve(cfg, headers, cookies, response):
    """
    利用者数を入力し、予約カゴに登録をクリックする
    """
    global http_req_num
    # ヘッダー情報
    headers['Referer'] = cfg['input_reserve_url']
    # フォームデータを取得する
    _form_data = get_common_formdata(response)
    # フォームデータの不要部分を削除する
    del _form_data['CancelButton']
    # 人数と目的を入力する。205はテニス
    _form_data['ItemInputCtrl$NinzuuTotalTextBox'] = 4
    _form_data['ItemInputCtrl$UseClassDropDownList'] = 205
    #print(json.dumps(_form_data, indent=2, ensure_ascii=False))
    # 予約をクリックする
    response = requests.post(cfg['input_reserve_url'], headers=headers, cookies=cookies, data=_form_data)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'input_reserve_court.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    return response
Пример #9
0
def search_next_empty_reserves_from_emptystate(cfg, cookies, headers, form_data):
    """
    利用日時と利用目的、地域を入力して空き予約を検索する
    """
    global http_req_num
    global page_unit
    # フォームデータから年月日と開始時間を取得する
    datetime = []
    datetime.append(str(form_data['layoutChildBody:childForm:year']))
    datetime.append(str(form_data['layoutChildBody:childForm:month']))
    datetime.append(str(form_data['layoutChildBody:childForm:day']))
    datetime.append(str(form_data['layoutChildBody:childForm:stime']))
    datetime.append(str(form_data['layoutChildBody:childForm:offset']))
    # フォームデータを変更する
    # doPagerの値をsubmitに変更する
    form_data['layoutChildBody:childForm:doPager'] = 'submit'
    # 不要なフォームデータを削除する
    ## 「予約カートに追加」を削除する
    for _index in range(page_unit - 1):
        index_string_doAddCart = f'layoutChildBody:childForm:rsvEmptyStateItems:{_index}:doAddCart'
        #print(f'delete formdata: {index_string_doAddCart}')
        del form_data[f'{index_string_doAddCart}']
    # 「予約カートの内容を確認」を削除する
    del form_data['layoutChildBody:childForm:jumpRsvCartList']
    #print(form_data)
    # フォームデータからPOSTリクエストに含めるフォームデータをURLエンコードする
    params = urllib.parse.urlencode(form_data)
    # フォームデータを使って、空き予約を検索する
    response = requests.post(cfg['empty_state_url'], headers=headers, cookies=cookies, data=params)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _datetime_string = str(datetime[0]) + str(datetime[1]).zfill(2) + str(datetime[2]).zfill(2) + str(datetime[3]).zfill(2) + str(datetime[4]).zfill(2)
    _file_name = f'result_{_datetime_string}.html'
    #print(_file_name)
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    # レスポンスを返す
    return response
Пример #10
0
def go_to_search_date_menu(cfg, cookies, headers):
    """
    施設の空き状況検索の利用日時からのリンクをクリックして、検索画面に移動する
    """
    global http_req_num
    headers = {
        'Host':
        'www.fureai-net.city.kawasaki.jp',
        'Referer':
        headers['Referer'],
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    # クッキーにユーザーIDを追加する
    cookies[cfg['cookie_name_04']] = str(cfg['userid'])
    response = requests.get(cfg['search_url'],
                            headers=headers,
                            cookies=cookies)
    http_req_num += 1
    #print(res.text)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'rsvDateSearch.html'
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    return response
Пример #11
0
def search_empty_reserves_from_datesearch(cfg, cookies, form_data, date, time,
                                          reserves_list):
    """
    利用日時と利用目的、地域を入力して空き予約を検索する
    date : string: YYYYMMDD
    time : string: hh:mm-hh:mm
    """
    global http_req_num
    # 入力用年月日データを初期化する
    _datetime = []
    # 入力値のdate, timeを検索パラメータに変換する
    # 引数で受け取った年月日と時間帯のデータを代入する
    _datetime.append(int(date[0:4]))
    _datetime.append(int(date[4:6]))
    _datetime.append(int(date[6:8]))
    _datetime.append(int(time[0:2]))
    _datetime.append(int(time[3:5]))
    _datetime.append(int(time[6:8]))
    _datetime.append(int(time[9:11]))
    # 検索する時間が予約時間帯リストの何番目かを取得する
    tzone_index = tzone.index(_datetime[3])
    # 直前のリクエストURLからRefererを含んだヘッダーを生成する
    headers = {
        'Origin':
        cfg['origin_url'],
        'Referer':
        cfg['search_url'],
        'Content-Type':
        'application/x-www-form-urlencoded',
        'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    # 利用目的を取得し、フォームデータに代入する
    form_data['layoutChildBody:childForm:purpose'] = cfg['selected_purpose']
    # 検索対象地域を取得、フォームデータに代入する
    for _area in cfg['selected_areas']:
        form_data['layoutChildBody:childForm:area'] = cfg['selected_areas']
    # rsvDateSearchページの検索ボタンの値を代入する
    form_data['layoutChildBody:childForm:doDateSearch'] = '上記の内容で検索する'
    # 空き状況カレンダーの日付リンク(doChangeDate, rsvEmptyStateページ)の値を代入する
    #for _datetime in datetime_list:
    # フォームデータの検索日時データを生成する
    form_data['layoutChildBody:childForm:year'] = _datetime[0]
    form_data['layoutChildBody:childForm:month'] = _datetime[1]
    form_data['layoutChildBody:childForm:day'] = _datetime[2]
    form_data['layoutChildBody:childForm:sHour'] = _datetime[3]
    form_data['layoutChildBody:childForm:sMinute'] = _datetime[4]
    form_data['layoutChildBody:childForm:eHour'] = _datetime[5]
    form_data['layoutChildBody:childForm:eMinute'] = _datetime[6]
    #print(form_data)
    # フォームデータからPOSTリクエストに含めるフォームデータをURLエンコードする
    params = urllib.parse.urlencode(form_data)
    # フォームデータを使って、空き予約を検索する
    response = requests.post(cfg['search_url'],
                             headers=headers,
                             cookies=cookies,
                             data=params)
    #after_cookies = response.cookies
    #print(f'before_cookies: {cookies}')
    #print(f'after_cookies: {after_cookies}')
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _datetime_string = str(_datetime[0]) + str(_datetime[1]).zfill(2) + str(
        _datetime[2]).zfill(2) + str(_datetime[3]).zfill(2) + str(
            _datetime[4]).zfill(2)
    _file_name = f'result_{_datetime_string}.html'
    #print(_file_name)
    _file = reserve_tools.save_html_to_filename(response, _file_name)
    # HTML解析を実行して、発見した空き予約を予約リストに追加する
    # analyze_html(cfg, cookies, _datetime, res, reserves_list)
    # 次のリクエストでレスポンスヘッダーのLocationの値をRefererとして使うため、これを取得する
    #_location_url = response.history[0].url
    _location_url = response.url
    #print(f'Location Url: {_location_url}')
    headers['Referer'] = f'{_location_url}'
    # 空き予約コートページのフォームデータと空き施設名、空きコート名を取得する
    (rsv_form_data, court_list) = get_formdata_rsvEmptyState(response)
    # 空き予約を予約カートに追加する
    added_response = add_reserve_to_cart(cfg, cookies, headers, rsv_form_data,
                                         court_list, tzone_index)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_add_reserve_{_datetime_string}.html'
    _file = reserve_tools.save_html_to_filename(added_response, _file_name)
    # 予約をカートに追加済みのフォームデータを取得する
    (added_form_data,
     added_court_list) = get_formdata_rsvEmptyState(added_response)
    # 予約カートの内容を確認する
    cart_response = display_reserve_cart(cfg, cookies, headers,
                                         added_form_data, court_list)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_cart_reserve_{_datetime_string}.html'
    _file = reserve_tools.save_html_to_filename(cart_response, _file_name)
    # 予約カートのフォームを取得する
    cart_form_data = get_formdata_rsvCartList(cart_response)
    # 「予約確定の手続きへ」ボタンをクリックして、予約確定の手続きをする
    reserve_response = doing_reserve(cfg, cookies, headers, cart_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_do_reserve_{_datetime_string}.html'
    _file = reserve_tools.save_html_to_filename(reserve_response, _file_name)
    # 予約施設の確認内容のフォームデータを取得する
    reserve_form_data = get_formdata_rsvCartDetails(reserve_response)
    # 「予約内容を確認する」ボタンをクリックする
    input_response = input_reserve(cfg, cookies, headers, reserve_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_input_reserve_{_datetime_string}.html'
    _file = reserve_tools.save_html_to_filename(input_response, _file_name)
    # フォームデータを取得する
    confirm_form_data = get_formdata_rsvCartInputDetailsConfirm(input_response)
    # 「予約確定」ボタンをクリックする
    confirm_response = confirm_reserve(cfg, cookies, headers,
                                       confirm_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_confirm_reserve_{_datetime_string}.html'
    _file = reserve_tools.save_html_to_filename(input_response, _file_name)
    # 予約番号を取得する

    #checked_form_data = checked_reserve(cfg, added_form_data, court_list, tzone_index)
    # 予約カートを表示する
    #response = display_reserve_court(cfg, cookies, headers, checked_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    #_datetime_string = str(_datetime[0]) + str(_datetime[1]).zfill(2) + str(_datetime[2]).zfill(2) + str(_datetime[3]).zfill(2) + str(_datetime[4]).zfill(2)
    #_file_name = f'result_cart_{_datetime_string}.html'
    #print(_file_name)
    #_file = reserve_tools.save_html_to_filename(response, _file_name)
    # 空き予約リストを返す
    return reserves_list
Пример #12
0
def do_reserves_from_datesearch(cfg, cookies, form_data, date, time):
    """
    利用日時と利用目的、地域を入力して空き予約を検索する
    date : string: YYYYMMDD
    time : string: hh:mm-hh:mm
    """
    global http_req_num
    # 入力用年月日データを初期化する
    _datetime = []
    # 入力値のdate, timeを検索パラメータに変換する
    # 引数で受け取った年月日と時間帯のデータを代入する
    _datetime.append(int(date[0:4]))
    _datetime.append(int(date[4:6]))
    _datetime.append(int(date[6:8]))
    _datetime.append(int(time[0:2]))
    _datetime.append(int(time[3:5]))
    _datetime.append(int(time[6:8]))
    _datetime.append(int(time[9:11]))
    # 検索する時間が予約時間帯リストの何番目かを取得する
    tzone_index = tzone.index(_datetime[3])
    # 直前のリクエストURLからRefererを含んだヘッダーを生成する
    headers = {
        'Origin': cfg['origin_url'],
        'Referer': cfg['search_url'],
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    }
    # 利用目的を取得し、フォームデータに代入する
    form_data['layoutChildBody:childForm:purpose'] = cfg['selected_purpose']
    # 検索対象地域を取得、フォームデータに代入する
    for _area in cfg['selected_areas']:
        form_data['layoutChildBody:childForm:area'] = cfg['selected_areas']
    # rsvDateSearchページの検索ボタンの値を代入する
    form_data['layoutChildBody:childForm:doDateSearch'] = '上記の内容で検索する'
    # 空き状況カレンダーの日付リンク(doChangeDate, rsvEmptyStateページ)の値を代入する
    #for _datetime in datetime_list:
    # フォームデータの検索日時データを生成する
    form_data['layoutChildBody:childForm:year'] = _datetime[0]
    form_data['layoutChildBody:childForm:month'] = _datetime[1]
    form_data['layoutChildBody:childForm:day'] = _datetime[2]
    form_data['layoutChildBody:childForm:sHour'] = _datetime[3]
    form_data['layoutChildBody:childForm:sMinute'] = _datetime[4]
    form_data['layoutChildBody:childForm:eHour'] = _datetime[5]
    form_data['layoutChildBody:childForm:eMinute'] = _datetime[6]
    #print(form_data)
    # フォームデータからPOSTリクエストに含めるフォームデータをURLエンコードする
    params = urllib.parse.urlencode(form_data)
    # フォームデータを使って、空き予約を検索する
    response = requests.post(cfg['search_url'], headers=headers, cookies=cookies, data=params)
    http_req_num += 1
    # デバッグ用としてhtmlファイルとして保存する
    _datetime_string = str(_datetime[0]) + str(_datetime[1]).zfill(2) + str(_datetime[2]).zfill(2) + str(_datetime[3]).zfill(2) + str(_datetime[4]).zfill(2)
    _file_name = f'result_{_datetime_string}.html'
    reserve_tools.save_html_to_filename(response, _file_name)
    # 次のリクエストでレスポンスヘッダーのURLの値をRefererとして使うため、これを取得する
    _location_url = response.url
    headers['Referer'] = f'{_location_url}'
    # 空き予約コートページのフォームデータと空き施設名、空きコート名を取得する
    ( rsv_form_data, court_list ) = get_formdata_rsvEmptyState(response)
    # 空き予約を予約カートに追加し、フォームデータと追加した空き施設名と空きコート名を取得する
    ( added_response, court, matched_flag ) = add_reserve_to_cart(cfg, cookies, headers, rsv_form_data, court_list, tzone_index)
    # 空き予約コートが希望日・時間帯・施設名に一致したフラッグを確認し、False(一致しない)ならreturnを返す
    if matched_flag == False:
        reserved_number = None
        reserve = None
        return reserved_number, reserve
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_add_reserve_{_datetime_string}.html'
    reserve_tools.save_html_to_filename(added_response, _file_name)
    # 予約をカートに追加済みのフォームデータを取得する
    ( added_form_data, court_list ) = get_formdata_rsvEmptyState(added_response)
    # 予約カートの内容を確認する
    cart_response = display_reserve_cart(cfg, cookies, headers, added_form_data, court_list)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_cart_reserve_{_datetime_string}.html'
    reserve_tools.save_html_to_filename(cart_response, _file_name)
    # 予約カートのフォームを取得する
    cart_form_data = get_formdata_rsvCartList(cart_response)
    # 「予約確定の手続きへ」ボタンをクリックして、予約確定の手続きをする
    reserve_response = doing_reserve(cfg, cookies, headers, cart_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_do_reserve_{_datetime_string}.html'
    reserve_tools.save_html_to_filename(reserve_response, _file_name)
    # 予約施設の確認内容のフォームデータを取得する
    reserve_form_data = get_formdata_rsvCartDetails(reserve_response)
    # 「予約内容を確認する」ボタンをクリックする
    input_response = input_reserve(cfg, cookies, headers, reserve_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_input_reserve_{_datetime_string}.html'
    reserve_tools.save_html_to_filename(input_response, _file_name)
    # フォームデータを取得する
    confirm_form_data = get_formdata_rsvCartInputDetailsConfirm(input_response)
    # 「予約確定」ボタンをクリックする
    confirm_response = confirm_reserve(cfg, cookies, headers, confirm_form_data)
    # デバッグ用としてhtmlファイルとして保存する
    _file_name = f'result_confirm_reserve_{_datetime_string}.html'
    reserve_tools.save_html_to_filename(confirm_response, _file_name)
    # 予約番号を取得する
    ( reserved_number_form_data, reserved_number ) = get_confirmed_reserve_number(confirm_response)
    # 予約した年月日と時間をキー、空き施設名/コート名を値としたdictを作成する
    reserve = {}
    reserve[date] = {}
    reserve[date][time] = [ court ]
    # 予約番号と予約した日時とコートを返す
    #print(f'reserved number: {reserved_number}')
    #print(f'reserve datetime and court: {reserve}')
    return reserved_number, reserve