feat(core): add rate-limit handler
This commit is contained in:
parent
65ee6e91f5
commit
0a701b19b4
6 changed files with 51 additions and 13 deletions
4
Makefile
4
Makefile
|
@ -5,3 +5,7 @@ all:
|
||||||
.PHONY clean:
|
.PHONY clean:
|
||||||
clean:
|
clean:
|
||||||
rm -rfv build/*
|
rm -rfv build/*
|
||||||
|
|
||||||
|
.PHONY lint:
|
||||||
|
lint:
|
||||||
|
golangci-lint run .
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
func GetContent(guest structs.Guest, id string) (structs.Content, error) {
|
func GetContent(guest structs.Guest, id string) (structs.Content, error) {
|
||||||
body, err := misc.Fetch(
|
body, err := misc.Fetch(
|
||||||
"GET",
|
"GET",
|
||||||
misc.API_URL+"/contents/"+id+"?wt=4fd6sg89d7s6",
|
misc.ApiUrl+"/contents/"+id+"?wt=4fd6sg89d7s6",
|
||||||
bytes.NewBuffer([]byte(`{}`)),
|
bytes.NewBuffer([]byte(`{}`)),
|
||||||
[]misc.HeaderType{
|
[]misc.HeaderType{
|
||||||
{Key: "Authorization", Value: fmt.Sprintf("Bearer %s", guest.Data.Token)},
|
{Key: "Authorization", Value: fmt.Sprintf("Bearer %s", guest.Data.Token)},
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
func GetGuest() (structs.Guest, error) {
|
func GetGuest() (structs.Guest, error) {
|
||||||
body, err := misc.Fetch(
|
body, err := misc.Fetch(
|
||||||
"POST",
|
"POST",
|
||||||
misc.API_URL+"/accounts",
|
misc.ApiUrl+"/accounts",
|
||||||
bytes.NewBuffer([]byte(`{}`)),
|
bytes.NewBuffer([]byte(`{}`)),
|
||||||
[]misc.HeaderType{},
|
[]misc.HeaderType{},
|
||||||
)
|
)
|
||||||
|
@ -31,7 +31,7 @@ func GetGuest() (structs.Guest, error) {
|
||||||
|
|
||||||
body, err = misc.Fetch(
|
body, err = misc.Fetch(
|
||||||
"GET",
|
"GET",
|
||||||
misc.API_URL+"/accounts/"+preGuest.Data.Id,
|
misc.ApiUrl+"/accounts/"+preGuest.Data.Id,
|
||||||
bytes.NewBuffer([]byte(`{}`)),
|
bytes.NewBuffer([]byte(`{}`)),
|
||||||
[]misc.HeaderType{
|
[]misc.HeaderType{
|
||||||
{Key: "Authorization", Value: fmt.Sprintf("Bearer %s", preGuest.Data.Token)},
|
{Key: "Authorization", Value: fmt.Sprintf("Bearer %s", preGuest.Data.Token)},
|
||||||
|
|
37
app.go
37
app.go
|
@ -4,21 +4,50 @@ import (
|
||||||
"GofileScrapper/api"
|
"GofileScrapper/api"
|
||||||
"GofileScrapper/misc"
|
"GofileScrapper/misc"
|
||||||
"GofileScrapper/structs"
|
"GofileScrapper/structs"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type oldContent struct {
|
||||||
|
id string
|
||||||
|
retries int
|
||||||
|
}
|
||||||
|
|
||||||
func run(guest structs.Guest) []structs.Content {
|
func run(guest structs.Guest) []structs.Content {
|
||||||
var contents []structs.Content
|
var contents []structs.Content
|
||||||
|
|
||||||
for i := 0; i < 10; i++ {
|
old := oldContent{
|
||||||
id := misc.GetRandomContent()
|
id: misc.GetRandomContent(),
|
||||||
content, err := api.GetContent(guest, id)
|
retries: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < misc.MaxPerThread; i++ {
|
||||||
|
if old.retries == misc.MaxRetries {
|
||||||
|
old = oldContent{
|
||||||
|
id: misc.GetRandomContent(),
|
||||||
|
retries: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
content, err := api.GetContent(guest, old.id)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
misc.Logger.Error().Msg(err.Error())
|
misc.Logger.Error().Msg(err.Error())
|
||||||
|
} else {
|
||||||
|
if content.Status == "error-rateLimit" {
|
||||||
|
old.retries += 1
|
||||||
|
misc.Logger.Info().Msg(fmt.Sprintf("Rate limit reached, waiting %ds...", misc.WaitingRetryTime))
|
||||||
|
time.Sleep(misc.WaitingRetryTime * time.Second)
|
||||||
} else {
|
} else {
|
||||||
contents = append(contents, content)
|
contents = append(contents, content)
|
||||||
|
|
||||||
|
if content.Status != "error-notFound" {
|
||||||
|
out, _ := json.Marshal(content)
|
||||||
|
misc.Logger.Debug().Msg(string(out))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +57,7 @@ func run(guest structs.Guest) []structs.Content {
|
||||||
func main() {
|
func main() {
|
||||||
var guests []structs.Guest
|
var guests []structs.Guest
|
||||||
|
|
||||||
for i := 0; i < misc.GUEST_COUNT; i++ {
|
for i := 0; i < misc.GuestCount; i++ {
|
||||||
guest, err := api.GetGuest()
|
guest, err := api.GetGuest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
misc.Logger.Error().Msg(err.Error())
|
misc.Logger.Error().Msg(err.Error())
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
package misc
|
package misc
|
||||||
|
|
||||||
var CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
const Charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
var API_URL = "https://api.gofile.io"
|
const ApiUrl = "https://api.gofile.io"
|
||||||
|
|
||||||
var GUEST_COUNT = 5
|
const GuestCount = 5
|
||||||
|
|
||||||
|
const MaxRetries = 5
|
||||||
|
const WaitingRetryTime = 5
|
||||||
|
|
||||||
|
const MaxPerThread = 30
|
||||||
|
|
|
@ -10,11 +10,11 @@ func GetRandomContent() string {
|
||||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
|
||||||
var result strings.Builder
|
var result strings.Builder
|
||||||
charsetLength := len(CHARSET)
|
charsetLength := len(Charset)
|
||||||
|
|
||||||
for i := 0; i < 6; i++ {
|
for i := 0; i < 6; i++ {
|
||||||
randomIndex := r.Intn(charsetLength)
|
randomIndex := r.Intn(charsetLength)
|
||||||
result.WriteByte(CHARSET[randomIndex])
|
result.WriteByte(Charset[randomIndex])
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.String()
|
return result.String()
|
||||||
|
|
Loading…
Reference in a new issue