98 lines
2.9 KiB
Plaintext
98 lines
2.9 KiB
Plaintext
syntax = "v1"
|
||
|
||
type (
|
||
ThreadsAccountPublic {
|
||
Id string `json:"id"`
|
||
Username string `json:"username"`
|
||
DisplayName string `json:"display_name"`
|
||
Connection string `json:"connection"` // connected|error|disconnected
|
||
IsUsable bool `json:"is_usable"`
|
||
AvatarColor string `json:"avatar_color,optional"`
|
||
AvatarUrl string `json:"avatar_url,optional"`
|
||
ErrorMessage string `json:"error_message,optional"`
|
||
SessionExpiresAt int64 `json:"session_expires_at,optional"`
|
||
SessionRefreshedAt int64 `json:"session_refreshed_at,optional"`
|
||
// never expose access_token / refresh_token
|
||
}
|
||
|
||
ThreadsAccountListData {
|
||
List []ThreadsAccountPublic `json:"list"`
|
||
}
|
||
|
||
ThreadsOAuthStartData {
|
||
AuthorizeUrl string `json:"authorize_url"`
|
||
State string `json:"state"`
|
||
}
|
||
|
||
// Callback is query-string from Meta / fake provider (public).
|
||
ThreadsOAuthCallbackReq {
|
||
Code string `form:"code,optional"`
|
||
State string `form:"state,optional"`
|
||
Error string `form:"error,optional"`
|
||
ErrorReason string `form:"error_reason,optional"`
|
||
ErrorDescription string `form:"error_description,optional"`
|
||
}
|
||
|
||
ThreadsOAuthCallbackData {
|
||
Ok bool `json:"ok"`
|
||
Message string `json:"message,optional"`
|
||
// RedirectURL for custom handler (browser flow)
|
||
RedirectUrl string `json:"redirect_url,optional"`
|
||
}
|
||
|
||
ThreadsAccountIdPath {
|
||
Id string `path:"id"`
|
||
}
|
||
|
||
// 擴充(含舊版)匯入 Chrome storageState;寫入 scout crawler-session 供 dev 模式海巡
|
||
ImportThreadsAccountSessionReq {
|
||
// path id + body
|
||
Id string `path:"id"`
|
||
StorageState string `json:"storageState"`
|
||
}
|
||
|
||
ImportThreadsAccountSessionData {
|
||
Success bool `json:"success"`
|
||
Valid bool `json:"valid"`
|
||
Synced bool `json:"synced"`
|
||
AccountId string `json:"account_id"`
|
||
Username string `json:"username,optional"`
|
||
Message string `json:"message"`
|
||
UpdateAt int64 `json:"update_at,optional"`
|
||
}
|
||
)
|
||
|
||
// Public OAuth callback (no JWT)
|
||
@server (
|
||
group: threads
|
||
prefix: /api/v1/threads-accounts
|
||
)
|
||
service gateway {
|
||
@handler ThreadsOAuthCallback
|
||
get /oauth/callback (ThreadsOAuthCallbackReq) returns (ThreadsOAuthCallbackData)
|
||
}
|
||
|
||
@server (
|
||
jwt: Auth
|
||
group: threads
|
||
prefix: /api/v1/threads-accounts
|
||
middleware: AuthJWT
|
||
)
|
||
service gateway {
|
||
@handler ThreadsOAuthStart
|
||
get /oauth/start returns (ThreadsOAuthStartData)
|
||
|
||
@handler ListThreadsAccounts
|
||
get / returns (ThreadsAccountListData)
|
||
|
||
@handler RefreshThreadsAccount
|
||
post /:id/refresh (ThreadsAccountIdPath) returns (ThreadsAccountPublic)
|
||
|
||
// Chrome 擴充:匯入 Playwright storageState(舊路徑相容;實際存 crawler session)
|
||
@handler ImportThreadsAccountSession
|
||
post /:id/session/import (ImportThreadsAccountSessionReq) returns (ImportThreadsAccountSessionData)
|
||
|
||
@handler DisconnectThreadsAccount
|
||
delete /:id (ThreadsAccountIdPath) returns (OkData)
|
||
}
|