urlscan.py•2.27 kB
import requests
from string import Template
from urllib.parse import urljoin, urlparse
import jinja2
from services.base import BaseService
class Urlscan(BaseService):
name: str = "urlscan"
host: str = "https://urlscan.io/api/v1/"
class UrlscanIP(Urlscan):
endpoint: Template = Template("search/?q=ip:$ipaddress")
def get(self, ipaddress: str) -> requests.PreparedRequest:
return requests.Request(
method=self.method,
url=urljoin(self.host, self.endpoint.substitute(ipaddress=ipaddress)),
headers=self.headers,
).prepare()
def parse_response(self, response: requests.Response, template: jinja2.Template) -> str:
if response and response.ok and response.json():
return template.render(
name=self.name,
**response.json().get("results")[0]
)
else:
return ""
class UrlscanDomain(Urlscan):
endpoint: Template = Template("search/?q=domain:$domain")
def get(self, domain: str) -> requests.PreparedRequest:
return requests.Request(
method=self.method,
url=urljoin(self.host, self.endpoint.substitute(domain=domain)),
headers=self.headers,
).prepare()
def parse_response(self, response: requests.Response, template: jinja2.Template) -> str:
if response and response.ok and response.json():
return template.render(
name=self.name,
**response.json().get("results")[0]
)
else:
return ""
class UrlscanUrl(Urlscan):
endpoint: Template = Template("search/?q=domain:$url")
def get(self, url: str) -> requests.PreparedRequest:
return requests.Request(
method=self.method,
url=urljoin(self.host, self.endpoint.substitute(url=urlparse(url).netloc)),
headers=self.headers,
).prepare()
def parse_response(self, response: requests.Response, template: jinja2.Template) -> str:
if response and response.ok and response.json():
return template.render(
name=self.name,
**response.json().get("results")[0]
)
else:
return ""