/ scripts / pull-profile-data.py
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)