pull-profile-data.py
1 #!/usr/bin/python 2 3 import json 4 import requests 5 import yaml 6 7 from enum import Enum 8 9 class Protocol(Enum): 10 ActivityPub = 0 11 ATProto = 1 12 13 def populate_account_info(filename, protocol): 14 with open(filename, 'r') as db: 15 accounts = yaml.safe_load(db) 16 for account in filter(lambda account: 'url' not in accounts[account], accounts): 17 if protocol == Protocol.ActivityPub: 18 username = account.split('@')[0] 19 instance = account.split('@')[1] 20 data_json = requests.get(f'https://{instance}/api/v1/accounts/lookup?acct={username}') 21 else: 22 data_json = requests.get(f'https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor={account}') 23 if data_json.status_code != 200: # work only with valid data 24 print(f"Error with pulling profile of {account} (AP); status code: {data_json.status_code}. Skipping.") 25 continue 26 data = json.loads(data_json.text) 27 if protocol == Protocol.ActivityPub: 28 accounts[account]['display_name'] = data['display_name'] 29 # users[user]['bio'] = data['note'] 30 accounts[account]['url'] = data['url'] 31 accounts[account]['avatar'] = data['avatar'] 32 else: 33 if 'displayName' in data: 34 accounts[account]['display_name'] = data['displayName'] 35 # users[user]['bio'] = data['description'] 36 accounts[account]['url'] = f'https://bsky.app/profile/{account}' 37 if 'avatar' in data: 38 accounts[account]['avatar'] = data['avatar'] 39 print(account) 40 print(accounts) 41 with open(filename, 'w') as db: 42 yaml.dump(accounts, db, sort_keys=False) 43 44 populate_account_info('data/users-ap.yaml', Protocol.ActivityPub) 45 populate_account_info('data/users-bsky.yaml', Protocol.ATProto)