/
twitter.go
87 lines (71 loc) · 1.57 KB
/
twitter.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
package providers
import (
"github.com/PuerkitoBio/goquery"
"net/http"
"strconv"
)
type twitter struct{}
// NewTwitter returns a new provider
func NewTwitter() Provider {
return &twitter{}
}
const twitterURL = "https://careers.twitter.com/content/careers-twitter/en/jobs-search.html?q=&team=&location="
func (twitter *twitter) requestJob(url string, fn func(job *Job)) error {
res, err := http.Get(url)
if err != nil {
return err
}
defer res.Body.Close()
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
return err
}
job := Job{
Link: url,
Company: "Twitter",
Type: string(FullTime),
}
doc.Find("h1").First().Each(func(i int, s *goquery.Selection) {
job.Title = s.Text()
})
doc.Find("#main-content div div div div div").Each(func(i int, s *goquery.Selection) {
if i == 1 {
job.Location = s.Text()
} else if i == 2 {
job.Desc = s.Text()
}
})
fn(&job)
return nil
}
func (twitter *twitter) RetrieveJobs(fn func(job *Job)) error {
i := 0
ni := -1
for ni != i {
ni = i
res, err := http.Get(twitterURL + "&start=" + strconv.Itoa(i))
if err != nil {
return err
}
if res.StatusCode != 200 {
return handleStatus(res)
}
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
return err
}
doc.Find(".job-search-entries .job-search-item a").Each(func(j int, s *goquery.Selection) {
url, ok := s.Attr("href")
if !ok {
return
}
i++
err = twitter.requestJob("https://careers.twitter.com"+url, fn)
})
res.Body.Close()
if err != nil {
return err
}
}
return nil
}