From 2825bbfeaeed8b8a4e51819087574718839eefa0 Mon Sep 17 00:00:00 2001 From: deepzz0 Date: Mon, 26 Jun 2017 23:51:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20disqus=20=E8=AF=84?= =?UTF-8?q?=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/app.yml | 3 ++ disqus.go | 132 +++++++++++++++++++++++++++++++-------------- disqus_test.go | 4 ++ front.go | 25 ++++++--- setting/setting.go | 15 +++--- views/disqus.html | 2 +- 6 files changed, 127 insertions(+), 54 deletions(-) diff --git a/conf/app.yml b/conf/app.yml index f79f47a..629e19d 100644 --- a/conf/app.yml +++ b/conf/app.yml @@ -37,12 +37,15 @@ general: disqus: shortname: deepzz publickey: wdSgxRm9rdGAlLKFcFdToBe3GT4SibmV7Y8EjJQ0r4GWXeKtxpopMAeIeoI2dTEg + accesstoken: 50023908f39f4607957e909b495326af postscount: https://disqus.com/api/3.0/threads/set.json postslist: https://disqus.com/api/3.0/threads/listPosts.json postcreate: https://disqus.com/api/3.0/posts/create.json + postapprove: https://disqus.com/api/3.0/posts/approve.json interval: 5 # 谷歌统计 google: + url: https://www.google-analytics.com/collect tid: UA-77251712-1 v: "1" t: pageview diff --git a/disqus.go b/disqus.go index 76d4f39..f0af03d 100644 --- a/disqus.go +++ b/disqus.go @@ -4,16 +4,19 @@ package main import ( "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" "strings" "time" + "github.com/deepzz0/logd" "github.com/eiblog/eiblog/setting" - "github.com/eiblog/utils/logd" ) +var ErrDisqusConfig = errors.New("disqus config incorrect") + type result struct { Code int Response []struct { @@ -23,12 +26,21 @@ type result struct { } } -func PostsCount() { +// 定时获取所有文章评论数量 +func PostsCount() error { if setting.Conf.Disqus.PostsCount == "" || setting.Conf.Disqus.PublicKey == "" || setting.Conf.Disqus.ShortName == "" { - return + 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 + "&" @@ -44,24 +56,22 @@ func PostsCount() { url := baseUrl + strings.Join(threads, "&") resp, err := http.Get(url) if err != nil { - logd.Error(err) - break + return err } defer resp.Body.Close() + b, err := ioutil.ReadAll(resp.Body) if err != nil { - logd.Error(err) - break + return err } if resp.StatusCode != http.StatusOK { - logd.Error(string(b)) - break + return errors.New(string(b)) } + rst := result{} err = json.Unmarshal(b, &rst) if err != nil { - logd.Error(err) - break + return err } for _, v := range rst.Response { i := strings.Index(v.Identifiers[0], "-") @@ -72,7 +82,8 @@ func PostsCount() { } } } - time.AfterFunc(time.Duration(setting.Conf.Disqus.Interval)*time.Hour, PostsCount) + + return nil } type postsList struct { @@ -97,35 +108,34 @@ type postsList struct { } } -func PostsList(slug, cursor string) *postsList { - if setting.Conf.Disqus.PostsList == "" || setting.Conf.Disqus.PublicKey == "" || setting.Conf.Disqus.ShortName == "" { - return nil +// 获取文章评论列表 +func PostsList(slug, cursor string) (*postsList, 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 { - logd.Error(err) - return nil + return nil, err } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { - logd.Error(err) - return nil + return nil, err } if resp.StatusCode != http.StatusOK { - logd.Error(string(b)) - return nil + return nil, errors.New(string(b)) } pl := &postsList{} err = json.Unmarshal(b, pl) if err != nil { - logd.Error(err) - return nil + return nil, err } - return pl + return pl, nil } type PostCreate struct { @@ -146,9 +156,12 @@ type PostResponse struct { } `json:"response"` } -func PostComment(pc *PostCreate) string { - if setting.Conf.Disqus.PostsList == "" || setting.Conf.Disqus.PublicKey == "" || setting.Conf.Disqus.ShortName == "" { - return "" +// 评论文章 +func PostComment(pc *PostCreate) (string, error) { + if setting.Conf.Disqus.PostsList == "" || + setting.Conf.Disqus.PublicKey == "" || + setting.Conf.Disqus.ShortName == "" { + return "", ErrDisqusConfig } url := setting.Conf.Disqus.PostCreate + "?api_key=E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F" + @@ -158,31 +171,72 @@ func PostComment(pc *PostCreate) string { request, err := http.NewRequest("POST", url, nil) if err != nil { - logd.Error(err) - return "" + return "", err } request.Header.Set("Referer", "https://disqus.com") resp, err := http.DefaultClient.Do(request) if err != nil { - logd.Error(err) - return "" + return "", err } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { - logd.Error(err) - return "" + return "", err } if resp.StatusCode != http.StatusOK { - logd.Error(string(b)) - return "" + return "", errors.New(string(b)) } pr := &PostResponse{} err = json.Unmarshal(b, pr) if err != nil { - logd.Error(err) - return "" + return "", err } - logd.Print(pr.Response.Id) - return pr.Response.Id + return pr.Response.Id, nil +} + +type ApprovedResponse 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)) + } + + ar := &ApprovedResponse{} + err = json.Unmarshal(b, ar) + if err != nil { + return err + } + + return nil } diff --git a/disqus_test.go b/disqus_test.go index eeb3622..99e228a 100644 --- a/disqus_test.go +++ b/disqus_test.go @@ -23,3 +23,7 @@ func TestPostComment(t *testing.T) { } t.Log("post success") } + +func TestApprovePost(t *testing.T) { + ApprovePost() +} diff --git a/front.go b/front.go index 577e7d8..2ee5262 100644 --- a/front.go +++ b/front.go @@ -245,7 +245,7 @@ func HandleBeacon(c *gin.Context) { vals.Set("dl", c.Request.Referer()) vals.Set("uip", c.ClientIP()) go func() { - req, err := http.NewRequest("POST", "https://www.google-analytics.com/collect", strings.NewReader(vals.Encode())) + req, err := http.NewRequest("POST", setting.Conf.Google.URL, strings.NewReader(vals.Encode())) if err != nil { logd.Error(err) return @@ -301,8 +301,12 @@ func HandleDisqus(c *gin.Context) { if artc := Ei.MapArticles[slug]; artc != nil { dcs.Data.Thread = artc.Thread } - postsList := PostsList(slug, cursor) - if postsList != nil { + postsList, err := PostsList(slug, cursor) + if err != nil { + logd.Error(err) + dcs.ErrNo = FAIL + dcs.ErrMsg = "系统错误" + } else { dcs.ErrNo = postsList.Code if postsList.Cursor.HasNext { dcs.Data.Next = postsList.Cursor.Next @@ -324,9 +328,6 @@ func HandleDisqus(c *gin.Context) { Message: v.Message, } } - } else { - dcs.ErrNo = FAIL - dcs.ErrMsg = "系统错误" } c.JSON(http.StatusOK, dcs) } @@ -355,8 +356,16 @@ func HandleDisqusCreate(c *gin.Context) { IpAddress: c.ClientIP(), } - id := PostComment(pc) - if id == "" { + id, err := PostComment(pc) + if err != nil { + logd.Error(err) + rep["errno"] = FAIL + rep["errmsg"] = "系统错误" + return + } + err = PostApprove(id) + if err != nil { + logd.Error(err) rep["errno"] = FAIL rep["errmsg"] = "系统错误" return diff --git a/setting/setting.go b/setting/setting.go index c6a26b3..8dde068 100644 --- a/setting/setting.go +++ b/setting/setting.go @@ -35,14 +35,17 @@ type Config struct { Clean int // 清理回收箱频率 } Disqus struct { // 获取文章数量相关 - ShortName string - PublicKey string - PostsCount string - PostsList string - PostCreate string - Interval int + ShortName string + PublicKey string + AccessToken string + PostsCount string + PostsList string + PostCreate string + PostApprove string + Interval int } Google struct { // 谷歌统计 + URL string Tid string V string T string diff --git a/views/disqus.html b/views/disqus.html index 438f94f..a33547a 100644 --- a/views/disqus.html +++ b/views/disqus.html @@ -1 +1 @@ -{{.Title}}

对「{{.ATitle}}」发表评论

  • 昵称:
  • 邮箱:
  • 内容:
  • 注:通过本表单提交的数据,会原样转发给 Disqus,本站不做任何存储和记录。
  • 放弃评论
\ No newline at end of file +{{.Title}}

对「{{.ATitle}}」发表评论

  • 昵称:
  • 邮箱:
  • 内容:
  • 注:通过本表单提交的数据,会原样转发给 Disqus,本站不做任何存储和记录。
  • 放弃评论