通过一套 REST API 和 10+ 种语言的 SDK 实现评论、审核和社交动态流。从你的后端拉取、发布和审核内容,再通过 WebSockets 将新动态实时推送给每一位读者。
FastComments 不仅仅是评论。在同一套 API 和 SDK 上构建讨论、审核和社交动态流。
支持嵌套评论和实时聊天。内置 SSO 和实时更新,可拉取、发布、投票、置顶、回复和搜索。
拥有 40+ 端点的专用审核接口。支持批准、标记、屏蔽、封禁、锁定和审计,并由自动垃圾信息过滤提供支撑。
使用帖子、媒体、表情反应和关注功能构建活动流和社交动态流,并将新帖子实时推送给每一个客户端。
提供 cURL 以及面向 Node、Python、PHP、Ruby、Go、Java、Rust、Swift 和 C++ 的类型化 SDK。200 多个端点涵盖评论、投票、页面、SSO 用户、动态流帖子、审核和通知,全部由单个 API 密钥统一管理。
npm install fastcomments-sdkimport { createFastCommentsSDK } from 'fastcomments-sdk/server';
const sdk = createFastCommentsSDK({
apiKey: 'your-api-key', // server-side only
basePath: 'https://fastcomments.com' // optional (default)
});
// Fetch comments for a page
const { comments } = await sdk.publicApi.getCommentsPublic({
tenantId: 'your-tenant-id',
urlId: 'page-url-id'
});
// Post a comment
await sdk.publicApi.createCommentPublic({
tenantId: 'your-tenant-id',
broadcastId: crypto.randomUUID(),
createComment: {
urlId: 'page-url-id',
url: 'https://example.com/post',
comment: 'Hello from the API!',
commenterName: 'Alice'
}
});
# Fetch comments for a page curl -s 'https://fastcomments.com/api/v1/comments?tenantId=your-tenant-id&urlId=page-url-id' \ -H 'x-api-key: YOUR_API_KEY'
pip install fastcommentsimport client
from client.api.public_api import GetCommentsPublicOptions
configuration = client.Configuration(host="https://fastcomments.com")
with client.ApiClient(configuration) as api_client:
api = client.PublicApi(api_client)
response = api.get_comments_public(
"your-tenant-id",
"page-url-id",
GetCommentsPublicOptions(page=0, limit=30),
)
for comment in response.comments:
print(comment.commenter_name, comment.comment)
composer require fastcomments/fastcomments-php<?php
require_once(__DIR__ . '/vendor/autoload.php');
$api = new FastComments\Client\Api\PublicApi(new GuzzleHttp\Client());
$result = $api->getCommentsPublic('your-tenant-id', 'page-url-id', [
'page' => 0,
'limit' => 30,
]);
foreach ($result->getComments() as $comment) {
echo $comment->getCommenterName() . ': ' . $comment->getComment() . PHP_EOL;
}
gem install fastcommentsrequire 'fastcomments-client'
api = FastCommentsClient::PublicApi.new
result = api.get_comments_public('your-tenant-id', 'page-url-id', { page: 0, limit: 30 })
result.comments.each do |comment|
puts "#{comment.commenter_name}: #{comment.comment}"
end
go get github.com/fastcomments/fastcomments-gopackage main
import (
"context"
"fmt"
openapiclient "github.com/fastcomments/fastcomments-go/client"
)
func main() {
client := openapiclient.NewAPIClient(openapiclient.NewConfiguration())
resp, _, err := client.PublicAPI.
GetCommentsPublic(context.Background(), "your-tenant-id").
UrlId("page-url-id").Page(0).Limit(30).Execute()
if err != nil {
panic(err)
}
for _, c := range resp.Comments {
fmt.Printf("%s: %s\n", c.GetCommenterName(), c.GetComment())
}
}
import com.fastcomments.invoker.ApiClient;
import com.fastcomments.invoker.Configuration;
import com.fastcomments.api.PublicApi;
ApiClient client = Configuration.getDefaultApiClient();
client.setBasePath("https://fastcomments.com");
PublicApi api = new PublicApi(client);
var result = api.getCommentsPublic("your-tenant-id", "page-url-id")
.page(0)
.limit(30)
.execute();
System.out.println(result.getComments());
use fastcomments_sdk::client::apis::configuration::Configuration;
use fastcomments_sdk::client::apis::public_api::{get_comments_public, GetCommentsPublicParams};
let config = Configuration::new();
let params = GetCommentsPublicParams {
tenant_id: "your-tenant-id".to_string(),
url_id: "page-url-id".to_string(),
page: Some(0),
limit: Some(30),
..Default::default()
};
let result = get_comments_public(&config, params).await.unwrap();
for comment in result.comments {
println!("{:?}: {:?}", comment.commenter_name, comment.comment);
}
import FastCommentsSwift
var options = PublicAPI.GetCommentsPublicOptions()
options.page = 0
options.limit = 30
let result = try await PublicAPI.getCommentsPublic(
tenantId: "your-tenant-id",
urlId: "page-url-id",
options: options
)
print(result.comments ?? [])
#include "FastCommentsClient/api/PublicApi.h"
#include "FastCommentsClient/ApiClient.h"
#include "FastCommentsClient/ApiConfiguration.h"
using namespace org::openapitools::client::api;
auto config = std::make_shared<ApiConfiguration>();
config->setBaseUrl(utility::conversions::to_string_t("https://fastcomments.com"));
PublicApi publicApi(std::make_shared<ApiClient>(config));
auto resp = publicApi.getCommentsPublic(
utility::conversions::to_string_t("your-tenant-id"),
utility::conversions::to_string_t("page-url-id")
).get();
建立一条连接,即可在每一条新评论、编辑、投票和在线状态更新发生的瞬间收到通知。不会遗漏任何事件:重新连接时会重新拉取 event log,回放客户端离线期间发送的所有内容。原生 WebSocket 订阅器适用于 Node、React Native、Java、Swift 和 C++。其他所有语言均可通过轮询 event log 保持实时。
npm install fastcomments-sdkimport { subscribeToChanges, LiveEventType } from 'fastcomments-sdk/browser';
const config = { tenantId: 'your-tenant-id', urlId: 'page-url-id' };
const subscription = subscribeToChanges(
config,
'your-tenant-id', // tenantIdWS
'page-url-id', // urlIdWS
'user-session-id', // userIdWS (from the getComments response)
(event) => {
if (event.type === LiveEventType.new_comment) {
console.log('New comment:', event.comment?.comment);
}
return true; // event handled
},
(isConnected) => console.log(isConnected ? 'connected' : 'disconnected')
);
// later: subscription.close();
npm install fastcomments-react-native-sdkimport React, { useState } from 'react';
import { FastCommentsLiveCommenting } from 'fastcomments-react-native-sdk';
import { FastCommentsCommentWidgetConfig } from 'fastcomments-typescript';
export default function Comments() {
// <FastCommentsLiveCommenting> subscribes to the live feed automatically.
const [config] = useState<FastCommentsCommentWidgetConfig>({
tenantId: 'your-tenant-id',
urlId: 'page-url-id',
showLiveRightAway: true,
countAll: true,
});
return <FastCommentsLiveCommenting config={config} />;
}
import com.fastcomments.pubsub.LiveEventSubscriber;
import com.fastcomments.pubsub.SubscribeToChangesResult;
import com.fastcomments.core.CommentWidgetConfig;
import com.fastcomments.model.LiveEventType;
CommentWidgetConfig config = new CommentWidgetConfig();
config.tenant = "your-tenant-id";
config.urlId = "page-url-id";
LiveEventSubscriber subscriber = new LiveEventSubscriber();
SubscribeToChangesResult result = subscriber.subscribeToChanges(
config,
"your-tenant-id", // tenantIdWS
"page-url-id", // urlId
"page-url-id", // urlIdWS
"my-presence-id", // userIdWS
null, // canSeeCommentsCallback (optional)
(event) -> {
if (event.getType() == LiveEventType.NEW_COMMENT) {
System.out.println("New comment: " + event.getComment().getId());
}
}
);
// later: result.close();
import FastCommentsSwift
let config = LiveEventConfig(
tenantId: "your-tenant-id",
urlId: "page-url-id",
urlIdWS: "page-url-id", // URL-safe id for the WS server
userIdWS: "my-presence-id"
)
let subscriber = LiveEventSubscriber()
let result = subscriber.subscribeToChanges(config: config) { event in
if event.type == .newComment, let comment = event.comment {
print("New comment: \(comment.id ?? "")")
}
}
// later: result?.close()
#include <fastcomments/live/live_stream.hpp>
#include <iostream>
using namespace fastcomments::live;
LiveStreamConfig cfg;
cfg.wsBaseUrl = "wss://fastcomments.com"; // no trailing slash
LiveStream stream(cfg);
stream.onEvent([](const LiveEvent& ev) {
if (ev.type == EventType::NewComment) {
std::cout << "New comment at " << ev.timestamp << std::endl;
}
});
stream.subscribe("your-tenant-id", "page-url-id", "my-presence-id").wait();
// later: stream.close().wait();
pip install fastcommentsimport time
import client
configuration = client.Configuration(host="https://fastcomments.com")
with client.ApiClient(configuration) as api_client:
api = client.PublicApi(api_client)
start_time = int(time.time() * 1000) # ms epoch
while True:
result = api.get_event_log(
"your-tenant-id", "page-url-id", "my-user-id", start_time
)
for event in result.events:
print("event:", event.data)
start_time = int(event.created_at.timestamp() * 1000) + 1
time.sleep(2)
# startTime = epoch millis to replay from; advance it past the last event you saw curl -s 'https://fastcomments.com/api/v1/event-log/your-tenant-id?urlId=page-url-id&userIdWS=my-user-id&startTime=1720560000000' \ -H 'x-api-key: YOUR_API_KEY'
无需自行构建和维护评论 UI。我们为 React Native、Android 和 iOS 提供的专用、持续维护的 SDK 内置原生 UI 组件,支持嵌套评论、实时聊天和动态流。放入一个视图、传入配置,即可完成。
npm: fastcomments-react-native-sdk
原生组件,无 webview。放入 FastCommentsLiveCommenting、FastCommentsLiveChat 或 FastCommentsFeed 并传入配置即可。
查看实时演示com.fastcomments:sdk
原生 Android UI 组件。将 FastCommentsView 添加到布局中,即可获得嵌套评论、投票、通知和动态流。支持 Android 8.0+。
在 GitHub 上查看Swift Package: FastCommentsUI
一个用于嵌套评论、社交动态流和实时聊天的原生 SwiftUI 库。支持 iOS 16+ 和 macOS 14+。
在 GitHub 上查看一个 API 密钥,一个基础 URL。仪表盘能做的一切,你的代码也能做到。
面向 Node、Python、PHP、Ruby、Go、Java、Rust、Swift、C++ 等的类型化客户端,让你在自己的技术栈中构建,而非受限于我们的。
新评论在发布的瞬间即可送达每一位读者,无需刷新,也无需轮询。若读者重新连接,遗漏的事件会从日志中回放。
单点登录、评论审核和垃圾信息过滤均已内置,在你写下第一行代码之前,最棘手的部分就已处理妥当。
我们在全球网络中运行存储和实时基础设施。你只需调用 API 并发布上线。
一套 API 和 SDK,支撑起 Web、移动和服务器应用中的评论线程、聊天和实时活动。
将消息实时推送给房间内的每个人,并显示在线人数和输入动态。
只需几次 API 调用,即可为文章、产品和帖子添加可嵌套、可投票的评论区。
向动态流发帖,并在新条目和表情反应到达时推送给已连接的客户端。
收集问题、答案、投票和投票结果,然后实时排序并展示。
开始免费试用,从仪表盘获取你的租户 ID 和 API 密钥。
添加对应语言的 SDK,或使用 cURL 和你的 x-api-key 请求头直接调用 REST API。
加载评论,从后端发布,并订阅变更,将更新实时推送给每一位读者。
FastComments 在我们自有的基础设施上跨多个区域运行。写入操作在区域间复制,节点自动故障转移,读者由离其最近的位置提供服务。
写入操作可在多个区域被接受并在其间复制,因此不存在单点故障。
评论和媒体由我们自有的全球 CDN 和 DNS 提供服务,从离你的用户最近的位置送达。不依赖第三方 CDN。
冗余节点自行进行故障转移,因此即使发生故障,流量也能持续流转。以 99.99% 的正常运行时间为保障。
可在 US 或 EU 运行。位于 eu.fastcomments.com 的 EU 区域将数据保留在本区域内,以满足合规要求。
不需要。小组件是可选的。你可以完全基于 REST API 和 SDK 构建整套评论体验,并自行渲染所有内容。
Node、Python、PHP、Ruby、Go、Java、Rust、Swift、C++ 和 Nim,外加面向移动端的 React Native SDK。任何语言也都可以直接调用 REST API。
客户端建立一条 WebSocket 连接,以事件形式接收新评论、编辑、投票和在线状态更新,因此无需刷新,也无需轮询。不会遗漏任何事件:若客户端断开连接,会在重新连接时重新拉取 event log,回放离线期间发送的所有内容。
不需要。FastComments 托管实时基础设施。你的客户端通过 SDK 订阅,我们负责投递事件。
它们轮询 event log 端点,该端点会返回自某一时间戳以来的每一项变更。而 Node、React Native、Java、Swift 和 C++ 的 SDK 则内置了原生 WebSocket 订阅器。
针对评论,FastComments 会在每次写入时预先计算分页,以获得最佳加载速度,因此即使是超大的线程也能快速分页。
有。开始免费试用,可完整访问 API 和 SDK,无需信用卡。试用结束后,付费方案会随你的流量弹性扩展。
完整的 REST API 和 SDK 参考文档位于 docs.fastcomments.com,其中记录了每一个端点、参数和响应。
可以。FastComments 在 eu.fastcomments.com 提供 EU 区域,且 SDK 支持路由到该区域。
开始免费试用,获取你的 API 密钥,今天就为你的应用添加实时讨论。