├── info1.py ├── README.md └── easyuse.py /info1.py: -------------------------------------------------------------------------------- 1 | # 电话 2 | PhoneNo = "8613657193975" 3 | # 手机号 4 | HpNo = "18888888888" 5 | # 微信号 6 | WeChatID = "13657193975" 7 | # 信用卡号 8 | credit_card = "6217002650010971111" 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # interpark-ticketing 2 | A ticket-purchasing script in globalinterpark.com on GoogleChrome(originally written for a friend) 3 | 4 | for those who have bought tickets this website before 5 | 6 | # usage 7 | 1. download chromedriver and put it in the same directory as chrome.exe 8 | 2. edit info1.py and input your information 9 | 3. open GoogleChrome by "chrome.exe --remote-debugging-port=9222" 10 | 4. log in on the globalinterpark.com website as a normal human 11 | 5. find your target concert and copy its web page url 12 | 6. run easyuse.py by "python easyuse.py 'your target url'" 13 | -------------------------------------------------------------------------------- /easyuse.py: -------------------------------------------------------------------------------- 1 | # VPN 2 | # 增加计时 3 | # 从列表选择 4 | # 支持多人 5 | # 侧边分区无判断余票 6 | # 谷歌浏览器 7 | import re 8 | import sys 9 | from selenium import webdriver 10 | import time 11 | from selenium.webdriver.common.by import By 12 | from selenium.webdriver.support.wait import WebDriverWait 13 | from selenium.webdriver.support import expected_conditions as EC 14 | from info1 import * 15 | 16 | target_url = "" 17 | 18 | 19 | def Booking(): 20 | # 点击预订 21 | while True: 22 | time.sleep(0.1) 23 | try: 24 | driver.find_element(By.CSS_SELECTOR, 25 | 'body > div > div > div.wrap_Pinfo > div.bak > div.Py_Time > div.Date_Select > div.btn_Booking > img').click() 26 | handles = driver.window_handles 27 | if len(handles) > 1: 28 | wait = WebDriverWait(driver, 1) # 等待最多10秒 29 | wait.until(EC.presence_of_element_located((By.TAG_NAME, "body"))) 30 | driver.switch_to.window(handles[1]) 31 | if driver.current_url != 'https://gpoticket.globalinterpark.com/Global/Play/Book/BookMain.asp' and not driver.current_url.startswith("https://tickets.interpark.com/"): 32 | driver.close() 33 | driver.switch_to.window(handles[0]) 34 | if driver.current_url != target_url: 35 | driver.get(target_url) 36 | else: 37 | break 38 | except: 39 | pass 40 | index = 1 41 | while True: 42 | current_url = driver.current_url 43 | if not current_url.startswith("https://tickets.interpark.com/"): 44 | Date() 45 | while True: 46 | driver.switch_to.frame("ifrmSeat") 47 | div_element = driver.find_element(By.ID, "divRecaptchaWrap") 48 | display_style = driver.execute_script("return document.getElementById('divRecaptchaWrap').style.display;") 49 | if display_style == "none": 50 | driver.switch_to.parent_frame() 51 | break 52 | else: 53 | driver.switch_to.parent_frame() 54 | time.sleep(1) 55 | ChooseSeat() 56 | Price() 57 | InputInfo() 58 | Pay() 59 | break 60 | else: 61 | print(f"等待中({index})") 62 | index += 1 63 | time.sleep(2) 64 | 65 | 66 | def Date(): 67 | while True: 68 | time.sleep(0.1) 69 | try: 70 | driver.switch_to.frame("ifrmBookStep") 71 | driver.find_elements(By.ID, 'CellPlayDate')[0].click() 72 | break 73 | except: 74 | driver.switch_to.parent_frame() 75 | driver.switch_to.parent_frame() 76 | while True: 77 | try: 78 | driver.find_element(By.ID, 'LargeNextBtnImage').click() 79 | break 80 | except: 81 | time.sleep(0.1) 82 | 83 | 84 | def ChooseSeat(): 85 | """ 86 | 007Side 87 | 88 | 208Side 89 | 90 | 91 | 004Side 92 | 207Side
 93 | [Seating P] 100 seat(s) 95 | 96 | /html/body/table/tbody/tr/td/span[3] 97 | /html/body/table/tbody/tr/td/span[8] 98 | //*[@id="TmgsTable"]/tbody/tr/td/map/area[23] 99 | //*[@id="TmgsTable"]/tbody/tr/td/table[2]/tbody/tr/td/map/area[6] 100 | /html/body/table/tbody/tr/td/table[2]/tbody/tr/td/map/area[6] 101 | //*[@id="TmgsTable"]/tbody/tr/td/map[1]/area[25] 102 | /html/body/table/tbody/tr/td/map[1]/area[25] 103 | 104 | 105 | 106 | """ 107 | ifbreak = False 108 | while True: 109 | time.sleep(0.1) 110 | try: 111 | driver.switch_to.frame("ifrmSeat") 112 | side_selects = driver.find_elements(By.XPATH, "//span[@class='select']") 113 | for area in side_selects: 114 | match = re.search(r'(\d+)\s*seat\b', area.text) 115 | if match: 116 | seats = int(match.group(1)) 117 | if seats > 0: 118 | area.click() 119 | while True: 120 | try: 121 | driver.find_element(By.XPATH, "//a[contains(@href, 'javascript:fnBlockSeatUpdate')]").click() 122 | break 123 | except: 124 | time.sleep(0.1) 125 | while True: 126 | try: 127 | driver.switch_to.frame("ifrmSeatDetail") 128 | available = driver.find_elements(By.XPATH, "//span[@class='SeatN']") 129 | if len(available) > 0: 130 | available[0].click() 131 | ifbreak = True 132 | break 133 | except: 134 | driver.switch_to.parent_frame() 135 | time.sleep(0.2) 136 | if ifbreak: 137 | break 138 | if ifbreak: 139 | break 140 | else: 141 | print("oops!票已被抢光") 142 | sys.exit(0) 143 | except: 144 | pass 145 | driver.switch_to.parent_frame() 146 | driver.find_element(By.ID, "NextStepImage").click() 147 | time.sleep(0.2) 148 | 149 | 150 | # 选择价格 151 | def Price(): 152 | while True: 153 | try: 154 | driver.switch_to.parent_frame() 155 | driver.switch_to.frame("ifrmBookStep") 156 | select = driver.find_element(By.NAME, "SeatCount") 157 | select.find_element(By.XPATH, ".//option[@value='1']").click() 158 | driver.switch_to.parent_frame() 159 | driver.find_element(By.ID, "SmallNextBtnImage").click() 160 | break 161 | except: 162 | time.sleep(0.1) 163 | 164 | 165 | def InputInfo(): 166 | """ 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | """ 176 | while True: 177 | try: 178 | driver.switch_to.parent_frame() 179 | driver.switch_to.frame("ifrmBookStep") 180 | driver.find_element(By.ID, "PhoneNo").send_keys(PhoneNo) 181 | select_element = driver.find_element(By.ID, "SNSChannel") 182 | from selenium.webdriver.support.ui import Select 183 | select = Select(select_element) 184 | select.select_by_visible_text("WeChat") 185 | driver.find_element(By.ID, "SNSID").send_keys(WeChatID) 186 | # 下一步 187 | driver.switch_to.parent_frame() 188 | driver.find_element(By.ID, "SmallNextBtnImage").click() 189 | break 190 | except: 191 | time.sleep(0.1) 192 | 193 | 194 | def Pay(): 195 | while True: 196 | try: 197 | driver.find_element(By.ID, "SmallNextBtnImage").click() 198 | break 199 | except: 200 | time.sleep(0.1) 201 | while True: 202 | try: 203 | driver.switch_to.frame("ifrmBookStep") 204 | driver.find_element(By.ID, "CancelAgree").click() 205 | driver.find_element(By.ID, "CancelAgree2").click() 206 | driver.switch_to.parent_frame() 207 | driver.find_element(By.ID, "LargeNextBtnImage").click() 208 | break 209 | except: 210 | time.sleep(0.1) 211 | 212 | handle = None 213 | while True: 214 | time.sleep(0.2) 215 | handles = driver.window_handles 216 | if len(handles) == 3: 217 | handle = handles[-1] 218 | break 219 | driver.switch_to.window(handle) 220 | while True: 221 | try: 222 | driver.find_element(By.XPATH, "//span[./img[@alt='UnionPay']]").click() 223 | driver.find_element(By.ID, "unioncardnoTmp").send_keys(credit_card) 224 | driver.find_element(By.ID, "btnNext").click() 225 | break 226 | except: 227 | time.sleep(0.1) 228 | 229 | 230 | if __name__ == '__main__': 231 | args = sys.argv 232 | target_url = args[1] 233 | # 浏览器配置对象 234 | options = webdriver.ChromeOptions() 235 | options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") 236 | 237 | # 打开浏览器 238 | driver = webdriver.Chrome(options=options) 239 | driver.get(target_url) 240 | times = 0 241 | while True: 242 | try: 243 | driver.switch_to.frame("product_detail_area") 244 | bookingGuide = driver.find_elements(By.XPATH, "//*[@id='bookingGuideLayer']/button") 245 | if bookingGuide: 246 | bookingGuide[0].click() 247 | driver.find_element(By.CSS_SELECTOR, 248 | 'body > div > div > div.wrap_Pinfo > div.bak > div.Py_Time > div.Date_Select > div.btn_Booking > img') 249 | break 250 | except: 251 | time.sleep(0.2) 252 | times += 1 253 | if times >= 100: 254 | times = 0 255 | print("尚未开票,刷新页面") 256 | driver.refresh() 257 | Booking() 258 | --------------------------------------------------------------------------------