背景

作为一个博主,与读者的互动是非常重要的一环。我的博客使用 Giscus 作为评论系统,它基于 GitHub Discussions 构建,提供了一个轻量级且优雅的评论解决方案。然而,最近我发现一个问题:当读者在博客上发表评论时,我并没有收到及时的通知。

虽然 GitHub 本身有通知机制,但在关注了多个仓库的情况下,这些通知容易被淹没在众多的项目更新中。为了更好地与读者互动,我决定为 Giscus 评论系统添加一个独立的通知功能。

技术方案

GitHub Discussions 事件

Giscus 使用 GitHub Discussions 作为后端存储,当有新的评论时,会在对应的 Discussion 中创建新的回复。GitHub 提供了完整的 Webhook 事件支持,我们需要关注的事件有:

  • discussion_comment: 当有新评论时触发
  • discussion: 当创建新讨论时触发

实现方式

我选择使用 GitHub Actions 来实现通知功能,主要考虑以下几点:

  1. 与 GitHub 完美集成,无需额外服务器
  2. 配置简单,维护成本低
  3. 支持多种通知方式(邮件、ntfy 等)

创建 GitHub Action 工作流

在仓库的 .github/workflows 目录下创建工作流文件 discussion-notification.yml

name: Discussion Notification

on:
  discussion_comment:
    types: [created]
  discussion:
    types: [created]

jobs:
  send-notification:
    runs-on: ubuntu-latest
    steps:
      - name: Send email
        uses: dawidd6/action-send-mail@v3
        with:
          server_address: ${{secrets.MAIL_SERVER}}
          server_port: ${{secrets.MAIL_PORT}}
          username: ${{secrets.MAIL_USERNAME}}
          password: ${{secrets.MAIL_PASSWORD}}
          subject: New comment on your blog
          body: |
            There is a new comment in your blog discussions!
            
            Comment by: ${{ github.event.comment.user.login || github.event.discussion.user.login }}
            Content: ${{ github.event.comment.body || github.event.discussion.body }}
            
            Link: ${{ github.event.comment.html_url || github.event.discussion.html_url }}            
          to: ${{secrets.MAIL_TO}}
          from: Blog Notification <${{secrets.MAIL_FROM}}>

      - name: ntfy-notifications
        uses: niniyas/ntfy-action@master
        with:
          title: ${{ github.event.comment.user.login || github.event.discussion.user.login }} 给您的博客评论啦
          url: ${{ secrets.NTFY_URL }}
          topic: ${{ secrets.NTFY_TOPIC }}
          priority: 5
          headers: '{"authorization": "Bearer ${{ secrets.NTFY_TOKEN }}"}'
          tags: tada
          details: |              
            Comment by: ${{ github.event.comment.user.login || github.event.discussion.user.login }}
            Content: ${{ github.event.comment.body || github.event.discussion.body }}
            
            Link: ${{ github.event.comment.html_url || github.event.discussion.html_url }}

配置通知服务

这个工作流同时支持邮件和 ntfy 两种通知方式:

邮件通知配置

在 GitHub 仓库的 Settings -> Secrets and variables -> Actions 中添加以下密钥:

  • MAIL_SERVER: 邮件服务器地址
  • MAIL_PORT: 邮件服务器端口
  • MAIL_USERNAME: 邮箱用户名
  • MAIL_PASSWORD: 邮箱密码
  • MAIL_TO: 接收通知的邮箱地址
  • MAIL_FROM: 发送通知的邮箱地址

Ntfy 通知配置

同样在 Secrets 中添加:

  • NTFY_URL: ntfy 服务器地址
  • NTFY_TOPIC: 订阅的主题名称
  • NTFY_TOKEN: ntfy 认证令牌(如果需要)

效果展示

配置完成后,当有新的评论或讨论时,我会同时收到邮件和 ntfy 通知:

邮件通知

邮件通知

Ntfy 通知

nfty 通知

总结

通过利用 GitHub Actions,我们为 Giscus 评论系统添加了双重通知功能。这个解决方案具有以下优点:

  1. 零成本:GitHub Actions 对公共仓库免费
  2. 可靠性高:依托于 GitHub 的基础设施
  3. 双重保障:同时支持邮件和 ntfy 通知
  4. 配置灵活:可以根据需要启用或禁用任一通知方式

现在,无论是通过邮件还是手机通知,我都能及时收到读者的评论,大大提高了博客的互动性。如果你也在使用 Giscus 并遇到类似需求,欢迎在下方留言交流!