Upwork-Jobs-scraper-/upwork/upworkClient.go
2024-08-03 22:53:13 +05:00

104 lines
2.1 KiB
Go

package upwork
import (
"bufio"
"encoding/json"
"log"
"os"
"scrapers/network"
"strings"
)
type Upwork struct {
UpworkHttpClient *network.Client
}
type GraphQLRequest struct {
Query string `json:"query"`
Variables map[string]interface{} `json:"variables"`
}
func (u Upwork) SendRequest(query string, variables map[string]interface{}) (string, error) {
url := "https://www.upwork.com/api/graphql/v1"
requestBody := GraphQLRequest{
Query: query,
Variables: variables,
}
jsonBody, err := json.Marshal(requestBody)
if err != nil {
return "", err
}
resp, err := u.UpworkHttpClient.PostRequest(url, string(jsonBody))
if err != nil {
return "", err
}
return resp.Body, nil
}
func readGraphQLQuery(filename string) (string, error) {
content, err := os.ReadFile(filename)
if err != nil {
return "", err
}
return string(content), nil
}
func mergeMaps(m1, m2 map[string]string) map[string]string {
for k, v := range m2 {
m1[k] = v
}
return m1
}
func readEnv(filename string) (map[string]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
m := make(map[string]string)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
parts := strings.SplitN(scanner.Text(), "=", 2)
if len(parts) == 2 {
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
m[key] = value
}
}
return m, nil
}
func InitUpwork() *Upwork {
headers := map[string]string{
"authority": "www.upwork.com",
"accept": "application/json, text/plain",
"accept-language": "en",
"content-type": "application/json",
"cache-control": "no-cache",
"pragma": "no-cache",
"referer": "https://www.upwork.com/search/jobs/",
"sec-fetch-site": "same-origin",
"sec-gpc": "1",
"x-requested-with": "XMLHttpRequest",
}
auth_headers, err := readEnv("upwork/.env")
if err != nil {
log.Fatal("Could not read .env file, please add .env file in upwork folder")
}
headers = mergeMaps(auth_headers, headers)
client := network.InitClient(headers)
upwork := Upwork{
UpworkHttpClient: client,
}
return &upwork
}