11
11
import re
12
12
import sys
13
13
import argparse
14
+ from playwright_recaptcha import recaptchav2
15
+ # sys.path.append(r"D:\dev\python\resy-project\ffmpeg\bin")
14
16
15
17
current = os .path .dirname (os .path .realpath (__file__ ))
16
18
parent = os .path .dirname (current )
17
19
sys .path .append (parent )
18
20
from settings import CLOSE_MESSAGE
19
-
20
21
load_dotenv ('settings.env' )
21
22
email = os .getenv ('RESY_EMAIL' )
22
23
password = os .getenv ('RESY_PASSWORD' )
23
24
# PW_TEST_SCREENSHOT_NO_FONTS_READY = 1
24
25
headless = True if os .getenv ('HEADLESS' ) == 'yes' else False
25
26
# headless = True if HEADLESS == 'yes' else False
27
+ ccnumber = os .getenv ('CCNUMBER' )
28
+ cccvv = os .getenv ('CCCVV' )
29
+ ccexpiry = os .getenv ('CCEXPIRY' )
30
+ cczipcode = os .getenv ('CCZIPCODE' )
31
+ cccountry = os .getenv ('CCCOUNTRY' )
26
32
logging .basicConfig (filename = 'bot.log' , filemode = 'w' , level = logging .INFO , format = '%(asctime)s - %(levelname)s - %(filename)s - %(lineno)d - %(message)s' )
27
33
28
34
def login_to_resy (page , email , password ):
@@ -59,20 +65,42 @@ def reserve_restaurant(page, selected_reservation):
59
65
selected_reservation .click ()
60
66
frame_element = page .wait_for_selector ('iframe[title="Resy - Book Now"]' , timeout = 10000 )
61
67
frame = frame_element .content_frame ()
62
- frame .wait_for_selector ('[data-test-id="order_summary_page-button-book"]' , timeout = 30000 )
63
68
# time.sleep(2)
64
69
for i in range (5 ):
65
70
page .mouse .wheel (0 , 15000 )
66
71
time .sleep (1 )
67
72
# page.evaluate("() => window.scrollTo(0, document.body.scrollHeight)")
73
+ frame .wait_for_selector ('[data-test-id="order_summary_page-button-book"]' , timeout = 30000 )
68
74
frame .query_selector ('[data-test-id="order_summary_page-button-book"]' ).click ()
69
75
time .sleep (5 )
70
76
if frame .query_selector ('.StripeForm__header' ):
71
- message = frame .query_selector ('.StripeForm__header' ).inner_text ().split ('\n ' )[0 ]
72
- logging .info (message )
73
- input (" " .join ([message , CLOSE_MESSAGE ]))
74
- sys .exit ()
75
-
77
+ frame_element = frame .wait_for_selector ('iframe[title="Secure payment input frame"]' , timeout = 10000 )
78
+ frame = frame_element .content_frame ()
79
+ frame .fill ('input[id="Field-numberInput"]' , ccnumber )
80
+ frame .fill ('input[id="Field-expiryInput"]' , ccexpiry )
81
+ frame .fill ('input[id="Field-cvcInput"]' , cccvv )
82
+ frame .select_option ('select#Field-countryInput' , value = cccountry )
83
+ frame .fill ('input[id="Field-postalCodeInput"]' , cczipcode )
84
+ # frame_element = frame.wait_for_selector('iframe[title="reCAPTCHA"]', timeout=10000)
85
+ # breakpoint()
86
+ with recaptchav2 .SyncSolver (page ) as solver :
87
+ token = solver .solve_recaptcha (wait = True )
88
+ # print(token)
89
+ # breakpoint()
90
+ time .sleep (2 )
91
+ for i in range (5 ):
92
+ page .mouse .wheel (0 , 15000 )
93
+ time .sleep (1 )
94
+ frame_element = page .wait_for_selector ('iframe[title="Resy - Book Now"]' , timeout = 10000 )
95
+ frame = frame_element .content_frame ()
96
+ frame .wait_for_selector ('[data-test-id="StripeAddCardForm-submit-button"]' , timeout = 5000 )
97
+ frame .query_selector ('[data-test-id="StripeAddCardForm-submit-button"]' ).click ()
98
+
99
+ # message = frame.query_selector('.StripeForm__header').inner_text().split('\n')[0]
100
+ # logging.info(message)
101
+ # input(" ".join([message, CLOSE_MESSAGE]))
102
+ # sys.exit()
103
+ frame .wait_for_selector ('.ConfirmationPage__header' , timeout = 120000 )
76
104
confirmation_message = frame .query_selector ('.ConfirmationPage__header' ).inner_text ()
77
105
message1 = f"Reservation confirmation message: { confirmation_message } "
78
106
message2 = "Reservation confirmed."
@@ -119,7 +147,7 @@ def main():
119
147
# 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0'
120
148
# More user agents can be added here
121
149
]
122
-
150
+ chrome_user_data = r"D:\dev\python\resy-project\chrome_profiles"
123
151
while True :
124
152
try :
125
153
user_agent = random .choice (user_agents )
@@ -133,28 +161,43 @@ def main():
133
161
wargs .append ('--disable-popup-blocking' )
134
162
wargs .append ('--disable-web-security' )
135
163
wargs .append ('--start-maximized' )
164
+ # wargs.append("user-data-dir={}".format(chrome_user_data))
165
+ # wargs.append("profile-directory={}".format("default"))
136
166
137
167
138
- browser = pr .chromium .launch (headless = headless , args = wargs )
168
+ # browser = pr.chromium.launch(headless=headless, args=wargs)
169
+ # breakpoint()
170
+ browser = pr .chromium .launch_persistent_context (user_data_dir = chrome_user_data ,
171
+ headless = headless ,
172
+ args = wargs ,
173
+ user_agent = user_agent ,
174
+ permissions = ['geolocation' , 'notifications' ],
175
+ java_script_enabled = True ,
176
+ no_viewport = True
177
+ )
178
+
139
179
proxy_server = "http://kpeqkzlp:[email protected] :5868"
180
+
181
+ # context = browser.new_context(
182
+ # user_agent=user_agent,
183
+ # # viewport={'width': random.randint(1200, 1920), 'height': random.randint(900, 1080)},
184
+ # # viewport={'width': 1920, 'height': 1080},
185
+ # permissions=['geolocation', 'notifications'],
186
+ # java_script_enabled=True,
187
+ # no_viewport=True,
188
+ # # bypass_csp=True,
189
+ # # locale='US_en',
190
+ # # geolocation=False,
191
+ # #proxy = {
192
+ # #'server': proxy_server
193
+ # #}
194
+ # )
140
195
141
- context = browser .new_context (
142
- user_agent = user_agent ,
143
- # viewport={'width': random.randint(1200, 1920), 'height': random.randint(900, 1080)},
144
- # viewport={'width': 1920, 'height': 1080},
145
- permissions = ['geolocation' , 'notifications' ],
146
- java_script_enabled = True ,
147
- no_viewport = True ,
148
- # bypass_csp=True,
149
- # locale='US_en',
150
- # geolocation=False,
151
- #proxy = {
152
- #'server': proxy_server
153
- #}
154
- )
155
- page = context .new_page ()
196
+ # breakpoint()
197
+ # page = context.new_page()
198
+ page = browser .pages [0 ]
156
199
stealth_sync (page )
157
-
200
+
158
201
page .on ("console" , lambda msg : logging .debug (f"PAGE LOG: { msg .text } " ))
159
202
page .on ("pageerror" , lambda msg : logging .error (f"PAGE ERROR: { msg } " ))
160
203
page .on ("response" , lambda response : logging .debug (f"RESPONSE: { response .url } { response .status } " ))
@@ -165,10 +208,13 @@ def main():
165
208
166
209
page .goto ("https://resy.com" , wait_until = 'domcontentloaded' , timeout = 20000 )
167
210
random_delay (2 , 5 )
168
- login_to_resy (page , email , password )
169
- message = "Logged in successfully."
170
- logging .info (message )
171
- print (message )
211
+ # breakpoint()
212
+ if page .query_selector ('button.Button--login' ):
213
+ login_to_resy (page , email , password )
214
+ message = "Logged in successfully."
215
+ logging .info (message )
216
+ print (message )
217
+
172
218
random_delay (2 , 5 )
173
219
# breakpoint()
174
220
page .goto (restaurant_link , wait_until = 'domcontentloaded' )
0 commit comments