From d4565acfe7643fcb053b327d56917893993d21a2 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Wed, 19 Feb 2025 02:24:32 +0000 Subject: [PATCH] Markets widget rate limit fix --- internal/glance/widget-markets.go | 1 + internal/glance/widget-utils.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/internal/glance/widget-markets.go b/internal/glance/widget-markets.go index 63eda1a..93dd9c6 100644 --- a/internal/glance/widget-markets.go +++ b/internal/glance/widget-markets.go @@ -124,6 +124,7 @@ func fetchMarketsDataFromYahoo(marketRequests []marketRequest) (marketList, erro for i := range marketRequests { request, _ := http.NewRequest("GET", fmt.Sprintf("https://query1.finance.yahoo.com/v8/finance/chart/%s?range=1mo&interval=1d", marketRequests[i].Symbol), nil) + setBrowserUserAgentHeader(request) requests = append(requests, request) } diff --git a/internal/glance/widget-utils.go b/internal/glance/widget-utils.go index 77a9d5c..8fb76dd 100644 --- a/internal/glance/widget-utils.go +++ b/internal/glance/widget-utils.go @@ -8,8 +8,11 @@ import ( "errors" "fmt" "io" + "math/rand/v2" "net/http" + "strconv" "sync" + "sync/atomic" "time" ) @@ -35,8 +38,15 @@ type requestDoer interface { Do(*http.Request) (*http.Response, error) } +var userAgentPersistentVersion atomic.Int32 + func setBrowserUserAgentHeader(request *http.Request) { - request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0") + if rand.IntN(2000) == 0 { + userAgentPersistentVersion.Store(rand.Int32N(5)) + } + + version := strconv.Itoa(130 + int(userAgentPersistentVersion.Load())) + request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:"+version+".0) Gecko/20100101 Firefox/"+version+".0") } func decodeJsonFromRequest[T any](client requestDoer, request *http.Request) (T, error) {