用 PRAW 跑 Reddit 自动化最坑的一点是
很多人在做 Reddit 自动化的时候,只要 API 返回了 URL 且页面能打开,就以为发布成功了。我之前在公司推行一套自动化分发流程,结果跑了一周才发现,最后 6 篇帖子里有 4 篇被秒删了,但我之前的监控代码居然一直显示“成功”。
有个踩坑经验分享:千万不要尝试用 HTTP 请求
下一篇
工程师要是只会在 IDE 里敲代码而不敢去翻底层日志 →
这就是 Reddit 最阴险的地方:如果你用发帖账号登录,看到的帖子依然是完整的,标题、正文、分数全在,但其实除了你,全世界没人能看到。
想要实操监测是否被删,必须得用一个“匿名客户端”去回读。如果你在初始化 PRAW 时传了用户名和密码,结果永远是正常的。
import praw
# 关键点:只传 App 凭证,不传用户账号密码,实现匿名访问
anon = praw.Reddit(
client_id="你的CLIENT_ID",
client_secret="你的CLIENT_SECRET",
user_agent="removal-check-bot",
)
anon.read_only = True
s = anon.submission(id="帖子ID")
# 必须同时检查这两个维度,因为 Reddit 的删除标记不统一
is_removed = s.removed_by_category is not None or s.selftext in ("[removed]", "[deleted]")在实战中,removed_by_category 这个字段才是核心情报。我把遇到的几种情况梳理了一下:
- automod_filtered: 这是 AutoModerator 删的,通常会伴随一条机器人评论告诉你原因(比如在这个版块 Karma 不够)。这种最简单,改改内容或养号就行。
- moderator: 真人版主删的,这种没啥代码能解决,只能认栽。
- reddit: 这是全站级别的垃圾邮件过滤器。如果看到这个,赶紧停掉发帖,因为这意味着你的账号被系统标记了,越发权重越低。
- deleted: 这是作者自己删的,不算被系统拦截。
有个踩坑经验分享:千万不要尝试用 HTTP 请求
reddit.com/user/xxx/about.json 来检查是否被 Shadowban,因为很多数据中心 IP 会直接被返回 403,导致你误以为账号被封了。最后分享一个逻辑漏洞,我之前写了一个检查版块 Karma 门槛的拦截器,结果完全没生效。因为 reddit.user.karma() 只有在你在这个版块有过记录时才会返回该版块的数值。如果该版块数值不存在,它直接不返回这个 Key,导致我的 if 判断逻辑失效,直接放行了。