-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtaninari.go
166 lines (136 loc) · 3.26 KB
/
taninari.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package taninari
import (
"encoding/json"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
"regexp"
"strings"
"time"
)
const blogPostEndpoint = "https://api.amebaowndme.com/v2/public/blogPosts?siteId=18381&searchType=recent&limit=15"
var tagRegexp = regexp.MustCompile(`<[\S\s]+?>`)
type BlogPost struct {
Meta struct {
Code int `json:"code"`
Pagination struct {
Total int `json:"total"`
Offset int `json:"offset"`
Limit int `json:"limit"`
Cursors struct {
After string `json:"after"`
Before string `json:"before"`
} `json:"cursors"`
} `json:"pagination"`
} `json:"meta"`
Body []struct {
ID string `json:"id"`
Contents []struct {
Type string `json:"type"`
Format string `json:"format"`
Value string `json:"value"`
Url string `json:"url"`
} `json:"contents"`
PublishedURL string `json:"publishedUrl"`
PublishedAt string `json:"publishedAt"`
} `json:"body"`
}
type GorokuMessage struct {
Text string
ImageURL string
PublishedURL string
PublishedAt string
}
func getBlogPosts(api string) (string, error) {
req, err := http.NewRequest("GET", api, nil)
if err != nil {
return "", err
}
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return "", fmt.Errorf("Error: status code is", res.StatusCode)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
return string(body), nil
}
func parseJson(jsonStr string) (*BlogPost, error) {
jsonBytes := []byte(jsonStr)
blogPost := new(BlogPost)
if err := json.Unmarshal(jsonBytes, blogPost); err != nil {
return nil, err
}
return blogPost, nil
}
func GetAllMessages() ([]*GorokuMessage, error) {
var messages []*GorokuMessage
url := blogPostEndpoint
for {
blogPostsJson, err := getBlogPosts(url)
if err != nil {
return nil, err
}
blogPost, err := parseJson(blogPostsJson)
if err != nil {
return nil, err
}
for _, b := range blogPost.Body {
message := &GorokuMessage{
PublishedURL: b.PublishedURL,
PublishedAt: b.PublishedAt,
}
for _, c := range b.Contents {
if c.Type == "text" {
t := tagRegexp.ReplaceAllString(c.Value, "")
message.Text = t
} else if c.Type == "image" {
message.ImageURL = c.Url
}
}
messages = append(messages, message)
}
if len(messages) >= blogPost.Meta.Pagination.Total {
break
}
url = blogPostEndpoint + "&cursor=" + blogPost.Meta.Pagination.Cursors.After
time.Sleep(5 * time.Millisecond)
}
return messages, nil
}
func SearchMessages(keyword string) ([]*GorokuMessage, error) {
messages, err := GetAllMessages()
if err != nil {
return nil, err
}
var searchMessages []*GorokuMessage
for _, message := range messages {
if strings.Contains(message.Text, keyword) && message.ImageURL == "" {
searchMessages = append(searchMessages, message)
}
}
return searchMessages, nil
}
func GetRandomMessage() (*GorokuMessage, error) {
messages, err := GetAllMessages()
if err != nil {
return nil, err
}
var message *GorokuMessage
for {
rand.Seed(time.Now().UnixNano())
index := rand.Intn(len(messages))
if messages[index].ImageURL == "" {
message = messages[index]
break
}
}
return message, nil
}