@flung.dev/sdk (英语)
为 Flung API 输入的 TypeScript 客户端: 安排并发布社交媒体帖子,连接账户,管理webhook端点和 API 密钥,并验证webhooks Flung 发送. 它随处可见 fetch 和WebCrypto:节点20+, Cloudflare工人,德诺, Bun.
import { Flung } from '@flung.dev/sdk'
const flung = new Flung({ apiKey: process.env.FLUNG_API_KEY! })
const { data: accounts } = await flung.accounts.list()
const post = await flung.posts.create({
content: 'Launching today.',
accountIds: accounts.map((account) => account.id),
publishAt: '2026-11-01T09:00:00.000Z',
})
把钥匙放在服务器上 SDK的谈话 https://api.flung.dev; 通过 baseUrl: 'https://api-preview.flung.dev' 来测试预览.
行为
- 错误. 失败的调用
FlungError与status,一个马厩code(单位:千美元)unknown_accounts, (中文(简体) ),account_needs_reconnect, (中文(简体) ),network_error,(......)和details部门code;消息可能会改变. - 复问. 网络故障,超时, 408, 409, 429 和 5xx 默认要重复两次, 并有焦急的后退, 荣誉
Retry-After设置maxRetries财务报告和审定财务报表timeoutMs在建筑师. - 引证无能. 每个POST都带一个
Idempotency-Key生成,除非您通过'idempotency-key',所以重试 从来没有安排两次帖子。 传出你自己的钥匙,比如一个命令ID, 让你自己的回想安全了. - 平起处.
for await (const post of flung.paginate((page) => flung.posts.list(page), { limit: 100 }))每一页.
时区
在协调世界时,每一次都有Flung商店. 给 publishAt 或作为瞬间 Z 或抵消,或如某人在当地时间所说的,没有抵消,而Flung在服务器上转换:
// 9am in Athens on 3 November, whatever zone this code runs in.
const post = await flung.posts.create({
content: 'Kalimera.',
accountIds,
publishAt: '2026-11-03T09:00',
timeZone: 'Europe/Athens',
})
post.publishAt // '2026-11-03T07:00:00.000Z', in UTC
post.publishAtLocal // '2026-11-03T09:00:00+02:00'
post.timeZone // 'Europe/Athens'
无 timeZone,本地时间在 OAuth 符号背后的人所在区域读取,否则工作空间的默认区域(如 API 密钥),否则UTC. flung.me.get() 说: timeZone, (中文(简体) ), timeZoneSource (单位:千美元)user, (中文(简体) ), workspace 或者说 default和时间作为现在 nowLocal。当地时间,春季的时钟会跳过空隙向前移动,秋季的时钟会跳过两次,时间更早;或者增加一个条目 post.warnings (单位:千美元)local_time_skipped, (中文(简体) ), local_time_ambiguous) (中文(简体) ). 非 IANA 名称的区域被拒绝 invalid_time_zone时间与 Z 或抵消工作完全如前.
图像和视频
const photo = await flung.uploadMedia(await readFile('launch.png'), { contentType: 'image/png' })
await flung.posts.create({ content: 'Launching today.', accountIds, mediaIds: [photo.id] })
// Or let Flung fetch a file that is already online:
const clip = await flung.media.import({ url: 'https://example.com/launch.mp4' })
JPEG、PNG和WebP最多可达20 MB、GIF 15 MB、MP4和QuickTime 1 GB; uploadMedia 发送超过100MB的东西 一部分。 检查文件的真实类型.
| 平台 | 带 |
|---|---|
| 内存 | 10个图像, 或最多300 MB 的里尔 |
| 线索 | 20个图像或视频 |
| 脸书 | 10张照片或视频 |
| 页:1 | 4个最多为5 MB的图像,或 GIF 或最多为 512 MB 的视频 |
| 链接 | 9个图像,或最多200 MB的视频 |
| 马斯多登 | 4个图像, 或最多40 MB 的视频 |
| 解析器 | 10 个文件至 10 MB |
| 布鲁斯基 | 4个最多 1 MB 的图像, 或最多 100 MB 的视频 |
| 兴趣 | 5个图像,或1GB以下的视频,被固定在帖子上或账户默认值上 |
| 法克斯特语Name | 2个图像,或最多100 MB的视频,由永久链接嵌入 |
| YouTube, TikTok (英语) | 一个视频 |
一个平台无法携带的帖子在创建时被拒绝,而不是在未能发布时被拒绝.
在没有用户界面的情况下连接账户
// A new account, or flung.accounts.reconnect({ id }) for one that needs it.
const session = await flung.accounts.connect({ platform: 'linkedin' })
console.warn(`Open ${session.authorizationUrl}`)
const done = await flung.waitForConnection(session.id)
if (done.status === 'connected') console.warn('Connected', done.accountIds)
没有 redirectUrl 个人结束于 Flung 自己的“你可以关闭此标签”页。 通过一个让他们回到你的应用程序.
链接 在公司页面中通过自己的应用程序连接: flung.accounts.connect({ platform: 'linkedin', variant: 'pages' }) 连接个人管理的每一页,每页一个账户. flung.platforms.list() 给每个平台的 variants, (中文(简体) ), ['pages'] 链接 一旦设置了网页应用程序.
大多数平台通过同意连接: authorizationUrl 并回到一页。 法克斯特通过批准连接: flung.platforms.list() 给它 connectFlow: 'approval', (中文(简体) ), authorizationUrl 打开Wrpcast(显示它作为链接或QR代码,因为批准通常发生在电话上),没有东西可以重定向,所以 waitForConnection 你是如何学习完成的。 会话没有人同意结束 expired。 。 。 .
每个账户都说如何保持连接: renewal 实值 automatic (Flung刷新它), manual (只有重新连接更新)或 not_needed,与 tokenExpiresAt 财务报告和审定财务报表 reconnectBy。 。 。 . flung.accounts.list({ reconnectBefore }) 找到一个人必须尽快重接的, account.reconnect_required_soon 提前一个星期到达 flung.accounts.refresh({ id }) {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}现在要换个纪念品了 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}现在.
让人们从你的页面连接
您的服务器创建连接符号, 并且 <flung-connect> 从 @flung.dev/connect 在浏览器中使用它。 符号只能列出,连接,再连接和断开账户,从您命名的出处,直到到期.
const { token } = await flung.connectTokens.create({ origins: ['https://app.example.com'], expiresIn: 900 })
每个客户一个简介
当您的产品的用户各自连接到自己的账户时,给每个用户一个配置,由自己的用户代号作为 externalId的连接符号 profileId 以物配主,而视其账目.
const profile = await flung.profiles.create({ name: 'Acme Studio', externalId: 'user_8412' })
const { token } = await flung.connectTokens.create({ origins: ['https://app.example.com'], profileId: profile.id })
const { data: accounts } = await flung.accounts.list({ profileId: profile.id })
await flung.posts.create({ content: 'Hello', accountIds: accounts.map((account) => account.id), profileId: profile.id })
flung.profiles.list({ externalId }) 再找一个档案. flung.profiles.delete({ id }) 断开其账户并取消其预定员额.
一个简介(一个品牌,在Flung门户网站)在每个平台最多有一个账户;一个链接 在页面中,除了个人资料之外,还要计算. flung.billing.get() 给出限制为 limits.accountsPerPlatformPerProfile,以及计划允许的配置图。 将平台的第二个账户连接到相同的配置文件 FlungError 带代码 platform_limit_reached,其 details 命名平台、配置和 upgradeUrl。重新连接它已经持有的账户永远不会被拒绝.
绘图图
当一个工作空间已经连接 Plotwork 时, 它的图表可以直接进入一个帖子: importDiagram plotwork 将图画成 PNG 并保留为带有备选案文的媒体文件.
const { data: diagrams } = await flung.plotwork.listDiagrams({ q: 'architecture' })
const media = await flung.plotwork.importDiagram({ id: diagrams[0].id, width: 1600, scheme: 'light' })
await flung.posts.create({ content: 'How it fits together', accountIds, mediaIds: [media.id] })
flung.plotwork.get() 说明Plotwork是否由谁连接.
网络呼号
import { verifyWebhook } from '@flung.dev/sdk'
const event = await verifyWebhook({ body: rawBody, headers: request.headers, secret: process.env.FLUNG_WEBHOOK_SECRET! })
if (event.type === 'post.published') console.warn(event.data.post.id)
传出生身,不是再序取出. 在秘密旋转过程中 带着新旧秘密 秘密24小时 secret 切换时也同时使用。 事件遵循标准Webhooks的规格,所以任何标准Webhooks库也验证它们.
标准
代码如下:
目录
| 路径 | 目的 |
|---|---|
openapi-ts.config.ts | 嘿- api 设置: 1 FlungApi 按操作 id 、 平分参数、 扔出错误来进行分类。 读取 ../../spec/openapi.json。 。 。 . |
src/generated/ | 生成的客户端 。 未犯; generate 在每个类型检查、测试和构建之前重建它. |
src/client.ts | Flung: 配置的客户端, 重试, 偶数键, paginate, (中文(简体) ), uploadMedia, (中文(简体) ), waitForConnection. 与 flung-app 相当 packages/sdk/src/client.ts他们的合同测试 运行它与API本身. |
src/errors.ts | FlungError。 。 。 . |
src/webhooks.ts | verifyWebhook 键入 FlungWebhookEvent。 。 。 . |
src/__tests__/ | 客户端反对脚本解答,Webhooks签名作为工作工人签名. |
tsdown.config.ts | 套装 dist/index.js 财务报告和审定财务报表 dist/index.d.ts 为npm。 由TypeScript 6所建造:hey-api需要编译器API TypeScript 7不再出动. |