thread-master/backend/internal/library/placement/threads_api.go

68 lines
1.7 KiB
Go
Raw Permalink Normal View History

2026-06-26 08:37:04 +00:00
package placement
import (
"context"
"fmt"
"strings"
libthreads "haixun-backend/internal/library/threadsapi"
)
func keywordSearchViaThreadsAPI(ctx context.Context, req DiscoverRequest) ([]DiscoverPost, error) {
token := strings.TrimSpace(req.Member.ThreadsAPIAccessToken)
if token == "" {
return nil, fmt.Errorf("threads api access token not configured for active account")
}
client := libthreads.NewClient(token)
searchType := "TOP"
if req.Recency {
searchType = "RECENT"
}
limit := req.Limit
if limit <= 0 {
limit = 12
}
// Strip site: prefix for API keyword search.
query := strings.TrimSpace(req.Query)
query = strings.TrimPrefix(query, "site:threads.net ")
query = strings.Trim(query, `"`)
if idx := strings.Index(query, " after:"); idx > 0 {
query = strings.TrimSpace(query[:idx])
}
query = strings.Trim(query, `"`)
items, err := client.KeywordSearch(ctx, libthreads.KeywordSearchOptions{
Query: query,
Limit: limit,
SearchType: searchType,
})
if err != nil {
return nil, err
}
out := make([]DiscoverPost, 0, len(items))
for _, item := range items {
text := strings.TrimSpace(item.Text)
if text == "" {
continue
}
permalink := strings.TrimSpace(item.Permalink)
if permalink == "" && item.Username != "" && item.ID != "" {
permalink = "https://www.threads.net/@" + item.Username + "/post/" + item.ID
}
out = append(out, DiscoverPost{
Text: text,
Permalink: permalink,
ExternalID: strings.TrimSpace(item.ID),
Author: strings.TrimSpace(item.Username),
PostedAt: strings.TrimSpace(item.Timestamp),
LikeCount: item.LikeCount,
ReplyCount: item.ReplyCount,
Source: DiscoverThreadsAPI,
})
}
return out, nil
}