Files
go-extractor/sites/useragents/useragents.go
Steve Dudenhoeffer cb2ed10cfd
Some checks failed
CI / build (push) Failing after 2m4s
CI / test (push) Failing after 2m6s
CI / vet (push) Failing after 2m19s
refactor: restructure API, deduplicate code, expand test coverage
- Extract shared DeferClose helper, removing 14 duplicate copies
- Rename PlayWright-prefixed types to cleaner names (BrowserOptions,
  BrowserSelection, NewBrowser, etc.)
- Rename fields: ServerAddress, RequireServer (was DontLaunchOnConnectFailure)
- Extract shared initBrowser/mergeOptions into browser_init.go,
  deduplicating ~120 lines between NewBrowser and NewInteractiveBrowser
- Remove unused locator field from document struct
- Add tests for all previously untested packages (archive, aislegopher,
  wegmans, useragents, powerball) and expand existing test suites
- Add MIGRATION.md documenting all breaking API changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 13:59:47 -05:00

67 lines
1.3 KiB
Go

package useragents
import (
"context"
"encoding/json"
"fmt"
"gitea.stevedudenhoeffer.com/steve/go-extractor"
)
type Config struct{}
var DefaultConfig = Config{}
func GetMostCommonDesktopUserAgent(ctx context.Context, b extractor.Browser) (string, error) {
return DefaultConfig.GetMostCommonDesktopUserAgent(ctx, b)
}
func (c Config) GetMostCommonDesktopUserAgent(ctx context.Context, b extractor.Browser) (string, error) {
doc, err := b.Open(ctx, "https://www.useragents.me/", extractor.OpenPageOptions{})
if err != nil {
return "", fmt.Errorf("failed to open useragents.me: %w", err)
}
defer extractor.DeferClose(doc)
s := doc.Select("#most-common-desktop-useragents-json-csv > div:nth-child(1) > textarea:nth-child(4)")
text := ""
for _, el := range s {
t, err := el.Content()
if err != nil {
return "", fmt.Errorf("failed to get text: %w", err)
}
text += t
}
data := []map[string]any{}
err = json.Unmarshal([]byte(text), &data)
if err != nil {
return "", err
}
highestAgent := ""
highestPct := 0.0
for _, agent := range data {
pct, ok := agent["pct"].(float64)
if !ok {
continue
}
if pct > highestPct {
ua, ok := agent["ua"].(string)
if !ok {
continue
}
highestPct = pct
highestAgent = ua
}
}
return highestAgent, nil
}