[+] Availability v2

This commit is contained in:
Hykilpikonna
2022-03-03 02:17:15 -05:00
parent b1263c84af
commit ad5707e7f6
+39 -3
View File
@@ -3,6 +3,7 @@ from dataclasses import dataclass
from html import unescape from html import unescape
from urllib.parse import unquote from urllib.parse import unquote
import requests
from selenium.webdriver import Chrome from selenium.webdriver import Chrome
from selenium.webdriver.chrome.webdriver import WebDriver from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
@@ -10,14 +11,49 @@ from selenium.webdriver.common.by import By
from utils import CSS from utils import CSS
@dataclass @dataclass()
class AvailableStore: class AvailableStore:
loc: str loc: str
avail: str avail: str
n: int n: int
def get_availability(browser: WebDriver, url: str): @dataclass()
class AvailableStoreV2(AvailableStore):
loc_key: str
fulfillment_key: str
def get_avail_v2(url: str, postal='M5H1N1') -> list[AvailableStore]:
sku = int(url.split('/')[-1])
params = {
'accept': 'application/vnd.bestbuy.standardproduct.v1+json',
'accept-language': 'en-CA',
'locations': '977|203|931|62|617|927|965|57|938|237|943|932|956|202|200|937|926|795|916|233|544|910|954|207|930|622|223|245|925|985|990|959|949|942',
'postalCode': postal,
'skus': sku
}
headers = {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"98\", \"Google Chrome\";v=\"98\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"macOS\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36',
"referer": url,
}
r = requests.get('https://www.bestbuy.ca/ecomm-api/availability/products', params=params, headers=headers)
o = r.json()['availabilities'][0]['pickup']['locations']
return [AvailableStoreV2(loc['name'], str(loc['quantityOnHand']), loc['quantityOnHand'], loc['locationKey'], loc['fulfillmentKey'])
for loc in o if loc['quantityOnHand'] > 0]
def get_availability(browser: WebDriver, url: str) -> list[AvailableStore]:
browser.get(url) browser.get(url)
# Get stores element # Get stores element
@@ -36,7 +72,7 @@ def get_availability(browser: WebDriver, url: str):
result = [] result = []
for store in stores: for store in stores:
loc = unescape(store.find_element(CSS, '[data-automation="pickup-store-list-item-store-name"]').get_attribute('innerHTML').strip()) loc = unescape(store.find_element(CSS, '[data-automation="pickup-store-list-item-store-name"]').get_attribute('innerHTML').strip())
avail = store.find_elements(By.XPATH, '//*[@data-automation="pickup-store-list-item-reserve-button"]/following-sibling::span/following-sibling::span') avail = store.find_elements(By.XPATH, './/*[@data-automation="pickup-store-list-item-reserve-button"]/following-sibling::span/following-sibling::span')
if not avail: if not avail:
avail = 'Available' avail = 'Available'