├── 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 |
87 |
88 |
89 |
90 |
91 |
92 |
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 |
--------------------------------------------------------------------------------