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)
|
|||
|
|
}
|