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
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
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
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
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
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