我在Reddit上發布了我的開源社群媒體調度工具Postiz ,並受到了很多關注。

我想開源界非常需要它。

我收到了開發人員關於我如何建置它的多個問題。

所以今天,我將帶您了解基礎設施以及需要考慮的事項。

社群媒體


一切都從 oAuth (oAuth2) 開始

每個社群媒體調度工具的核心都是 oAuth。讓我解釋一下。

oAuth 是不同平台的標準方式,可讓您存取其使用者以執行有限範圍的操作。

例如,您可以要求 Facebook 授予您在使用者時間軸上發佈或閱讀其分析的權限。

oAuth有時間限制但可以刷新,每個調度工具的核心是:

  1. 收集不同平台的oAuth。

  2. 需要時刷新它們。

  3. 使用它們在用戶時間線上發布。

由於您想要建立一個可以輕鬆加入越來越多社交平台的通用平台,因此您想要建立一個像這樣的介面(簡化版本):

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 — 此函數會取得使用者令牌和訊息詳細訊息,並將它們發佈到使用者的時間軸(可以是圖片、文字、影片等)。

一旦完成,您必須在身份驗證請求中捕獲使用者的 POST 請求,將其對應到實現 IAuthenticator 的正確提供程序,並傳回generateAuthUrl.

generateAuthUrl取得一個“返回 URL”,使用者完成身份驗證後將返回該 URL。在該 URL 中,您使用authenticate功能。


安排發布

大多數平台不會為您提供使用 API 安排貼文的方法。

即使他們這樣做了,也很難管理一些這樣做的人和一些不這樣做的人,所以最好將其視為那些不這樣做的人的平台。

為此,您需要實作一個隊列。

範例:在 Facebook 上發布:「我喜歡 Postiz」並在 1 週內處理。

您有多種隊列選項。

最受歡迎的是RabbitMQSQSActiveMQ

當您有大量工作時,它們是完美的,如果您有 PB 級的流資料, Kafka可能會提供幫助。

但就我而言,我不需要「真正的」隊列。

所以,我使用了Redis(Pub-sub)。您將一些金鑰推送到 Redis 中並加入到期日期。一旦到期日過去,它就會觸發 Redis 並發送通知(到某些服務)

有一家名為BullMQ的偉大公司,它簡化了 Redis 和您的應用程式的流程(它是免費且完全開源的)

建築學

下面是「工人」。它們是您的應用程式的微服務,用於在社交媒體上處理和發布“工作”。

它們是分開的,因為它們比主應用程式小,並且可能需要根據您的作業數量進行擴展。

我們稱之為“水平擴展”,因為隨著應用程式的成長,我們將需要加入更多工作人員。


資料庫

通常,您需要在資料庫中保存具有多種狀態DRAFT, SCHEDULED, COMPLETED,ERROR )的帖子,以便您可以追蹤它發生的情況。

就我而言,我使用Prisma

Prisma 是一種 ORM,它使用一對一、多對多和一對多等術語來包裝和查詢資料庫。

這是所有語言中都存在的已知方法。

我喜歡它,因為它保持一致的回應結構,並允許我將來更改為不同的資料庫(輕鬆遷移)。我的專案中甚至沒有一個原始查詢(好或壞)

我正在使用 PostgreSQL,因為它現在很流行(根據StackOverflow 調查

StackOverflow 調查

使用 SQL 時要注意的主要問題是死鎖。您不想同時從多個位置更新一行,因為這會引發死鎖,更新將會失敗。


幫幫我

Postiz在 GitHub 上處於流行趨勢。它是100%免費的,我會盡力為您提供盡可能多的價值。

已經根據所有請求制定了一個小路線圖

我希望你能幫助我一顆能幫助我的星星(好吧,我甚至無法描述有多少幫助)

{% cta https://github.com/gitroomhq/postiz-app %}明星 Postiz{% endcta %}


原文出處:https://dev.to/nevodavid/how-i-built-my-open-source-social-media-scheduling-tool-dih


共有 0 則留言