GitalkでGatsbyにコメント欄を導入

nozzle

Gitalk とは

Gitalk is a modern comment component based on GitHub Issue and Preact.

引用元:Gitalk | Github

Github の issue を利用するコメントのコンポーネントである。 導入することで静的なサイトでもコメント欄が設置できる。

gitalk 01 gatsby の記事に設置された Gitalk のコメント

gitalk 02 Github の issue 上のコメント

Gitalk は Github Application を介して、ブログポストごとに新たな issue を立て、ログインしたアカウントでその issue へ返信することができる。
Gitalk 一連の issue の返信をブログポストへのコメントとして表示する。

Gitalk の特徴

  • サーバーレスで軽い
  • コメントを Github の issue で管理できる
  • Github のアカウントがないとコメントできない

Github のアカウント必須はデメリットに思えるかもしれないが、自分はメリットだと考えている。
理由:Github のアカウントを持っている人は IT リテラシーが高いため。

Gatsby に Gitalk を導入

画像を見て理解してほしい。

Github のプロフィールから settings へ

gitalk 03

Developer settings を開く

gitalk 04

OAuth Apps を選んで、Register a new application を選択

gitalk 05

必要な情報を入力する

Application name: なんでもいい
Homepage URL: ブログの URL
Authorization callback URL: ブログの URL(上と同じ) gitalk 06

client ID と Client secret を入手する

Generate a new client secret を押して Client secret を発行する。 後で使うのでこのページを残しておくこと。 gitalk 07

Github Application を準備する

Gatsby 用のプラグインをいれる

Gatsby Plugin Gitalk | Github

yarn add gatsby-plugin-gitalk

gatsby-config.js に追記する

gatsby-config.js
module.exports = {
    // 他の設定
    {
      resolve: "gatsby-plugin-gitalk",
      options: {
        config: {
          clientID: [生成したアプリケーションのID],
          clientSecret: [生成したアプリケーションのsecretClient],
          repo: [レポジトリ名],
          owner: [レポジトリのオーナー],
          admin: [レポジトリのオーナー, レポジトリが組織のものならそのメンバー],
          pagerDirection: "first", // コメントが古い順になる
          createIssueManually: false,
          distractionFreeMode: false, // コメント欄にフォーカスした時周囲が暗くならないようにする
          enableHotKey: true, // ctrl+Enterで送信できるようにする
          proxy: "https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_token"
        },
      },
    },
}

clientID と clientSecret は""で囲む。e.g. "daa548c3047c9a99d442"
repo はレポジトリ名だけでいい。 e.g. repo: "narazuke.github.io"

blog-post.js に追記する

src/templetes/gatsby-config.js
import "@suziwen/gitalk/dist/gitalk.css"
import Gitalk from "gatsby-plugin-gitalk"
const BlogPostTemplate = ({ data, location }) => {
const post = data.markdownRemark
let gitalkConfig = {
    id: post.fields.slug,
    title: post.frontmatter.title,
  }
  return(
    <div>
        {post.frontmatter.title}
        <Gitalk options={gitalkConfig} />
    </div>
  )

参考:4 plugins to add comments to your Gatsby.js blog

おわり?

公式の説明だとこれでできるようになるはずだが、2021 年 2 月時点でこの設定だけでは Gitalk が使用できない。次のトラブルシュートを参照してほしい。

トラブルシュート:ログインすると、Error: Request failed with status code 403 と出てしまう

原因

cors-anywhere.herokuapp.com の利用に 2021 年 1 月末から制約が生まれたため、Gitalk の処理、https://cors-anywhere.herokuapp.com/https://github.com/login/oauth/access_tokenが動いていないから。

参考:在授权 gitalk 后出现 403 错误
参考:PSA: Public demo server (cors-anywhere.herokuapp.com) will be very limited by January 2021, 31st

解説

正直あまり分かっていない。現時点での理解を書き留める。
あるサイトから別のサイトの情報を利用することを crosssite origin resource share と呼び、略して CORS と言う。
なんでもかんでも別のサイトから利用されては悪用されるリスクがあるので、通常は CORS が制限されている。CORS するにはアクセストークンで 2 つのサイトを紐付ける必要がある。
cors-anywhere があれば、どのサイトへどこからでも CORS で入手できる。すごい
これを使っている cors-anywhere.herokuapp.com は親切な人が動かしてくれてる heroku のアプリで、誰でも無料で使うことができたが、悪用される恐れからこれの利用にも制限がかかった。2021 年 1 月末以降、利用には WEB で一時的に利用制限を解く処理をしなければならなくなった。
Gitalk は 2021 年 2 月現在特にこの事態に対する処理を追加していないため、Gitalk が使えなくなってしまっている人が出ている。

対処法

cors-anywhere ができる herokuapp.com を自分で用意する。

手順

heroku のアカウントを作る。 Heroku
heroku コマンドを CLI で使えるようにする。 The Heroku CLI
CLI で heroku にログインする。

heroku login

ポップアップを開いてメアドとパスワード打って戻ると、CLI でのログインに成功しているはず。

heroku app を動かす。

git clone https://github.com/Rob--W/cors-anywhere.git
cd cors-anywhere/
npm install
heroku create
git push heroku master

参考:cors-anywhere.herokuapp.com not working (503). What else can I try? | stack overflow

heroku にブラウザでログインする。 gitalk 08 上の画像のように、アプリケーション名が自動で付与されている。

これを元に再び gatsby-config.js を書き換える

gatsby-config.js
module.exports = {
    // 他の設定
    {
      resolve: "gatsby-plugin-gitalk",
      options: {
        config: {
          clientID: [生成したアプリケーションのID],
          clientSecret: [生成したアプリケーションのsecretClient],
          //
          // (略)
          //
          proxy: "https://[heroku上で見たアプリケーション名].herokuapp.com/https://github.com/login/oauth/access_token"
        },
      },
    },
}

heroku のアプリケーション名は「英単語-英単語-5 桁の数字」である。
例えば、「readable-code-02400」なら、proxy:"https://readable-code-02400.herokuapp.com/https://github.com/login/oauth/access_token"である。

ほんとうのおわり

これで全ての手順が完成した。成功した人はおめでとう。
できない人は僕より Gitalk の人に聞いた方が良いと思う。