Skip to content

Instantly share code, notes, and snippets.

@slicksammy
Created August 4, 2024 21:52
Show Gist options
  • Save slicksammy/611650d836a7b108b68cc51c55f9b9e0 to your computer and use it in GitHub Desktop.
Save slicksammy/611650d836a7b108b68cc51c55f9b9e0 to your computer and use it in GitHub Desktop.
import requests
from urllib.parse import urljoin
import tempfile
import time
import re
class Walle:
def __init__(self, api_key) -> None:
self.api = Api(api_key)
self.Customer = Customer(self)
self.ShieldConfirmation = ShieldConfirmation(self)
self.Session = Session(self)
class Api:
def __init__(self, api_key) -> None:
self.api_key = api_key
self.base_url = 'http://localhost:8000/api/v1/'
def post(self, route, payload):
headers = {
"Content-Type": "application/json",
"Authorization": self.api_key
}
full_url = urljoin(self.base_url, route)
response = requests.post(full_url, json=payload, headers=headers)
if response.status_code == 200:
return response.json()
else:
raise Exception(response.json().get('error'))
def get(self, route, params):
headers = {
"Content-Type": "application/json",
"Authorization": self.api_key
}
full_url = urljoin(self.base_url, route)
response = requests.get(full_url, params=params, headers=headers)
if response.status_code == 200:
return response.json()
else:
raise Exception(response.json().get('error'))
class Customer:
def __init__(self, walle) -> None:
self.api = walle.api
def list(self, email):
route = 'customers'
params = { "email": email }
return self.api.get(route=route, params=params)
def create(self, email, first_name, last_name=None):
route = 'customers'
payload = { "email" : email, "first_name": first_name, "last_name": last_name }
return self.api.post(route=route, payload=payload)
class ShieldConfirmation:
def __init__(self, walle) -> None:
self.api = walle.api
def create(self, shield_id, screenshot, url):
route = 'shield_confirmations'
payload = { "shield_id": shield_id, "screenshot": screenshot, "url": url }
return self.api.post(route=route, payload=payload)
def get(self, shield_confirmation_id):
route = 'shield_confirmations'
params = { "shield_confirmation_id": shield_confirmation_id }
return self.api.get(route=route, params=params)
class Shield:
def __init__(self, walle) -> None:
self.api = walle.api
def get(self, shield_id):
route = 'shields'
params = {
"id": shield_id
}
return self.api.get(route=route, params=params)
class Session:
def __init__(self, walle) -> None:
self.api = walle.api
self.ShieldConfirmation = walle.ShieldConfirmation
def create(self, customer_id, shields, page):
route = 'sessions'
payload = {
"customer_id": customer_id,
"shields": shields,
}
session = self.api.post(route=route, payload=payload)
page.route("**/*", lambda route, request: self.verify_request(route, request, session, page))
def verify_request(self, route, request, session, page):
for shield in session["shields"]:
if re.search(shield["pattern"], request.url) and request.method == shield["method"]:
# create confirmation attempt
# screenshot_path = None
# with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmpfile:
# screenshot_path = tmpfile.name
# breakpoint()
print("taking screenshot")
breakpoint()
screen_shot = page.locator('html').screenshot()
breakpoint()
# shield_confirmation = None
# with open(screenshot_path, 'rb') as screenshot:
# shield_confirmation = self.ShieldConfirmation.create(shield_id=shield["id"], screenshot='abc', url=request.url)
# poll for confirmation
shield_confirmation = self.ShieldConfirmation.create(shield_id=shield["id"], screenshot=screen_shot, url=request.url)
while True:
response = self.ShieldConfirmation.get(shield_confirmation["id"])
if response["declined"]:
route.abort()
elif response["declined"]:
route.continue_()
break
else:
time.sleep(5)
else:
route.continue_()
# walle.Session.create(customer_id = 'abc', shields = ['amazon_checkout'], duration=600, page=page)
# Session --has many-> Shield --has one-> Confirmation
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment