TonyG
(Tony G)
1
这是我第一个自定义 Ruby 脚本。
在近 50 年的编码生涯中,我使用过 20 多种语言和方言,但我从未需要(或想要
)编写 Ruby,但好吧,你抓到我了……请温柔点。
我的目标是识别那些未通过电子邮件链接进行身份验证的用户帐户,并暂停这些帐户,以便在删除它们之前进行检查。在初始设置过程中,我处于各种开发阶段的设置。2FA 电子邮件未发送给某些注册用户,并且有很多虚假注册,我现在想将其过滤掉。
版本 0.0.1
rails c
# 首先确保用户 TL 符合最新定义
User.all.find_each do |user|
Promotion.recalculate(user)
end
Group.ensure_consistency!
# 为循环做准备
logger = StaffActionLogger.new(User.where("id = 'admin'"))
# 临时日期,用户将在该日期之前被移除
suspend_till = DateTime.new(2028, 12, 31)
suspend_at = DateTime.now
reason = 'Inactive'
# 识别潜在的无效帐户
User.where("views = 0 OR approved = FALSE OR last_seen_at IS NULL")
.where("id > 0")
.find_each do |user|
user.suspended_till = suspend_till
user.suspended_at = suspend_at
user.change_trust_level!(TrustLevel[0])
# 保存用户,记录操作,并……执行此触发器应执行的操作
user.save!
logger.log_user_suspend(user, reason)
DiscourseEvent.trigger(:user_suspended, user: user)
# 避免滥用邮件服务器
sleep(10)
end
通过触发事件,我想向用户发送电子邮件——会有很多退信,也可能有一些人会回来进行身份验证。一周后,我将选择所有仍被暂停的帐户并将其删除。
问题:
- 总的来说,这会达到预期目的吗?
- 有更好的方法吗?
- 日志记录与事件触发是否冗余?
- 能用 JavaScript 来做吗?
- 我应该把这个发到另一个类别吗?
- 还有其他建议吗?
谢谢!!
1 个赞
TonyG
(Tony G)
2
嗯,我看了看,我认为我应该静默账户而不是暂停账户。如果账户被暂停,用户将无法登录以认领账户。
这是修订版……
版本 0.0.2
silence_reason = 'Inactive'
User.where("views = 0 OR approved = FALSE OR last_seen_at IS NULL")
.where("id > 0") # 避免系统用户
.find_each do |user|
user.silence(reason: silence_reason)
user.change_trust_level!(TrustLevel[0])
user.save!
logger.log_user_silence(user, silence_reason)
DiscourseEvent.trigger(:user_silenced, user: user)
sleep(5)
end
是的,我会在执行任何操作之前运行备份。
是的,我知道一些现有的 TL 会被重新排序,我需要修复它们。
此外,与静默账户相比,我应该设置 Approved=false 还是 Active=false?我认为这将强制用户点击电子邮件链接,而不是手动登录,这可以验证电子邮件地址。
这一切都与我最近的帖子有关:notes-on-silencing-or-deleting-users
[编辑]
我还将“清除未激活用户的宽限期天数”设置为 7。
静默或暂停会重置此设置吗?如果是,如果用户在 7 天内未响应账户操作,我将毫不犹豫地清除他们。
最后(是的,真的),我还将“在天数后清理不活跃用户”设置为 365。我可以将其设置为 60,同时论坛仍在开放,然后让现有账户列表消失。然后将其增加回 365。这是在新的环境中自动清理账户的合理方法吗?
1 个赞
pfaffman
(Jay Pfaffman)
3
为什么这不足以解决您的问题?
这些不应该是 AND 而不是 OR 吗?
Discourse 会强制执行它们来验证地址,所以我不太清楚您在解决什么问题。您说这个
您会找到想要登录但以前无法登录的用户,这似乎不太可能,但您可能比我更了解您的设置。
而且 Discourse 不会向未经验证的地址发送电子邮件,所以我认为这不会发送任何电子邮件。
我总是对几个帐户执行这些操作,但会手动查看会发生什么。
2 个赞
TonyG
(Tony G)
4
感谢您的关注,@pfaffman!
有用户记录没有 last_seen_at,创建于数月前,approved=False,active=False,但它们没有被清除。
有用户记录 last_seen_at > 7 天(数月前)且 views=0,但它们没有被清除。
无论该宽限期标志使用的标准是什么,它都没有选中这些记录。
有人能发布确切的查询吗,这样我就可以理解还涉及哪些其他因素?
不,直接查看数据库,有用户记录符合每个标准,但不是所有标准。看起来数据库中的 users 表不一致。存在 topics_entered 或 posts_read_count 非零但 views=0 的记录。存在 topics_entered=0 和 posts_read_count=0 但 views 非零的记录。
需要记住的关键点是,在网站开发过程中,设置不是最优的,人类和机器人都在注册。OR 子句似乎涵盖了所有这些。现在网站已经稳定下来,(我希望)设置合理,我不期望新的注册会产生同样的异常。
我打算多次运行脚本,使用不同的标准。我将首先在环境外查询记录,然后运行静默脚本,仅针对我真正想要的记录。几周后,我将进行最后一次运行,仅选择静默记录(任何实际返回的用户都将被移除标志),并清除所有这些记录:
UserDestroyer.new(admin_user).destroy(user, reassign_to: archive_user)
我的总体问题是,v0.0.2 脚本及其选择、记录和静默的方法是否适用于 Discourse 系统。我不知道在这样的循环中是否还有其他事情要做。我从未创建和运行过自己的脚本,所以这是请求检查我是否存在菜鸟的愚蠢错误。
谢谢!!
1 个赞