|
8 | 8 | from threading import Semaphore |
9 | 9 | from .prepare_reese84token import getReese84Token |
10 | 10 |
|
11 | | -s = sched.scheduler(time.time, time.sleep) |
12 | | -token_semaphore = Semaphore(1) |
13 | | -reese84_token = {} |
| 11 | +class Reese84TokenUpdating(): |
| 12 | + def __init__(self): |
| 13 | + self.is_running = False |
| 14 | + self.reese84_token = {} |
| 15 | + self.token_semaphore = Semaphore(0) |
| 16 | + self.scheduler = sched.scheduler(time.time, time.sleep) |
| 17 | + |
| 18 | + def initialize_reese84_token(self): |
| 19 | + """ |
| 20 | + This method should not be called directly. |
| 21 | + """ |
| 22 | + self.reese84_token = getReese84Token() |
| 23 | + self.token_semaphore.release() # produce a new token |
| 24 | + self.scheduler.enter(self.reese84_token['renewInSec'] - |
| 25 | + constants.TOKEN_RENEW_SEC_OFFSET, constants.TOKEN_RENEW_PRIORITY, self.renew_reese84_token) |
| 26 | + |
| 27 | + def renew_reese84_token(self): |
| 28 | + """ |
| 29 | + This method should not be called directly. |
| 30 | + """ |
| 31 | + self.token_semaphore.acquire() # invalidate a token |
| 32 | + self.reese84_token = getReese84Token() |
| 33 | + self.token_semaphore.release() |
| 34 | + self.scheduler.enter(self.reese84_token['renewInSec'] - |
| 35 | + constants.TOKEN_RENEW_SEC_OFFSET, constants.TOKEN_RENEW_PRIORITY, self.renew_reese84_token) |
| 36 | + |
| 37 | + def start(self): |
| 38 | + # if the scheduler is already started - do nothing |
| 39 | + if self.is_running: return |
| 40 | + self.is_running = True |
| 41 | + self.initialize_reese84_token() |
| 42 | + self.scheduler.run(False) |
14 | 43 |
|
15 | 44 |
|
16 | | -def obtainReese84Token(sch): |
17 | | - global reese84_token, token_semaphore |
18 | | - token_semaphore.acquire() |
19 | | - reese84_token = getReese84Token() |
20 | | - token_semaphore.release() |
21 | | - print(reese84_token) |
22 | | - sch.enter(reese84_token['renewInSec'] - |
23 | | - constants.TOKEN_RENEW_SEC_OFFSET, constants.TOKEN_RENEW_PRIORITY, obtainReese84Token, (sch,)) |
24 | 45 |
|
| 46 | +class TicketScraping(): |
| 47 | + def __init__(self, token_generator: Reese84TokenUpdating, event_id = constants.EVENT_ID, num_seats=2, price_range=(0, 200)): |
| 48 | + self.event_id = event_id |
| 49 | + self.num_seats = num_seats |
| 50 | + self.price_range = price_range |
| 51 | + self.token_gen = token_generator |
| 52 | + self.scheduler = sched.scheduler(time.time, time.sleep) |
| 53 | + self.is_running = False |
| 54 | + |
| 55 | + def ticket_scraping(self): |
| 56 | + if self.token_gen.token_semaphore._value <= 0: |
| 57 | + # retry after a delay |
| 58 | + self.scheduler.enter(constants.TICKET_SCRAPING_TOKEN_AWAIT_MAX_INTERVAL, |
| 59 | + constants.TICKET_SCRAPING_PRIORITY, self.ticket_scraping) |
| 60 | + return |
| 61 | + top_picks_url = constants.get_top_picks_url(self.event_id) |
| 62 | + top_picks_q_params = constants.get_top_picks_query_params( |
| 63 | + self.num_seats, self.price_range) |
| 64 | + top_picks_header = constants.get_top_picks_header() |
| 65 | + res = requests.get(top_picks_url, headers=top_picks_header, params=top_picks_q_params, |
| 66 | + cookies=dict(reese84=self.token_gen.reese84_token['token'])) |
| 67 | + print(res.json()) |
| 68 | + self.scheduler.enter(constants.TICKET_SCRAPING_INTERVAL, |
| 69 | + constants.TICKET_SCRAPING_PRIORITY, self.ticket_scraping) |
| 70 | + |
| 71 | + def start(self): |
| 72 | + # if the scheduler is already started - do nothing |
| 73 | + if self.is_running: |
| 74 | + return |
| 75 | + self.is_running = True |
| 76 | + self.ticket_scraping() |
| 77 | + self.scheduler.run(False) |
25 | 78 |
|
26 | | -def ticket_scraping(sch): |
27 | | - global reese84_token, token_semaphore |
28 | | - token_semaphore.acquire() |
29 | | - top_picks_url = constants.get_top_picks_url(constants.EVENT_ID) |
30 | | - top_picks_q_params_str = constants.get_top_picks_query_params_str(2, (0, 200)) |
31 | | - top_picks_url = top_picks_url + top_picks_q_params_str |
32 | | - top_picks_header = constants.get_top_picks_header() |
33 | | - res = requests.get(top_picks_url, headers=top_picks_header, |
34 | | - cookies=dict(reese84=reese84_token['token'])) |
35 | | - token_semaphore.release() |
36 | | - print(res.json()) |
37 | | - sch.enter(constants.TICKET_SCRAPING_INTERVAL, |
38 | | - constants.TICKET_SCRAPING_PRIORITY, ticket_scraping, (sch,)) |
39 | 79 |
|
40 | 80 | def start(): |
41 | | - obtainReese84Token(s) |
42 | | - ticket_scraping(s) |
43 | | - s.run() |
| 81 | + reese_token_gen = Reese84TokenUpdating() |
| 82 | + ticket_scraping = TicketScraping(reese_token_gen) |
| 83 | + reese_token_gen.start() |
| 84 | + ticket_scraping.start() |
0 commit comments