async def fetch_nodeinfo(domain):
- nodeinfo_data = await fetch_actor(f'https://{domain}/nodeinfo/2.0.json')
+ headers = {'Accept': 'application/activity+json'}
+ nodeinfo_url = None
+
+ wk_nodeinfo = await fetch_actor(f'https://{domain}/.well-known/nodeinfo', headers=headers)
+
+ if not wk_nodeinfo:
+ return
+
+ for link in wk_nodeinfo.get('links', ''):
+ if link['rel'] == 'http://nodeinfo.diaspora.software/ns/schema/2.0':
+ nodeinfo_url = link['href']
+ break
+
+ if not nodeinfo_url:
+ return
+
+ nodeinfo_data = await fetch_actor(nodeinfo_url)
software = nodeinfo_data.get('software')
+
return software.get('name') if software else None
ACTORS = TTLCache(CACHE_SIZE, CACHE_TTL)
-async def fetch_actor(uri, force=False):
+async def fetch_actor(uri, headers={}, force=False):
if uri in ACTORS and not force:
return ACTORS[uri]
+ new_headers = {'Accept': 'application/activity+json'}
+
+ for k,v in headers.items():
+ new_headers[k.capitalize()] = v
+
try:
async with aiohttp.ClientSession(trace_configs=[http_debug()]) as session:
- async with session.get(uri, headers={'Accept': 'application/activity+json'}) as resp:
+ async with session.get(uri, headers=new_headers) as resp:
if resp.status != 200:
return None
ACTORS[uri] = (await resp.json(encoding='utf-8', content_type=None))