diff options
| author | Fuwn <[email protected]> | 2024-11-09 21:02:06 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-11-09 21:02:06 -0800 |
| commit | 8d2182a08097fbf330c995b6876e949f4bf42d4b (patch) | |
| tree | 66c39ef3b75fc88ccd46e6193a6abb0ca969be79 /ami.py | |
| download | ami-8d2182a08097fbf330c995b6876e949f4bf42d4b.tar.xz ami-8d2182a08097fbf330c995b6876e949f4bf42d4b.zip | |
feat: initial release
Diffstat (limited to 'ami.py')
| -rw-r--r-- | ami.py | 194 |
1 files changed, 194 insertions, 0 deletions
@@ -0,0 +1,194 @@ +#!/usr/bin/env python3 + +import graphqlclient +from os import environ +import dotenv +import tabulate +import json +import time +import requests +from datetime import datetime, timedelta + +dotenv.load_dotenv() + +client = graphqlclient.GraphQLClient(environ.get("API")) +locale = environ.get("LOCALE") + +client.inject_token(environ.get("AUTHORIZATION"), "authorization") + +city = environ.get("CITY") + + +def log_response(data): + with open("jobs.json", "a") as log_file: + json.dump({"timestamp": datetime.now().isoformat(), "data": data}, log_file) + log_file.write("\n") + + +def notify(title, body, job_id=None): + options = { + "body": body, + "title": title, + "icon": "https://media.discordapp.net/stickers/860824030617272350.webp?size=160&quality=lossless", + } + + if job_id is not None: + options["url"] = ( + f"https://hiring.amazon.com/app#/jobDetail?jobId={job_id}&locale={locale}" + ) + options["level"] = "timeSensitive" + + response = requests.post( + f"https://api.day.app/{environ.get('BARK_KEY')}/", + headers={"Content-Type": "application/json; charset=utf-8"}, + json=options, + ) + + return response.status_code, response.text + + +def print_job_table(): + json_api_data = json.loads( + client.execute( + """ + query searchJobCardsByLocation($searchJobRequest: SearchJobRequest!) { + searchJobCardsByLocation(searchJobRequest: $searchJobRequest) { + nextToken + jobCards { + jobId + language + dataSource + requisitionType + jobTitle + jobType + employmentType + city + state + postalCode + locationName + totalPayRateMin + totalPayRateMax + tagLine + bannerText + image + jobPreviewVideo + distance + featuredJob + bonusJob + bonusPay + scheduleCount + currencyCode + geoClusterDescription + surgePay + jobTypeL10N + employmentTypeL10N + bonusPayL10N + surgePayL10N + totalPayRateMinL10N + totalPayRateMaxL10N + distanceL10N + monthlyBasePayMin + monthlyBasePayMinL10N + monthlyBasePayMax + monthlyBasePayMaxL10N + jobContainerJobMetaL1 + virtualLocation + poolingEnabled + __typename + } + __typename + } + } + """, + { + "searchJobRequest": { + "locale": locale, + "country": environ.get("COUNTRY"), + "keyWords": environ.get("KEYWORDS"), + "equalFilters": [ + {"key": "shiftType", "val": environ.get("SHIFT_TYPE")}, + {"key": "scheduleRequiredLanguage", "val": locale}, + ], + "containFilters": [ + # {"key": "city", "val": environ.get("CITIES")}, + {"key": "state", "val": [environ.get("STATE")]}, + {"key": "isPrivateSchedule", "val": ["false"]}, + ], + "rangeFilters": [ + {"key": "hoursPerWeek", "range": {"minimum": 0, "maximum": 80}} + ], + "orFilters": [], + "dateFilters": [ + { + "key": "firstDayOnSite", + "range": { + "startDate": ( + datetime.now() + timedelta(days=1) + ).strftime("%Y-%m-%d") + }, + } + ], + "sorters": [], + "pageSize": 100, + "geoQueryClause": { + "lat": environ.get("LATITUDE"), + "lng": environ.get("LONGITUDE"), + "unit": environ.get("DISTANCE_UNIT"), + "distance": environ.get("DISTANCE"), + }, + "consolidateSchedule": True, + } + }, + ) + ) + + log_response(json_api_data) + + table_data = [] + + for job in json_api_data["data"]["searchJobCardsByLocation"]["jobCards"]: + table_data.append( + [ + job["jobId"], + job["jobTitle"], + job["city"], + job["state"], + f"${job['totalPayRateMin']} to ${job['totalPayRateMax']} {job['currencyCode']}", + job["employmentTypeL10N"], + job["distanceL10N"], + ] + ) + + print( + tabulate.tabulate( + table_data, + headers=[ + "Job ID", + "Title", + "City", + "State", + "Pay Rate", + "Employment Type", + "Distance (mi)", + ], + tablefmt="fancy_grid", + ) + ) + + for job in json_api_data["data"]["searchJobCardsByLocation"]["jobCards"]: + if job["city"] == city: + notify( + f"Found job in {city}", + f"Job ID: {job['jobId']}\nTitle: {job['jobTitle']}\nCity: {job['city']}\nState: {job['state']}\nPay Rate: ${job['totalPayRateMin']} to ${job['totalPayRateMax']} {job['currencyCode']}\nEmployment Type: {job['employmentTypeL10N']}\nDistance: {job['distanceL10N']}", + job["jobId"], + ) + + break + + +while True: + print_job_table() + + interval_string = environ.get("INTERVAL") + + time.sleep(int(interval_string) if interval_string is not None else 60) |