-
Notifications
You must be signed in to change notification settings - Fork 3
/
main.go
118 lines (93 loc) · 2.46 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package main
import (
"compress/gzip"
"io"
"log"
"net"
"net/http"
"net/url"
"os"
"regexp"
"time"
"github.com/andybalholm/brotli"
"github.com/gofiber/fiber/v2"
)
var client *http.Client
func main() {
proxy := os.Getenv("PROXY")
var httpProxy func(*http.Request) (*url.URL, error)
if proxy != "" {
proxyUrl, _ := url.Parse(proxy)
httpProxy = http.ProxyURL(proxyUrl)
}
client = &http.Client{
Transport: &http.Transport{
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
ResponseHeaderTimeout: 20 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
IdleConnTimeout: 30 * time.Second,
ForceAttemptHTTP2: true,
MaxConnsPerHost: 0,
MaxIdleConnsPerHost: 10,
MaxIdleConns: 0,
Proxy: httpProxy,
},
}
app := fiber.New(
fiber.Config{
Prefork: true,
},
)
// Route for /votes?videoId=:videoId
app.Get("/votes", handleQuery)
// Route for /votes/:videoId
app.Get("/votes/:videoId", handleParam)
log.Fatal(app.Listen(":3000"))
}
func handleQuery(c *fiber.Ctx) error {
videoId := c.Query("videoId")
return getVotes(c, videoId)
}
func handleParam(c *fiber.Ctx) error {
videoId := c.Params("videoId")
return getVotes(c, videoId)
}
func getVotes(c *fiber.Ctx, videoId string) error {
match, _ := regexp.Match("^([a-zA-Z0-9_-]{11})", []byte(videoId))
if !match {
return c.Status(400).SendString("Invalid video id")
}
for {
req, _ := http.NewRequest("GET", "https://returnyoutubedislikeapi.com/Votes?videoId="+videoId+"&likeCount=", nil)
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0")
req.Header.Add("Accept", "application/json")
req.Header.Add("Accept-Language", "en-US,en;q=0.5")
req.Header.Add("Accept-Encoding", "gzip, deflate, br")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Sec-Fetch-Dest", "empty")
req.Header.Add("Sec-Fetch-Mode", "cors")
req.Header.Add("Sec-Fetch-Site", "same-origin")
resp, err := client.Do(req)
if err != nil {
continue
}
defer resp.Body.Close()
if resp.StatusCode == 429 {
continue
}
ce := resp.Header.Get("Content-Encoding")
var stream io.Reader
if ce == "gzip" {
stream, _ = gzip.NewReader(resp.Body)
} else if ce == "br" {
stream = brotli.NewReader(resp.Body)
} else {
stream = resp.Body
}
return c.Status(resp.StatusCode).SendStream(stream)
}
}