-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathgetall.go
85 lines (72 loc) · 2.22 KB
/
getall.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
package instago
import (
"encoding/json"
"strings"
"time"
)
// Given user name, return IGMedia struct of all posts of the user with logged in status.
func (m *IGApiManager) GetAllPostMedia(username string) (medias []IGMedia, err error) {
ui, err := m.GetUserInfo(username)
if err != nil {
return
}
for _, node := range ui.EdgeOwnerToTimelineMedia.Edges {
medias = append(medias, node.Node)
}
hasNextPage := ui.EdgeOwnerToTimelineMedia.PageInfo.HasNextPage
// "first" cannot be 300 now. cannot be 100 either. 50 is ok.
vartmpl := strings.Replace(`{"id":"<ID>","first":50,"after":"<ENDCURSOR>"}`, "<ID>", ui.Id, 1)
variables := strings.Replace(vartmpl, "<ENDCURSOR>", ui.EdgeOwnerToTimelineMedia.PageInfo.EndCursor, 1)
for hasNextPage == true {
url := urlGraphql + variables
b, err := m.getHTTPResponse(url, "GET")
if err != nil {
return medias, err
}
d := dataUserMedia{}
if err = json.Unmarshal(b, &d); err != nil {
return medias, err
}
for _, node := range d.Data.User.EdgeOwnerToTimelineMedia.Edges {
medias = append(medias, node.Node)
}
hasNextPage = d.Data.User.EdgeOwnerToTimelineMedia.PageInfo.HasNextPage
variables = strings.Replace(vartmpl, "<ENDCURSOR>", d.Data.User.EdgeOwnerToTimelineMedia.PageInfo.EndCursor, 1)
printPostCount(len(medias), url)
if hasNextPage {
// sleep 20 seconds to prevent http 429 (too many requests)
time.Sleep(20 * time.Second)
}
}
return
}
// Given user name, return codes of all posts of the user with logged in status.
func (m *IGApiManager) GetAllPostCode(username string) (codes []string, err error) {
medias, err := m.GetAllPostMedia(username)
if err != nil {
return
}
for _, media := range medias {
codes = append(codes, media.Shortcode)
}
return
}
// Given a user id, return all story highlights of the user.
func (m *IGApiManager) GetAllStoryHighlights(userid string) (trays []IGStoryHighlightsTray, err error) {
subtrays, err := m.GetUserStoryHighlights(userid)
if err != nil {
return
}
for _, tray := range subtrays {
if len(tray.GetItems()) == 0 {
tt, err := m.GetHighlightsReelsMedia(tray.Id)
if err != nil {
return trays, err
}
trays = append(trays, tt)
} else {
trays = append(trays, tray)
}
}
return
}