-
Notifications
You must be signed in to change notification settings - Fork 0
/
insta.go
134 lines (118 loc) · 2.97 KB
/
insta.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// goinsta is a a complete instagram library
// NewInfo returns a new info pointer
// By using this pointer you can access
// the functions implemented by Info
// func NewInfo(url, dest string) *Info
// GetImage is used to download an image from instagram link
// we need to provide image link, destination in which we
// need to download the image and the file name
// returned a success flag and an error message
// func GetImage(url, dest string) (bool, error)
// which returns a success flag and a error meassage
// if the operation works correctly, it will return a true and error will be nil
// if the operation failed, it will return false and the corresponding error message
// _, err := goinsta.GetImage("https://www.instagram.com/dyfgsuyswyer47477834982","/home/user/")
// if err != nil {
// log.Fatal(err)
// }
// After the successful execution you will receive a
// success message aling with the path and name of the image downloaded
package goinsta
import (
"io/ioutil"
"log"
"net/http"
"regexp"
"strings"
"github.com/Ashwin-Rajeev/goerror"
"golang.org/x/net/html"
)
// Info struct stores the image information
type Info struct {
Crawler
}
type information struct {
content []byte
url string
dest string
}
// ParseHTML is a function used to parse the url response
func (i *information) parseHTML() error {
doc, err := html.Parse(strings.NewReader(string(i.content)))
if err != nil {
return err
}
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "meta" {
for _, a := range n.Attr {
if a.Key == "content" {
matched, err := regexp.MatchString(
"https://.*..jpg",
a.Val,
)
if err != nil {
log.Fatal(goerror.GetErrorInfo(err))
}
if matched {
img, err := image(a.Val)
if err != nil {
log.Fatal(goerror.GetErrorInfo(err))
}
err = i.writeFile(
img,
i.dest,
)
if err != nil {
log.Fatal(goerror.GetErrorInfo(err))
}
}
break
}
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
f(doc)
return nil
}
func (i *information) get() error {
resp, err := http.Get(i.url)
if err != nil {
return err
}
defer resp.Body.Close()
i.content, err = ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
return nil
}
// GetImage is used to download an image from instagram link
// we need to provide image link, destination in which we
// need to download the image and the file name
// returned a success flag and an error message
func (i *Info) GetImage() (bool, error) {
err := i.get()
if err != nil {
return false, goerror.GetErrorInfo(err)
}
err = i.parseHTML()
if err != nil {
return false, goerror.GetErrorInfo(err)
}
return true, nil
}
// NewInfo returns a new info pointer
// By using this pointer you can access
// the functions implemented by Info
func NewInfo(url, dest string) *Info {
return &Info{
Crawler: &information{
url: url,
dest: dest,
},
}
}