85 lines
2.0 KiB
Python
85 lines
2.0 KiB
Python
import requests
|
|
import datetime
|
|
from ua_parser import user_agent_parser
|
|
|
|
from database import SessionLocal
|
|
import config
|
|
from models import Link, Log
|
|
|
|
"""
|
|
Create a new log whenever a link is visited
|
|
"""
|
|
|
|
|
|
def ip_to_location(ip):
|
|
if not config.IP_TO_LOCATION:
|
|
return "-, -", "-"
|
|
|
|
url = f"https://api.ip2location.io/?key={config.API_KEY}&ip={ip}"
|
|
response = requests.get(url)
|
|
data = response.json()
|
|
|
|
if response.status_code != 200:
|
|
config.LOG.error(
|
|
"Error with IP2Location API. Perhaps the API is down."
|
|
)
|
|
return "-, -", "-"
|
|
|
|
if "error" in data:
|
|
config.LOG.error(
|
|
"Error with IP2Location API. Likely wrong API key or insufficient"
|
|
" funds."
|
|
)
|
|
return "-, -", "-"
|
|
|
|
location = ""
|
|
# Sometimes a certain name may not be present, so always check
|
|
if "city_name" in data:
|
|
location += data["city_name"]
|
|
|
|
if "region_name" in data:
|
|
location += f', {data["region_name"]}'
|
|
|
|
if "country_name" in data:
|
|
location += f', {data["country_name"]}'
|
|
|
|
isp = data["as"]
|
|
return location, isp
|
|
|
|
|
|
def log(link, ip, user_agent):
|
|
db = SessionLocal()
|
|
|
|
# Get the redirect link and owner of the link
|
|
redirect_link, owner = (
|
|
db.query(Link.redirect_link, Link.owner)
|
|
.filter(Link.link == link)
|
|
.first()
|
|
)
|
|
|
|
# Get the location and ISP of the user
|
|
location, isp = ip_to_location(ip)
|
|
|
|
ua_string = user_agent_parser.Parse(user_agent)
|
|
browser = ua_string["user_agent"]["family"]
|
|
os = f'{ua_string["os"]["family"]} {ua_string["os"]["major"]}'
|
|
|
|
# Create the log and commit it to the database
|
|
new_log = Log(
|
|
owner=owner,
|
|
link=link,
|
|
timestamp=datetime.datetime.utcnow(),
|
|
ip=ip,
|
|
location=location,
|
|
browser=browser,
|
|
os=os,
|
|
user_agent=user_agent,
|
|
isp=isp,
|
|
)
|
|
db.add(new_log)
|
|
db.commit()
|
|
db.close()
|
|
|
|
# Return the redirect link in order to properly redirect the user
|
|
return redirect_link
|