使用Mastodon向您的静态博客添加评论

2020-12-30 00:04:29

静态网站生成器的最大缺点之一是它们是静态的,不能包含评论。

有多种解决方案可以解决此问题。您可以添加一个类似Disqus的第三方博客引擎,但是这样做的缺点在于,它包含一个第三方工具,该工具在您的网站中存在不良的隐私记录。另一个解决方案是托管一个开源替代方案,但这是以更高的维护负担为代价的。我们必须使用静态站点生成器来避免必须托管数据库。

我认为,更好的解决方案是利用Mastodon和Fediverse平台。 Mastodon是一个去中心化的社交网络,它使人们无需在同一台服务器上即可相互通信。它的灵感来自Twitter,但您没有写过推文,而是写了嘟嘟声。

发布文章时,现在只需要编写与文章相关的asimple嘟嘟链接。然后Mastodon有一个simpleAPI来获取嘟嘟的答案。这是我为Hugo支持的博客编写的代码,但是很容易适用于其他静态网站生成器。它将创建一个按钮来加载评论,而不是为每个访问者加载评论,从而减少了您的Mastodon服务器的负载。

{{with .Params.comments}}< div class =&article-content" > < h2>评论< / h2> < p>您可以使用您的Mastodon帐户回复此< a href =" https:// {{.host}} / @ {{.username}} / {{.id}}" >发布< / a>。 < / p> < p id =" mastodon-comments-list" <<按钮ID =" load-comment" >加载评论< /按钮>< / p> < noscript>< p>您需要JavaScript才能查看评论。 < / p>< / noscript> <脚本src =" /assets/js/purify.min.js" >< /脚本> <脚本类型=" text / javascript" >文件。 getElementById(" load-comment")。 addEventListener(" click",函数(){获取(' https:// {{.host}} / api / v1 / statuses / {{.id}} / context')然后(函数(response){返回响应。json();})。然后(函数(data){if(数据[' descendants']&& Array。isArray(数据[&# 39; descendants']&&数据[&descendants']长度> 0){document。getElementById(' mastodon-comments-list')。innerHTML =数据[' descendants']。reduce(function(prev,Reply){mastodonComment =`< div class =" mastodon-comment">< div class =" avatar"> img src =" $ {回复。account。avatar_static}" height = 60 width = 60 alt =""< / div> < div class =" content">< div class =" author">< a href =" $ {答复帐户。url}&#34 ; rel =" nofollow" $ {回复帐户。用户名}< span class =" disabled" $ {回复acco恩。 acct}< / span> < / a> < a class =" date" href =" $ {答复。 uri}" rel =" nofollow" $ {答复。 created_at。 substr(0,10)}< / a> < / div> < div class =" mastodon-comment-content"> $ {答复。内容}< / div> < div class =" mastodon-comment-footer"> < / div> < / div> < / div>`;返回prev + DOMPurify。消毒(mastodonComment); },'' ); } else {文档。 getElementById(' mastodon-comments-list')。 innerHTML ="< p>未找到评论< / p>" ; }}); }); < /脚本> < / div> {{end}}

这段代码使用DOMPurify来清理输入,因为从第三方源加载数据而不先清理它们并不是一个好主意。

现在,在我的博客文章中,我可以将以下信息添加到myfrontmatter中,以使评论神奇地出现。