如何用PyGithub取消关注粉丝?遭遇404错误求解决方案
问题描述
我想写一个只关注组织、取消所有关注我的用户的程序,用PyGithub写了以下代码,却触发了404错误(github.GithubException.UnknownObjectException),请帮忙解决。
代码如下:
from github import Github, Auth print("正在验证身份...") auth = Auth.Token("我的私有令牌") g = Github(auth=auth) print("获取关注者列表...") user = g.get_user() followers = [] for follower in user.get_followers(): followers.append(follower) print(f"INFO: 获取到 {len(followers)} 个关注者。\n\n检查你是否关注了这些关注者...") num = 0 for follow in user.get_following(): if follow in followers: user.remove_from_following(follow) print(f"已取消关注: {follow.login}") num += 1 print(f"找到 {num} 个你关注且同时关注你的用户。")
错误信息:
github.GithubException.UnknownObjectException: 404 {"message": "未找到", "documentation_url": "https://docs.github.com/rest/users/followers#unfollow-a-user", "status": "404"}
问题分析与解决办法
错误原因
触发404的核心原因有三个:
- 令牌权限不足:私有令牌没有获取/修改关注列表的权限,导致API调用被拒绝。
- 对象比较逻辑失效:直接用
User实例做in判断,可能因为实例内存地址不同(即使对应同一个用户)导致误判,尝试取消关注实际未关注的用户。 - 潜在的组织操作:虽然组织不会出现在关注者列表中,但如果循环时误触组织,
remove_from_following仅支持取消关注个人用户,操作组织会返回404。
修正后的代码
from github import Github, Auth, GithubException print("正在验证身份...") # 替换为你的私有令牌 auth = Auth.Token("我的私有令牌") g = Github(auth=auth) print("获取关注者列表...") user = g.get_user() # 存储关注者的login,避免实例比较的问题 followers_logins = [follower.login for follower in user.get_followers()] print(f"INFO: 获取到 {len(followers_logins)} 个关注者。") print("\n检查并取消关注互关的个人用户...") num = 0 # 遍历当前关注的对象 for follow in user.get_following(): # 如果是组织,直接跳过(保留关注) if follow.type == 'Organization': continue # 仅取消关注那些同时关注你的个人用户 if follow.login in followers_logins: try: user.remove_from_following(follow) print(f"已取消关注: {follow.login}") num += 1 except GithubException as e: print(f"取消关注 {follow.login} 失败: {e}") print(f"共取消关注 {num} 个互关的个人用户。")
关键修正点
- 权限检查:创建令牌时,必须勾选
read:user和write:user权限(对应关注列表的读写权限)。 - 改用login比较:用用户的login字符串代替
User实例做判断,彻底解决实例对象不相等的问题。 - 过滤组织:明确跳过组织类型的关注对象,完全符合"仅关注组织"的需求。
- 异常捕获:处理可能的API异常,避免单个操作失败导致程序直接终止。
内容的提问来源于stack exchange,提问作者Isus Ramzy
相关产品推荐
相关产品推荐

