Merge pull request #23 from eiblog/fix_disqus

Fix disqus
This commit is contained in:
Deepzz
2019-12-18 19:22:11 +08:00
committed by GitHub
5 changed files with 101 additions and 26 deletions

View File

@@ -43,8 +43,6 @@ disqus:
postcreate: https://disqus.com/api/3.0/posts/create.json postcreate: https://disqus.com/api/3.0/posts/create.json
postapprove: https://disqus.com/api/3.0/posts/approve.json postapprove: https://disqus.com/api/3.0/posts/approve.json
threadcreate: https://disqus.com/api/3.0/threads/create.json threadcreate: https://disqus.com/api/3.0/threads/create.json
# disqus.js 文件名
embed: disqus_7d3cf2.js
# 获取评论数量间隔 # 获取评论数量间隔
interval: 5 interval: 5
# 谷歌统计 # 谷歌统计

109
disqus.go
View File

@@ -3,10 +3,12 @@
package main package main
import ( import (
"crypto/tls"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net"
"net/http" "net/http"
"net/url" "net/url"
"strings" "strings"
@@ -58,7 +60,7 @@ func PostsCount() error {
count++ count++
} }
count = 0 count = 0
resp, err := http.Get(setting.Conf.Disqus.PostsCount + "?" + vals.Encode()) resp, err := Get(setting.Conf.Disqus.PostsCount + "?" + vals.Encode())
if err != nil { if err != nil {
return err return err
} }
@@ -128,7 +130,7 @@ func PostsList(slug, cursor string) (*postsListResp, error) {
vals.Set("cursor", cursor) vals.Set("cursor", cursor)
vals.Set("limit", "50") vals.Set("limit", "50")
resp, err := http.Get(setting.Conf.Disqus.PostsList + "?" + vals.Encode()) resp, err := Get(setting.Conf.Disqus.PostsList + "?" + vals.Encode())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -181,12 +183,8 @@ func PostCreate(pc *PostComment) (*postCreateResp, error) {
vals.Set("author_name", pc.AuthorName) vals.Set("author_name", pc.AuthorName)
// vals.Set("state", "approved") // vals.Set("state", "approved")
request, err := http.NewRequest("POST", setting.Conf.Disqus.PostCreate, strings.NewReader(vals.Encode())) header := http.Header{"Referer": {"https://disqus.com"}}
if err != nil { resp, err := PostWithHeader(setting.Conf.Disqus.PostCreate, vals, header)
return nil, err
}
request.Header.Set("Referer", "https://disqus.com")
resp, err := http.DefaultClient.Do(request)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -225,12 +223,8 @@ func PostApprove(post string) error {
vals.Set("access_token", setting.Conf.Disqus.AccessToken) vals.Set("access_token", setting.Conf.Disqus.AccessToken)
vals.Set("post", post) vals.Set("post", post)
request, err := http.NewRequest("POST", setting.Conf.Disqus.PostApprove, strings.NewReader(vals.Encode())) header := http.Header{"Referer": {"https://disqus.com"}}
if err != nil { resp, err := PostWithHeader(setting.Conf.Disqus.PostApprove, vals, header)
return err
}
request.Header.Set("Referer", "https://disqus.com")
resp, err := http.DefaultClient.Do(request)
if err != nil { if err != nil {
return err return err
} }
@@ -276,7 +270,7 @@ func ThreadCreate(artc *Article) error {
urlPath := fmt.Sprintf("https://%s/post/%s.html", setting.Conf.Mode.Domain, artc.Slug) urlPath := fmt.Sprintf("https://%s/post/%s.html", setting.Conf.Mode.Domain, artc.Slug)
vals.Set("url", urlPath) vals.Set("url", urlPath)
resp, err := http.PostForm(setting.Conf.Disqus.ThreadCreate, vals) resp, err := PostForm(setting.Conf.Disqus.ThreadCreate, vals)
if err != nil { if err != nil {
return err return err
} }
@@ -299,3 +293,88 @@ func ThreadCreate(artc *Article) error {
artc.Thread = result.Response.Id artc.Thread = result.Response.Id
return nil return nil
} }
///////////////////////////// HTTP 请求 /////////////////////////////
var httpClient = &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}).DialContext,
ForceAttemptHTTP2: true,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
},
}
func newRequest(method, rawurl string, vals url.Values) (*http.Request, error) {
u, err := url.Parse(rawurl)
if err != nil {
return nil, err
}
host := u.Host
// 获取主机IP
ips, err := net.LookupHost(u.Host)
if err != nil {
return nil, err
}
if len(ips) == 0 {
return nil, errors.New("not found ip: " + u.Host)
}
// 设置ServerName
httpClient.Transport.(*http.Transport).TLSClientConfig = &tls.Config{
InsecureSkipVerify: true,
}
u.Host = ips[0]
// 创建HTTP Request
var req *http.Request
if vals != nil {
req, err = http.NewRequest(method, u.String(), strings.NewReader(vals.Encode()))
} else {
req, err = http.NewRequest(method, u.String(), nil)
}
if err != nil {
return nil, err
}
// 改变Host
req.Host = host
return req, nil
}
// Get HTTP Get请求
func Get(rawurl string) (*http.Response, error) {
req, err := newRequest(http.MethodGet, rawurl, nil)
if err != nil {
return nil, err
}
// 发起请求
return httpClient.Do(req)
}
// PostForm HTTP Post请求
func PostForm(rawurl string, vals url.Values) (*http.Response, error) {
req, err := newRequest(http.MethodPost, rawurl, vals)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
// 发起请求
return httpClient.Do(req)
}
// PostWithHeader HTTP Post请求自定义Header
func PostWithHeader(rawurl string, vals url.Values, header http.Header) (*http.Response, error) {
req, err := newRequest(http.MethodPost, rawurl, vals)
if err != nil {
return nil, err
}
// set header
req.Header = header
// 发起请求
return httpClient.Do(req)
}

View File

@@ -86,14 +86,13 @@ $ docker run -d --name eisearch \
#### 文件准备 #### 文件准备
博主是一个有强迫症的人,一些文件的路径我使用了固定的路径,请大家见谅。假如你的 cdn 域名为 `st.example.com`,你需要确定这些文件已经在你的 cdn 中,它们路径分别是: 博主是一个有强迫症的人,一些文件的路径我使用了固定的路径,请大家见谅。假如你的 cdn 域名为 `st.example.com`,你需要确定这些文件已经在你的 cdn 中,它们路径分别是:
| 文件 | 地址 | 描述 | | 文件 | 地址 | 描述 |
| ------------------ | ---------------------------------------- | ---------------------------------------- | | ------------------ | -------------------------------------------- | ------------------------------------------------------------ |
| favicon.ico | st.example.com/static/img/favicon.ico | cdn 中的文件名为 `static/img/favicon.ico`。你也可以复制 favicon.ico 到 static 文件夹下,通过 example.com/favicon.ico 也是能够访问到。docker 用户可能需要重新打包镜像。 | | favicon.ico | st.example.com/static/img/favicon.ico | cdn 中的文件名为 `static/img/favicon.ico`。你也可以复制 favicon.ico 到 static 文件夹下,通过 example.com/favicon.ico 也是能够访问到。docker 用户可能需要重新打包镜像。 |
| bg04.jpg | st.example.com/static/img/bg04.jpg | 首页左侧的大背景图,需要更名请到 views/st_blog.css 修改。 | | bg04.jpg | st.example.com/static/img/bg04.jpg | 首页左侧的大背景图,需要更名请到 views/st_blog.css 修改。 |
| avatar.png | st.example.com/static/img/avatar.png | 头像 | | avatar.png | st.example.com/static/img/avatar.png | 头像 |
| blank.gif | st.example.com/static/img/blank.gif | 空白图片,[下载](https://st.deepzz.com/static/img/blank.gif) | | blank.gif | st.example.com/static/img/blank.gif | 空白图片,[下载](https://st.deepzz.com/static/img/blank.gif) |
| default_avatar.png | st.example.com/static/img/default_avatar.png | disqus 默认图片,[下载](https://st.deepzz.com/static/img/default_avatar.png) | | default_avatar.png | st.example.com/static/img/default_avatar.png | disqus 默认图片,[下载](https://st.deepzz.com/static/img/default_avatar.png) |
| disqus.js | st.example.com/static/js/disqus_xxx.js | disqus 文件,你可以通过 https://short_name.disqus.com/embed.js 下载你的专属文件,并上传到七牛。更新配置文件 app.yml。 |
> 注意cdn 提到的文件下载,请复制链接进行下载,因为博主使用了防盗链功能,还有: > 注意cdn 提到的文件下载,请复制链接进行下载,因为博主使用了防盗链功能,还有:
 1、每次修改 app.yml 文件(如:更换 cdn 域名或更新头像),如果你不知道是否应该提高 staticversion 一个版本,那么最好提高一个 +1。  1、每次修改 app.yml 文件(如:更换 cdn 域名或更新头像),如果你不知道是否应该提高 staticversion 一个版本,那么最好提高一个 +1。

View File

@@ -43,7 +43,6 @@ type Config struct {
PostCreate string PostCreate string
PostApprove string PostApprove string
ThreadCreate string ThreadCreate string
Embed string
Interval int Interval int
} }
Google struct { // 谷歌统计 Google struct { // 谷歌统计

File diff suppressed because one or more lines are too long