mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-04 13:52:26 +08:00
249 lines
5.3 KiB
Go
249 lines
5.3 KiB
Go
// Package main provides ...
|
|
// Get article' comments count
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/deepzz0/logd"
|
|
"github.com/eiblog/eiblog/setting"
|
|
)
|
|
|
|
var ErrDisqusConfig = errors.New("disqus config incorrect")
|
|
|
|
// 定时获取所有文章评论数量
|
|
type postsCountResp struct {
|
|
Code int
|
|
Response []struct {
|
|
Id string
|
|
Posts int
|
|
Identifiers []string
|
|
}
|
|
}
|
|
|
|
func PostsCount() error {
|
|
if setting.Conf.Disqus.PostsCount == "" ||
|
|
setting.Conf.Disqus.PublicKey == "" ||
|
|
setting.Conf.Disqus.ShortName == "" {
|
|
return ErrDisqusConfig
|
|
}
|
|
|
|
time.AfterFunc(time.Duration(setting.Conf.Disqus.Interval)*time.Hour, func() {
|
|
err := PostsCount()
|
|
if err != nil {
|
|
logd.Error(err)
|
|
}
|
|
})
|
|
|
|
baseUrl := setting.Conf.Disqus.PostsCount +
|
|
"?api_key=" + setting.Conf.Disqus.PublicKey +
|
|
"&forum=" + setting.Conf.Disqus.ShortName + "&"
|
|
var count, index int
|
|
for index < len(Ei.Articles) {
|
|
var threads []string
|
|
for ; index < len(Ei.Articles) && count < 50; index++ {
|
|
artc := Ei.Articles[index]
|
|
threads = append(threads, fmt.Sprintf("thread:ident=post-%s", artc.Slug))
|
|
count++
|
|
}
|
|
count = 0
|
|
url := baseUrl + strings.Join(threads, "&")
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if resp.StatusCode != http.StatusOK {
|
|
return errors.New(string(b))
|
|
}
|
|
|
|
result := &postsCountResp{}
|
|
err = json.Unmarshal(b, result)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, v := range result.Response {
|
|
i := strings.Index(v.Identifiers[0], "-")
|
|
artc := Ei.MapArticles[v.Identifiers[0][i+1:]]
|
|
if artc != nil {
|
|
artc.Count = v.Posts
|
|
artc.Thread = v.Id
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// 获取文章评论列表
|
|
type postsListResp struct {
|
|
Cursor struct {
|
|
HasNext bool
|
|
Next string
|
|
}
|
|
Code int
|
|
Response []postDetail
|
|
}
|
|
|
|
type postDetail struct {
|
|
Parent int
|
|
Id string
|
|
CreatedAt string
|
|
Message string
|
|
IsDeleted bool
|
|
Author struct {
|
|
Name string
|
|
ProfileUrl string
|
|
Avatar struct {
|
|
Cache string
|
|
}
|
|
}
|
|
Thread string
|
|
}
|
|
|
|
func PostsList(slug, cursor string) (*postsListResp, error) {
|
|
if setting.Conf.Disqus.PostsList == "" ||
|
|
setting.Conf.Disqus.PublicKey == "" ||
|
|
setting.Conf.Disqus.ShortName == "" {
|
|
return nil, ErrDisqusConfig
|
|
}
|
|
|
|
url := setting.Conf.Disqus.PostsList + "?limit=50&api_key=" +
|
|
setting.Conf.Disqus.PublicKey + "&forum=" + setting.Conf.Disqus.ShortName +
|
|
"&cursor=" + cursor + "&thread:ident=post-" + slug
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, errors.New(string(b))
|
|
}
|
|
|
|
result := &postsListResp{}
|
|
err = json.Unmarshal(b, result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
type PostCreate struct {
|
|
Message string `json:"message"`
|
|
Parent string `json:"parent"`
|
|
Thread string `json:"thread"`
|
|
AuthorEmail string `json:"author_email"`
|
|
AuthorName string `json:"autor_name"`
|
|
IpAddress string `json:"ip_address"`
|
|
Identifier string `json:"identifier"`
|
|
UserAgent string `json:"user_agent"`
|
|
}
|
|
|
|
type postCreateResp struct {
|
|
Code int
|
|
Response postDetail
|
|
}
|
|
|
|
// 评论文章
|
|
func PostComment(pc *PostCreate) (*postCreateResp, error) {
|
|
if setting.Conf.Disqus.PostsList == "" ||
|
|
setting.Conf.Disqus.PublicKey == "" ||
|
|
setting.Conf.Disqus.ShortName == "" {
|
|
return nil, ErrDisqusConfig
|
|
}
|
|
url := setting.Conf.Disqus.PostCreate +
|
|
"?api_key=E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F" +
|
|
"&message=" + pc.Message + "&parent=" + pc.Parent +
|
|
"&thread=" + pc.Thread + "&author_email=" + pc.AuthorEmail +
|
|
"&author_name=" + pc.AuthorName
|
|
|
|
request, err := http.NewRequest("POST", url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
request.Header.Set("Referer", "https://disqus.com")
|
|
resp, err := http.DefaultClient.Do(request)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return nil, errors.New(string(b))
|
|
}
|
|
result := &postCreateResp{}
|
|
err = json.Unmarshal(b, result)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
// 批准评论通过
|
|
type approvedResp struct {
|
|
Code int `json:"code"`
|
|
Response []struct {
|
|
Id string `json:"id"`
|
|
} `json:"response"`
|
|
}
|
|
|
|
func PostApprove(post string) error {
|
|
if setting.Conf.Disqus.PostsList == "" ||
|
|
setting.Conf.Disqus.PublicKey == "" ||
|
|
setting.Conf.Disqus.ShortName == "" {
|
|
return ErrDisqusConfig
|
|
}
|
|
|
|
url := setting.Conf.Disqus.PostApprove +
|
|
"?api_key=" + setting.Conf.Disqus.PublicKey +
|
|
"&access_token=" + setting.Conf.Disqus.AccessToken +
|
|
"&post=" + post
|
|
request, err := http.NewRequest("POST", url, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
request.Header.Set("Referer", "https://disqus.com")
|
|
resp, err := http.DefaultClient.Do(request)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
return errors.New(string(b))
|
|
}
|
|
|
|
result := &approvedResp{}
|
|
err = json.Unmarshal(b, result)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|