microblog.pub/utils/lookup.py

39 lines
1.1 KiB
Python
Raw Normal View History

2018-07-20 17:15:47 -05:00
import json
2018-07-20 18:05:51 -05:00
import little_boxes.activitypub as ap
2018-07-20 17:15:47 -05:00
import mf2py
2018-07-20 18:05:51 -05:00
import requests
from little_boxes.webfinger import get_actor_url
2018-07-20 17:15:47 -05:00
def lookup(url: str) -> ap.BaseActivity:
"""Try to find an AP object related to the given URL."""
try:
return ap.fetch_remote_activity(get_actor_url(url))
except Exception:
pass
2018-07-20 17:15:47 -05:00
backend = ap.get_backend()
resp = requests.get(
url,
timeout=15,
allow_redirects=False,
headers={"User-Agent": backend.user_agent()},
)
resp.raise_for_status()
# If the page is HTML, maybe it contains an alternate link pointing to an AP object
for alternate in mf2py.parse(resp.text).get("alternates", []):
if alternate.get("type") == "application/activity+json":
return ap.fetch_remote_activity(alternate["url"])
try:
# Maybe the page was JSON-LD?
data = resp.json()
return ap.parse_activity(data)
except json.JSONDecodeError:
pass
# Try content negotiation (retry with the AP Accept header)
return ap.fetch_remote_activity(url)