Files
gh-api-use/uses/watch_user_repos.py
T
xixu-me 5bc5a8a513 Add script to watch all repos of a user
Introduces watch_user_repos.py, a script to subscribe to all repositories of a specified GitHub user. The script uses the GitHub API and requires a personal access token, allowing users to stay updated on activity from a particular user or organization.
2025-12-04 17:55:58 +08:00

89 lines
2.6 KiB
Python

"""
Watch All Repositories of a User
This script subscribes (watches) all repositories of a specified GitHub user.
Useful for staying updated on all activity from a particular user or organization.
Usage:
1. Replace TOKEN with your GitHub Personal Access Token
2. Replace TARGET_USER with the username whose repos you want to watch
3. Run the script: python watch_user_repos.py
Requirements:
- PAT with `repo` scope (for private repos) or no special scope (for public repos only)
"""
import time
import requests
# Configuration - replace these values
TOKEN = "YOUR_PAT" # GitHub Personal Access Token
TARGET_USER = "target_username" # Username whose repositories to watch
# API setup
API = "https://api.github.com"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Accept": "application/vnd.github+json",
"X-GitHub-Api-Version": "2022-11-28",
}
def list_user_repos(username):
"""List all repositories of a user (public, and private if token has access)."""
page = 1
while True:
resp = requests.get(
f"{API}/users/{username}/repos",
headers=headers,
params={
"per_page": 100,
"page": page,
"type": "all",
"sort": "full_name",
},
)
if resp.status_code != 200:
error_msg = resp.json().get("message", "No error message provided")
print(f"Error listing repos: {error_msg}")
break
repos = resp.json()
if not repos:
break
yield from repos
page += 1
def watch_repo(owner, repo_name):
"""Subscribe (watch) a single repository."""
url = f"{API}/repos/{owner}/{repo_name}/subscription"
payload = {
"subscribed": True,
"ignored": False,
}
resp = requests.put(url, json=payload, headers=headers)
if resp.status_code in (200, 201):
print(f"Watching {owner}/{repo_name}")
else:
error_msg = resp.json().get("message", "No error message provided")
print(f"Failed {owner}/{repo_name}: {error_msg}")
def watch_all_repos_of_user(username):
"""Watch all repositories of a specified user."""
print(f"Fetching repositories for user: {username}")
count = 0
for repo in list_user_repos(username):
owner = repo["owner"]["login"]
name = repo["name"]
watch_repo(owner, name)
count += 1
# Sleep to avoid hitting secondary rate limits
time.sleep(0.2)
print(f"Finished. Watched {count} repositories.")
if __name__ == "__main__":
watch_all_repos_of_user(TARGET_USER)