summaryrefslogtreecommitdiff
path: root/ami.py
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-11-09 21:02:06 -0800
committerFuwn <[email protected]>2024-11-09 21:02:06 -0800
commit8d2182a08097fbf330c995b6876e949f4bf42d4b (patch)
tree66c39ef3b75fc88ccd46e6193a6abb0ca969be79 /ami.py
downloadami-8d2182a08097fbf330c995b6876e949f4bf42d4b.tar.xz
ami-8d2182a08097fbf330c995b6876e949f4bf42d4b.zip
feat: initial release
Diffstat (limited to 'ami.py')
-rw-r--r--ami.py194
1 files changed, 194 insertions, 0 deletions
diff --git a/ami.py b/ami.py
new file mode 100644
index 0000000..cac4c33
--- /dev/null
+++ b/ami.py
@@ -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)