# 批量创建数千份邀请函

**URL:** https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271
**Category:** Support
**Tags:** invites
**Created:** [2024年四月24日 14:32 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271 "2024-04-24T14:32:31Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![seefood](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/seefood/32/380390_2.png) [@seefood](https://meta.discourse.org/u/seefood)
#### Post date: [2024年四月24日 14:32 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/1 "2024-04-24T14:32:31Z")

</div>

我想答案是“向 API 发送数千个请求”，但我希望有更聪明的方法。

场景：我们为一家大型合作社（Co-Op）建立了一个社区网站。有 15,000 多名成员，其中 95% 的人可能永远不会创建用户，另外 4% 的人会创建用户但从不使用。为 15,000 次邀请创建单个链接会使网站容易被滥用，因此我想创建大约 16,000 个邀请链接，每个链接只有一个邀请，邮件模板工具将负责将它们缝合起来。唯一的难点是邀请链接的创建。我想将系统分开以保护隐私，因此我不会将 15,000 多个地址提供给 Discourse，这样 Discourse 服务器就不会携带完整的电子邮件列表，而只会携带匿名邀请链接列表。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2024年四月24日 15:25 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/2 "2024-04-24T15:25:43Z")

</div>

如果您认为在 Discourse 中存储地址比在其他任何地方存储地址更危险，这是一种隐私问题，那么您需要自己创建它们。如果您不喜欢 API，也可以通过 Rails 来实现：

```plaintext
i=Invite.generate(user, skip_email: true, max_redemptions_allowed: 1)

```

这将为您生成一个邀请密钥。

```plaintext
"/invites/#{i.invite_key}"

```

是相应的 URL。您可以将它们全部写入一个文件。

---

<div class="post-metadata">

### Author: ![seefood](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/seefood/32/380390_2.png) [@seefood](https://meta.discourse.org/u/seefood)
#### Post date: [2024年四月24日 15:39 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/3 "2024-04-24T15:39:34Z")

</div>

我也这么想的，还是需要在循环中迭代 🙂  
好的，谢谢！

---

<div class="post-metadata">

### Author: ![seefood](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/seefood/32/380390_2.png) [@seefood](https://meta.discourse.org/u/seefood)
#### Post date: [2024年四月24日 16:03 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/4 "2024-04-24T16:03:56Z")

</div>

好的，我真是太天真了。我写了 `curl` 命令，以为可以运行 16k 次，但一分钟后就被我自己的 discourse 限制了速率了 🙂 🤦‍♂️

作为一个 Rails 新手，我需要进入 discourse 容器的 shell，然后进入 irb，具体该怎么做？

---

<div class="post-metadata">

### Author: ![supermathie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/supermathie/32/507518_2.png) [@supermathie](https://meta.discourse.org/u/supermathie)
#### Post date: [2024年四月24日 16:26 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/5 "2024-04-24T16:26:13Z")

</div>

您尝试过使用[批量邀请](https://meta.discourse.org/t/send-bulk-user-invites/16468?u=supermathie)吗？

---

<div class="post-metadata">

### Author: ![seefood](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/seefood/32/380390_2.png) [@seefood](https://meta.discourse.org/u/seefood)
#### Post date: [2024年四月24日 16:44 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/6 "2024-04-24T16:44:27Z")

</div>

本来我会这样做，但我没有提前收到电子邮件列表。这是一个信用合作社的网站，所以管理层不能仅仅给我一份包含 15,500 封电子邮件的列表，以免带来隐私灾难（我也不想自己承担风险）。所以我必须创建 16,000 个链接，每个链接只有一个兑换码，然后他们会将其整合到他们的电子邮件群发系统中。希望以后情况会好转。

---

<div class="post-metadata">

### Author: ![supermathie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/supermathie/32/507518_2.png) [@supermathie](https://meta.discourse.org/u/supermathie)
#### Post date: [2024年四月24日 16:56 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/7 "2024-04-24T16:56:32Z")

</div>

我也猜想没有可以使用的SSO认证。

在这种情况下，@pfaffman 建议的方法是可行的。

类似这样的代码：

```plaintext
user = User.find_by(username: 'system')
16000.times do
  i = Invite.generate(user, skip_email: true, max_redemptions_allowed: 1)
  puts "/invites/#{i.invite_key}"
  # 将 "/invites/#{i.invite_key}" 写入文件
end

```

可以实现。先从1或2次的循环开始，直到你得到预期的结果。

一种懒惰但可行的方法是直接打印所有内容（puts）并记录你的终端会话 😃

---

<div class="post-metadata">

### Author: ![seefood](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/seefood/32/380390_2.png) [@seefood](https://meta.discourse.org/u/seefood)
#### Post date: [2024年四月24日 17:02 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/8 "2024-04-24T17:02:38Z")

</div>

你知道的，我不想去打扰任何人，让他们在一个论坛上教我 RoR。我看到在 API 调用之间添加 1 秒的延迟就不会收到超速罚单，所以这次运行将只是一个慢速运行。

API 密钥是为“system”用户创建的，因此所有邀请都未显示在我的用户管理屏幕上。我现在将踏上征程，查看服务器上总邀请的状态，而无需登录为“system”，如果这可能的话。

感谢您目前的帮助，希望下次我能提出更聪明、更巧妙的问题 🙂

---

<div class="post-metadata">

### Author: ![Firepup650](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/firepup650/32/465200_2.png) [@Firepup650](https://meta.discourse.org/u/Firepup650)
#### Post date: [2024年四月24日 18:43 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/9 "2024-04-24T18:43:16Z")

</div>

> [@seefood](#):
>
> 我现在将开始一项任务，查看服务器上的总邀请状态，而无需登录为“system”，如果可能的话。

登录为 system 相当容易，如果您被标记为论坛的“开发者”（在构建论坛时提供的电子邮件，作为默认管理员）。您可以打开 @system 的用户页面，选择Admin，一直向下滚动，然后点击Impersonate。

---

<div class="post-metadata">

### Author: ![seefood](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/seefood/32/380390_2.png) [@seefood](https://meta.discourse.org/u/seefood)
#### Post date: [2024年四月24日 20:37 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/10 "2024-04-24T20:37:51Z")

</div>

> [@Firepup650](#):
>
> 选择 Admin，一直向下滚动，然后点击 Impersonate。

哦，对了……我只是从来没滚动到那么低 🙂 非常酷。我作为用户在不同的网站上使用 Discourse 已经很多年了，只是作为其中一个站点的管理员，我错过了一些基本的细微差别……

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2024年五月24日 20:38 UTC](https://meta.discourse.org/t/creating-thousands-of-invitations-in-bulk/305271/11 "2024-05-24T20:38:42Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
