From 1bdfb6abea8cc3621236757b3d6c18f36eb8e3f2 Mon Sep 17 00:00:00 2001 From: "henry.chen" Date: Wed, 4 Dec 2019 13:24:48 +0800 Subject: [PATCH 1/2] fix(disqus): connect reset by peer --- disqus.go | 109 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 94 insertions(+), 15 deletions(-) diff --git a/disqus.go b/disqus.go index 1629c11..9daad8a 100644 --- a/disqus.go +++ b/disqus.go @@ -3,10 +3,12 @@ package main import ( + "crypto/tls" "encoding/json" "errors" "fmt" "io/ioutil" + "net" "net/http" "net/url" "strings" @@ -58,7 +60,7 @@ func PostsCount() error { count++ } count = 0 - resp, err := http.Get(setting.Conf.Disqus.PostsCount + "?" + vals.Encode()) + resp, err := Get(setting.Conf.Disqus.PostsCount + "?" + vals.Encode()) if err != nil { return err } @@ -128,7 +130,7 @@ func PostsList(slug, cursor string) (*postsListResp, error) { vals.Set("cursor", cursor) 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 { return nil, err } @@ -181,12 +183,8 @@ func PostCreate(pc *PostComment) (*postCreateResp, error) { vals.Set("author_name", pc.AuthorName) // vals.Set("state", "approved") - request, err := http.NewRequest("POST", setting.Conf.Disqus.PostCreate, strings.NewReader(vals.Encode())) - if err != nil { - return nil, err - } - request.Header.Set("Referer", "https://disqus.com") - resp, err := http.DefaultClient.Do(request) + header := http.Header{"Referer": {"https://disqus.com"}} + resp, err := PostWithHeader(setting.Conf.Disqus.PostCreate, vals, header) if err != nil { return nil, err } @@ -225,12 +223,8 @@ func PostApprove(post string) error { vals.Set("access_token", setting.Conf.Disqus.AccessToken) vals.Set("post", post) - request, err := http.NewRequest("POST", setting.Conf.Disqus.PostApprove, strings.NewReader(vals.Encode())) - if err != nil { - return err - } - request.Header.Set("Referer", "https://disqus.com") - resp, err := http.DefaultClient.Do(request) + header := http.Header{"Referer": {"https://disqus.com"}} + resp, err := PostWithHeader(setting.Conf.Disqus.PostApprove, vals, header) if err != nil { 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) vals.Set("url", urlPath) - resp, err := http.PostForm(setting.Conf.Disqus.ThreadCreate, vals) + resp, err := PostForm(setting.Conf.Disqus.ThreadCreate, vals) if err != nil { return err } @@ -299,3 +293,88 @@ func ThreadCreate(artc *Article) error { artc.Thread = result.Response.Id 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) +} From 4b53da38017fa2083ed529c675c5e5bb1b92bafe Mon Sep 17 00:00:00 2001 From: "henry.chen" Date: Wed, 18 Dec 2019 19:17:23 +0800 Subject: [PATCH 2/2] chore(disqus): rm app.yml/disqus/embed config --- conf/app.yml | 2 -- docs/install.md | 13 ++++++------- setting/setting.go | 1 - views/st_blog.js | 2 +- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/conf/app.yml b/conf/app.yml index 8c77643..2aa32bc 100644 --- a/conf/app.yml +++ b/conf/app.yml @@ -43,8 +43,6 @@ disqus: postcreate: https://disqus.com/api/3.0/posts/create.json postapprove: https://disqus.com/api/3.0/posts/approve.json threadcreate: https://disqus.com/api/3.0/threads/create.json - # disqus.js 文件名 - embed: disqus_7d3cf2.js # 获取评论数量间隔 interval: 5 # 谷歌统计 diff --git a/docs/install.md b/docs/install.md index 75401c8..0a79535 100644 --- a/docs/install.md +++ b/docs/install.md @@ -86,14 +86,13 @@ $ docker run -d --name eisearch \ #### 文件准备 博主是一个有强迫症的人,一些文件的路径我使用了固定的路径,请大家见谅。假如你的 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 用户可能需要重新打包镜像。 | -| bg04.jpg | st.example.com/static/img/bg04.jpg | 首页左侧的大背景图,需要更名请到 views/st_blog.css 修改。 | -| 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) | +| 文件 | 地址 | 描述 | +| ------------------ | -------------------------------------------- | ------------------------------------------------------------ | +| 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 修改。 | +| 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) | | 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 提到的文件下载,请复制链接进行下载,因为博主使用了防盗链功能,还有:  1、每次修改 app.yml 文件(如:更换 cdn 域名或更新头像),如果你不知道是否应该提高 staticversion 一个版本,那么最好提高一个 +1。 diff --git a/setting/setting.go b/setting/setting.go index 38db12d..76b7afc 100644 --- a/setting/setting.go +++ b/setting/setting.go @@ -43,7 +43,6 @@ type Config struct { PostCreate string PostApprove string ThreadCreate string - Embed string Interval int } Google struct { // 谷歌统计 diff --git a/views/st_blog.js b/views/st_blog.js index 1fd2b3f..801d5b7 100644 --- a/views/st_blog.js +++ b/views/st_blog.js @@ -1,3 +1,3 @@ {{define "blog_js"}} -var stringProto=String.prototype;stringProto.stripTags=function(){return this.replace(/<[^>]*>/gi,"")},stringProto.decode4Html=function(){var t=document.createElement("div");return t.innerHTML=this.stripTags(),t.childNodes[0]?t.childNodes[0].nodeValue||"":""},stringProto.queryUrl=function(t){var a=this.replace(/^[^?=]*\?/gi,"").split("#")[0],e={};return a.replace(/(^|&)([^&=]+)=([^&]*)/g,function(t,a,n,i){try{n=decodeURIComponent(n)}catch(o){}try{i=decodeURIComponent(i)}catch(o){}n in e?e[n] instanceof Array?e[n].push(i):e[n]=[e[n],i]:e[n]=/\[\]$/.test(n)?[i]:i}),t?e[t]:e},function(t){t.disqus_shortname="{{.Disqus.ShortName}}",$.each(["CURRENT_PAGE","CDN_DOMAIN"],function(a,e){t[e]="";var n=$("#"+e);n&&(t[e]=n.val())})}(this),function(t){function a(a){var e,n,i={selector:null,height:200};i=$.extend(i,a),e=i.height,n=function(){var a=$(t).scrollTop(),n=$(t).height()+a;$(i.selector).find("img[data-src]").each(function(){var t=$(this);setTimeout(function(){var i,o=t.offset(),s=t.height();o.top>n+e||o.top+s'),e.insertAfter(i)),o.html().split("\n").length>3&&o.prop("className").indexOf("language")>-1)){switch(n=o.prop("className").replace("language-","").toUpperCase()){case"XML":n="HTML";break;case"SHELL":n="BASH"}$(''+n+"").insertBefore(o)}}),$(".entry-content input.runcode").each(function(){var a=$(this);a.click(function(a){var e,n,i;a.preventDefault(),e=$("#"+$(this).data("id")).html().stripTags().decode4Html(),n=t.open("","_preview",""),i=n.document,i.open(),i.write(e),i.close()})}),$(".entry-content > pre code").each(function(i,block){hljs.highlightBlock(block)})})}(this),function(){$(function(){$(".entry-content img[data-replace]").each(function(){var t=$(this);t.click(function(){var a,e,n,i,o=1000*(t.data("dur")||20);t.css("cursor")&&(a="/static/img/blank.gif",e=t.prop("src"),n=t.data("replace"),t.prop("src",a),t.css("cursor",""),i=new Image,i.onload=function(){t.prop("src",n),setTimeout(function(){t.prop("src",e),t.css("cursor","pointer")},o)},i.src=n)}),t.css("cursor","pointer")})})}(this),function(t){var a=function(){var e=[],n="comment_type",i=function(){if(!t.atob){return 1}try{t.postMessage("ping","*")}catch(a){return 2}return 0};return{addService:function(t){e.push(t)},clear:function(){localStorage.removeItem(n)},init:function(t){var o,r,s,c;return e.length?t.length?(o=t.data("url")||location.href,r=t.data("identifier"),o&&r?i()?void t.html("很抱歉,本站评论功能只支持这些浏览器:Chrome、Firefox、Safari、Opera、Edge、IE11+。"):(s=function(i){var c,l=e[i];l&&(c=$("
").prop("id",l.id),t.append(c),l.init(c,o,r),l.check(function(t){t?(c.hide(),s(++i)):(l.load(),localStorage[n]=i,a.currentServer=l)},c,o,r))},c=0,localStorage.comment_type&&(c=parseInt(localStorage[n],10)||0),c=Math.min(e.length-1,c),c=Math.max(c,0),void s(c)):void alert("没有找到评论所需标记!")):void alert("没有找到评论容器!"):void alert("没有找到可用的服务!")}}}();t.TotalThread=a}(this),function(t){var a=function(){var a=!1;return{id:"disqus_thread",check:function(a){var e,n,i=["https://c.disquscdn.com/favicon.ico","https://disqus.com/favicon.ico"],o=0,r=0,s=function(){o==i.length&&a(r==o?0:1)};for(t.__disqus_img=[],e=function(a){var e=new Image,n=setTimeout(function(){e.onerror=e.onload=null,o++,s()},2500);e.onerror=function(){clearTimeout(n),o++,s()},e.onload=function(){clearTimeout(n),o++,r++,s()},e.src=i[a]+"?"+ +new Date,t.__disqus_img[a]=e},n=0;n
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。"),this.elThread=t,this.url=a,this.identifier=e}}}();t.TotalThread.addService(a)}(this),function(t){var a=function(){var e=!1,n=function(e,n){var i,o,r=!1,s="",c=function(a){var e='
  • '+(a.url?'':'')+'
    '+a.message+'
    • ';return e},l=function(t){for(;t.length;){var a=[];t.forEach(function(t){var n=t.parent,i=e.find('ul[data-id="'+n+'"]');return i.length?void i.append(c(t)):void a.push(t)}),t=a}},d=function(a){var n=parseInt(a.parent,10),i=e.find('ul[data-id="'+n+'"]');i.prepend(c(a)),e.find(".no-result").hide(),$(t).trigger("scroll"),$(t).trigger("hashchange","scrollIntoView")};a.insertItem=d,i=function(t){var a='';e.attr("data-thread",t.thread),e.attr("data-identifier",n),e.html(a),t.comments.length||e.find(".thread-post-list").append('

      本文目前还没有人评论~

      ')},o=function(){if(!r){r=!0;var a;a=s?"/disqus/"+n+"/"+encodeURIComponent(s):"/disqus/"+n,$.get(a,{},function(a){var n;r=!1,a&&0==a.errno?(s?l(a.data.comments):(i(a.data),l(a.data.comments),$(t).trigger("hashchange","scrollIntoView")),n=e.find(".load-more a"),a.data.next?n.removeClass("busy"):n.hide(),s=a.data.next,$(t).trigger("scroll")):e.html('

      获取数据失败,请稍后再试!

      ')})}},e.on("click",".load-more a",function(t){t.preventDefault(),$(this).addClass("busy"),o()}).on("click","a.time-ago",function(t){t.preventDefault(),location.hash="comment-"+$(this).data("id")}).on("click","a.reload",function(a){a.preventDefault(),t.TotalThread.clear(),location.hash="comments",location.reload()}).on("click","a.reply, button.create-post",function(a){var n,i,o,r,s,c,l,d,u;a.preventDefault(),n=e.data("identifier"),i=e.data("thread"),o=$(this).data("next"),r=$(this).data("id"),s=420,c=520,l=t.screen.width-s/2,d=t.screen.height-c/2,u=[n,i,r,o].join("|"),t.open("/disqus/form/"+encodeURIComponent(u)+"/","_create_post","width="+s+",height="+c+",location=1,status=1,resizable=1,scrollbars=1,left="+l+",top="+d)}),$(t).on("hashchange",function(a,n){var i,o=location.hash.match(/#comment\-(\d+)/);o&&(i=e.find("#post-"+o[1]),i.length&&(e.find(".post-content.target").removeClass("target"),i.find("> .post-content").addClass("target"),n&&$(t).scrollTop(i.offset().top-90)))}),/(iPhone|Android)/.test(navigator.userAgent)&&e.addClass("mobile"),o()};return{id:"simple_thread",check:function(t){t(0)},load:function(){e||(e=!0,n(this.elThread,this.identifier))},init:function(t,a,e){t.html("评论基础模式加载中...

      注:本模式仅支持最基本的评论功能,如需完整体验请针对 disq.us | disquscdn.com | disqus.com 启用代理。"),this.elThread=t,this.url=a,this.identifier=e}}}();t.TotalThread.addService(a)}(this),function(t,a){var e=a.domain;return"{{.Qiniu.Domain}}"==e?void (location.href=location.href.replace(/(https?:\/\/[^\/]+)\//i,"//{{.Domain}}")):(function(){var t,a=location.search.queryUrl();"1"==a.clear_ls&&(delete a.clear_ls,t=$.param(a),setTimeout(function(){t?location.search=$.param(a):location.href=location.href.replace(/\?.*$/,"")},300))}(),void $(function(){lazyLoad({selector:"#content",height:100}),function(){var t=$("#content"),a=t.find("img"),e=t.width();a.each(function(){var t=$(this),a=0|t.attr("width"),n=0|t.attr("height"),i=t.prop("complete");a>e&&t.attr("height",Math.ceil(n/a*e)),t.prop("src")&&(i?t.addClass("loaded"):t.on("load",function(){t.addClass("loaded")}))})}(),function(){if("search-post"==CURRENT_PAGE){var t=$("#keyword");t.val()||t.focus()}}(),function(){var a=$(".total_thread");a.length&&setTimeout(function(){/ #comment - \d + $ /.test(location.hash)&&$("#comments").get(0).scrollIntoView();var e=setInterval(function(){var n=a.offset().top,i=$(t).scrollTop();Math.abs(n-i)<1000&&(clearTimeout(e),t.TotalThread.init(a))},150)},250)}()}))}(this,document); +var stringProto=String.prototype;stringProto.stripTags=function(){return this.replace(/<[^>]*>/gi,"")},stringProto.decode4Html=function(){var t=document.createElement("div");return t.innerHTML=this.stripTags(),t.childNodes[0]?t.childNodes[0].nodeValue||"":""},stringProto.queryUrl=function(t){var a=this.replace(/^[^?=]*\?/gi,"").split("#")[0],e={};return a.replace(/(^|&)([^&=]+)=([^&]*)/g,function(t,a,n,i){try{n=decodeURIComponent(n)}catch(o){}try{i=decodeURIComponent(i)}catch(o){}n in e?e[n] instanceof Array?e[n].push(i):e[n]=[e[n],i]:e[n]=/\[\]$/.test(n)?[i]:i}),t?e[t]:e},function(t){t.disqus_shortname="{{.Disqus.ShortName}}",$.each(["CURRENT_PAGE","CDN_DOMAIN"],function(a,e){t[e]="";var n=$("#"+e);n&&(t[e]=n.val())})}(this),function(t){function a(a){var e,n,i={selector:null,height:200};i=$.extend(i,a),e=i.height,n=function(){var a=$(t).scrollTop(),n=$(t).height()+a;$(i.selector).find("img[data-src]").each(function(){var t=$(this);setTimeout(function(){var i,o=t.offset(),s=t.height();o.top>n+e||o.top+s'),e.insertAfter(i)),o.html().split("\n").length>3&&o.prop("className").indexOf("language")>-1)){switch(n=o.prop("className").replace("language-","").toUpperCase()){case"XML":n="HTML";break;case"SHELL":n="BASH"}$(''+n+"").insertBefore(o)}}),$(".entry-content input.runcode").each(function(){var a=$(this);a.click(function(a){var e,n,i;a.preventDefault(),e=$("#"+$(this).data("id")).html().stripTags().decode4Html(),n=t.open("","_preview",""),i=n.document,i.open(),i.write(e),i.close()})}),$(".entry-content > pre code").each(function(i,block){hljs.highlightBlock(block)})})}(this),function(){$(function(){$(".entry-content img[data-replace]").each(function(){var t=$(this);t.click(function(){var a,e,n,i,o=1000*(t.data("dur")||20);t.css("cursor")&&(a="/static/img/blank.gif",e=t.prop("src"),n=t.data("replace"),t.prop("src",a),t.css("cursor",""),i=new Image,i.onload=function(){t.prop("src",n),setTimeout(function(){t.prop("src",e),t.css("cursor","pointer")},o)},i.src=n)}),t.css("cursor","pointer")})})}(this),function(t){var a=function(){var e=[],n="comment_type",i=function(){if(!t.atob){return 1}try{t.postMessage("ping","*")}catch(a){return 2}return 0};return{addService:function(t){e.push(t)},clear:function(){localStorage.removeItem(n)},init:function(t){var o,r,s,c;return e.length?t.length?(o=t.data("url")||location.href,r=t.data("identifier"),o&&r?i()?void t.html("很抱歉,本站评论功能只支持这些浏览器:Chrome、Firefox、Safari、Opera、Edge、IE11+。"):(s=function(i){var c,l=e[i];l&&(c=$("
      ").prop("id",l.id),t.append(c),l.init(c,o,r),l.check(function(t){t?(c.hide(),s(++i)):(l.load(),localStorage[n]=i,a.currentServer=l)},c,o,r))},c=0,localStorage.comment_type&&(c=parseInt(localStorage[n],10)||0),c=Math.min(e.length-1,c),c=Math.max(c,0),void s(c)):void alert("没有找到评论所需标记!")):void alert("没有找到评论容器!"):void alert("没有找到可用的服务!")}}}();t.TotalThread=a}(this),function(t){var a=function(){var a=!1;return{id:"disqus_thread",check:function(a){var e,n,i=["https://c.disquscdn.com/favicon.ico","https://disqus.com/favicon.ico"],o=0,r=0,s=function(){o==i.length&&a(r==o?0:1)};for(t.__disqus_img=[],e=function(a){var e=new Image,n=setTimeout(function(){e.onerror=e.onload=null,o++,s()},2500);e.onerror=function(){clearTimeout(n),o++,s()},e.onload=function(){clearTimeout(n),o++,r++,s()},e.src=i[a]+"?"+ +new Date,t.__disqus_img[a]=e},n=0;n
      注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。"),this.elThread=t,this.url=a,this.identifier=e}}}();t.TotalThread.addService(a)}(this),function(t){var a=function(){var e=!1,n=function(e,n){var i,o,r=!1,s="",c=function(a){var e='
    • '+(a.url?'':'')+'
      '+a.message+'
      • ';return e},l=function(t){for(;t.length;){var a=[];t.forEach(function(t){var n=t.parent,i=e.find('ul[data-id="'+n+'"]');return i.length?void i.append(c(t)):void a.push(t)}),t=a}},d=function(a){var n=parseInt(a.parent,10),i=e.find('ul[data-id="'+n+'"]');i.prepend(c(a)),e.find(".no-result").hide(),$(t).trigger("scroll"),$(t).trigger("hashchange","scrollIntoView")};a.insertItem=d,i=function(t){var a='';e.attr("data-thread",t.thread),e.attr("data-identifier",n),e.html(a),t.comments.length||e.find(".thread-post-list").append('

        本文目前还没有人评论~

        ')},o=function(){if(!r){r=!0;var a;a=s?"/disqus/"+n+"/"+encodeURIComponent(s):"/disqus/"+n,$.get(a,{},function(a){var n;r=!1,a&&0==a.errno?(s?l(a.data.comments):(i(a.data),l(a.data.comments),$(t).trigger("hashchange","scrollIntoView")),n=e.find(".load-more a"),a.data.next?n.removeClass("busy"):n.hide(),s=a.data.next,$(t).trigger("scroll")):e.html('

        获取数据失败,请稍后再试!

        ')})}},e.on("click",".load-more a",function(t){t.preventDefault(),$(this).addClass("busy"),o()}).on("click","a.time-ago",function(t){t.preventDefault(),location.hash="comment-"+$(this).data("id")}).on("click","a.reload",function(a){a.preventDefault(),t.TotalThread.clear(),location.hash="comments",location.reload()}).on("click","a.reply, button.create-post",function(a){var n,i,o,r,s,c,l,d,u;a.preventDefault(),n=e.data("identifier"),i=e.data("thread"),o=$(this).data("next"),r=$(this).data("id"),s=420,c=520,l=t.screen.width-s/2,d=t.screen.height-c/2,u=[n,i,r,o].join("|"),t.open("/disqus/form/"+encodeURIComponent(u)+"/","_create_post","width="+s+",height="+c+",location=1,status=1,resizable=1,scrollbars=1,left="+l+",top="+d)}),$(t).on("hashchange",function(a,n){var i,o=location.hash.match(/#comment\-(\d+)/);o&&(i=e.find("#post-"+o[1]),i.length&&(e.find(".post-content.target").removeClass("target"),i.find("> .post-content").addClass("target"),n&&$(t).scrollTop(i.offset().top-90)))}),/(iPhone|Android)/.test(navigator.userAgent)&&e.addClass("mobile"),o()};return{id:"simple_thread",check:function(t){t(0)},load:function(){e||(e=!0,n(this.elThread,this.identifier))},init:function(t,a,e){t.html("评论基础模式加载中...

        注:本模式仅支持最基本的评论功能,如需完整体验请针对 disq.us | disquscdn.com | disqus.com 启用代理。"),this.elThread=t,this.url=a,this.identifier=e}}}();t.TotalThread.addService(a)}(this),function(t,a){var e=a.domain;return"{{.Qiniu.Domain}}"==e?void (location.href=location.href.replace(/(https?:\/\/[^\/]+)\//i,"//{{.Domain}}")):(function(){var t,a=location.search.queryUrl();"1"==a.clear_ls&&(delete a.clear_ls,t=$.param(a),setTimeout(function(){t?location.search=$.param(a):location.href=location.href.replace(/\?.*$/,"")},300))}(),void $(function(){lazyLoad({selector:"#content",height:100}),function(){var t=$("#content"),a=t.find("img"),e=t.width();a.each(function(){var t=$(this),a=0|t.attr("width"),n=0|t.attr("height"),i=t.prop("complete");a>e&&t.attr("height",Math.ceil(n/a*e)),t.prop("src")&&(i?t.addClass("loaded"):t.on("load",function(){t.addClass("loaded")}))})}(),function(){if("search-post"==CURRENT_PAGE){var t=$("#keyword");t.val()||t.focus()}}(),function(){var a=$(".total_thread");a.length&&setTimeout(function(){/ #comment - \d + $ /.test(location.hash)&&$("#comments").get(0).scrollIntoView();var e=setInterval(function(){var n=a.offset().top,i=$(t).scrollTop();Math.abs(n-i)<1000&&(clearTimeout(e),t.TotalThread.init(a))},150)},250)}()}))}(this,document); {{end}}