我是如何构建我的开源社交媒体调度工具的……🤯
数据库
我在Reddit上发布了我的开源社交媒体调度工具Postiz,获得了广泛关注。
我猜开源领域当时非常需要它。
我已经收到很多开发者关于我如何构建它的问题了。
所以今天,我将带您了解基础设施和您需要考虑的事项。
一切始于 oAuth(oAuth2)
每个社交媒体调度工具的核心都是oAuth。让我来解释一下。
oAuth 是不同平台授予您访问其用户以执行有限范围操作的标准方式。
例如,您可以要求 Facebook 授予您在用户时间线上发布帖子或阅读其分析信息的权限。
oAuth有时间限制但可以刷新,每个调度工具的核心是:
- 收集不同平台的oAuth。
- 需要时刷新它们。
- 使用它们在用户时间线上发布帖子。
由于您想要构建一个可以轻松添加更多社交平台的通用平台,因此您需要构建一个如下界面(简化版本):
export interface Provider {
generateAuthUrl(): Promise<GenerateAuthUrlResponse>;
authenticate(params: {code: string; codeVerifier: string; refresh?: string;}): Promise<AuthTokenDetails>;
refreshToken(refreshToken: string): Promise<AuthTokenDetails>;
post(token: string, info: MessageInformation): Promise<PostDetails>;
}
generateAuthUrl
— 此函数会生成一个 URL,供用户在平台(例如 LinkedIn)上进行身份验证。它会提供一个代码,您稍后可以将其转换为令牌,以便在用户的时间线上发布帖子。
authenticate
- 获取用户代码,将其转换为令牌,并在数据库中创建用户(并将其令牌与令牌到期日期一起保存)
refreshToken
- 获取用户令牌和到期日期,并在需要时刷新。
post
— 该函数获取用户token和消息详情,并发布到用户的时间线(可以是图片、文字、视频等)。
一旦你有了这个,你必须在身份验证请求中捕获用户的 POST 请求,将其映射到实现 IAuthenticator 的正确提供程序,并返回generateAuthUrl.
它generateAuthUrl
会获取一个“返回 URL”,用户完成身份验证后会返回该 URL。在该 URL 中,您将使用该authenticate
函数。
安排发布
平台大多不会提供使用 API 来安排其帖子的方法。
即使他们这样做了,也很难管理一些这样做的人和一些不这样做的人,所以最好将其视为那些不这样做的人的平台。
为此,您需要实现一个队列。
例如:发布到 Facebook:“我喜欢 Postiz”并从现在起 1 周内处理它。
队列有很多选择。
其中最受欢迎的是RabbitMQ、SQS和ActiveMQ
当您有大量工作时,它们是完美的选择,如果您有 PB 级的流式数据,Kafka可能会有所帮助。
但就我而言,我不需要“真正的”队列。
所以,我使用了 Redis(发布-订阅)。你把一些键推送到 Redis 内部,并添加一个到期日期。到期后,它会触发 Redis 并向某个服务发送通知。
有一家很棒的公司叫BullMQ,它使用 Redis 和你的应用程序简化了这个过程(它是免费的,并且完全开源)
下面是“Workers”。它们是应用程序中的微服务,负责处理“工作”并将其发布到社交媒体上。
它们是分开的,因为它们比主应用程序小,并且可能需要根据您的作业数量进行扩展。
我们称之为“水平扩展”,因为随着应用程序的增长,我们需要添加更多的工作人员。
数据库
通常,您需要在数据库中保存具有多种状态的帖子DRAFT,
SCHEDULED,
COMPLETED,
,以便ERROR
您可以跟踪发生的事情。
就我而言,我使用了Prisma。Prisma
是一个 ORM,它使用一对一、多对多和一对多等术语来包装和查询数据库。
这是一种已知的方法,适用于所有语言。
我喜欢它,因为它保持一致的响应结构,并且允许我将来切换到不同的数据库(轻松迁移)。我的项目中甚至没有一个原始查询(无论好坏)。
我使用 PostgreSQL 是因为它现在很流行(根据StackOverflow 调查)
使用 SQL 时需要注意的主要问题是死锁。您不应该同时从多个位置更新同一行,因为这会引发死锁,导致更新失败。
帮我
Postiz在 GitHub 上很流行。它是 100% 免费的,我会尽力为你提供价值。
已经根据所有请求制定了小路线图。
我希望你能给我一颗星,它会对我有帮助(好吧,我甚至无法描述它有多大帮助)
文章来源:https://dev.to/nevodavid/how-i-built-my-open-source-social-media-scheduling-tool-dih