Skip to content

Instantly share code, notes, and snippets.

@simonw
Forked from hamelsmu/follow_theirs.py
Last active December 1, 2024 01:34
Show Gist options
  • Save simonw/848a3b91169a789bc084a459aa7ecf83 to your computer and use it in GitHub Desktop.
Save simonw/848a3b91169a789bc084a459aa7ecf83 to your computer and use it in GitHub Desktop.
# /// script
# dependencies = [
# "atproto"
# ]
# ///
from atproto import Client
import getpass
import time
def follow_user_follows(client, target_user):
"Follow everyone the target_user is following."
cursor = None
total_followed = 0
while True:
# Step 1: Fetch a batch of accounts the target user is following
# https://docs.bsky.app/docs/api/app-bsky-graph-get-follows
response = client.app.bsky.graph.get_follows(
{"actor": target_user, "limit": 100, "cursor": cursor}
)
# Step 2: Iterate through the accounts
for follow in response.follows:
try:
# Step 3: Follow each account
client.follow(follow.did)
print(f"Following {follow.handle}")
total_followed += 1
# Step 4: Add a delay to respect rate limits
time.sleep(2)
except Exception as e:
print(f"Error following {follow.handle}: {str(e)}")
# Step 5: Check for more accounts to follow
if not response.cursor:
break
cursor = response.cursor
# Step 6: Print progress
print(f"Followed {total_followed} users so far")
# Step 7: Print final result
print(f"Finished following {total_followed} users")
if __name__ == "__main__":
# Step 8: Set up credentials
USERNAME = input("your_username.bsky.social ")
APP_PASSWORD = getpass.getpass("your_app_password ")
TARGET_USER = input("target_user.bsky.social ")
# Step 9: Initialize and authenticate client
client = Client()
client.login(USERNAME, APP_PASSWORD)
# Step 10: Execute the follow process
follow_user_follows(client, TARGET_USER)
@simonw
Copy link
Author

simonw commented Nov 24, 2024

uv run https://gist.githubusercontent.com/simonw/848a3b91169a789bc084a459aa7ecf83/raw/397ad07c8be0601eaf272d9d5ab7675c7fd3c0cf/follow_theirs.py

@simonw
Copy link
Author

simonw commented Nov 24, 2024

To clarify: this is a fork of the original script by Hamel here: https://gist.github.com/hamelsmu/fb9ed633de7d784619e4b6da5039e6ae

I added the inline dependency metadata and the input() and getpass() bits.

You can see the changes I made here, I also ran it through Black: https://gist.github.com/simonw/848a3b91169a789bc084a459aa7ecf83/revisions

@howtodowtle
Copy link

This skips the actual following:

        # Step 2: Iterate through the accounts
        for follow in response.follows:
            print(follow)
            continue  # never follows
            try:
            ...

@simonw
Copy link
Author

simonw commented Nov 24, 2024

This skips the actual following:

Oops! Fixed that now, thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment