阅读 16279

❌ 对白嫖怪 SAY NO !!! —— 如何在 GitHub 上阻止无耻白嫖

前言

某知名200斤程序员在周末给我们分享了一条沸点

image

顺便发出了如下的询问:

image

接着我顺着思路问了下具体的需求:

image

于是乎,我阅读了一下 GitHub 的 API 文档,发现要阻止白嫖怪,是可以有门道的。我们可以让白嫖怪在没有 star 或者 fork 的时候,开启的 issue 被自动关闭并锁定,美汁儿汁儿。

image

说干就干,拒绝白嫖怪,从我做起。

(已开源在 fluttercandies/no-free-usage-action 并发布在 Actions 市场:No Free Usage Action

开发工作

实现思路

  • 从 GitHub Action 入手,通过 issue 的开启和重新开启的事件,调用我们的 action。
  • 拿到事件的触发者,读取TA是否 star、是否 fork、或者两者兼具。
  • 如果达到了白嫖条件,通过 action 发送引导信息,关闭并锁定 issue。

技术选型

其实最适合 GitHub Action 的语言是 js/ts,但这次我选择了老本行 Dart。你猜是为什么~猜对了我也不会告诉你。

基于 GitHub REST API 进行各种请求的调用。

开发过程

在此不再赘述开发过程,本质上只是几个 API 的调用工作。虽然其中涉及到了几个坑点,但是整体实现较为简单。

如何使用?

如果你的项目已经在 GitHub 开源了,又想使用这个便利的小工具,可以依照以下步骤来进行使用:

使用步骤

  1. 在你的项目的 /.github/workflows 文件夹下创建一个 yml 文件,例如 checker.yml

  2. 在文件中,引用 action 并使用。

    name: No Free usage issue checker  # Action名字。可以自定义
    on:
      issues:
        types: [opened, reopened]  # 在issue打开和重新打开时调用
       
    jobs:
      build:
        runs-on: ubuntu-latest
       
        steps:
        - uses: actions/checkout@v2
        - uses: fluttercandies/no-free-usage-action@master  # 使用最新版本的action
        - name: Check issue actor  # 步骤名字。可以自定义。
          with:
            token: ${{ secrets.GITHUB_TOKEN }}  # 由GitHub提供的临时Token,必须在此处进行传递,且必须为这个值。
    复制代码
  3. 蹲一个白嫖怪。👀

实际效果

当一个白嫖怪来到你的仓库,给你开了一个 issue 时,action 开始执行。

image

白嫖怪立马被采取了强制措施,大快人心。

更多用法

你可以选择是否需要 fork 或者是否需要 star,但两者必选其一

- uses: fluttercandies/no-free-usage-action@master
- name: Check issue actor
  with:
    token: ${{ secrets.GITHUB_TOKEN }}
    forked: '--no-forked' (代表不需要fork)
    starred: '--no-starred' (代表不需要star)
    words: '请不要白嫖!' (任意内容。注意请将英文单引号进行转义)
复制代码

后话

白嫖怪已经成为业界毒瘤。每个人曾经都或多或少都有过白嫖的行为,这并不是关键问题,关键是在白嫖的过程中,对其内容和开发者的努力没有任何的尊重,还要更进一步的白嫖。

**一个 star、一次 fork,代表着对开源开发者的内容的认可。仔细阅读项目的文档,是对内容的尊重。提出新的需求,应当是深度思考后的产出。**但是一些没有底线的开发者们,一次又一次地将这条底线不断拓展,直到信心满满的开源开发者们放弃项目,不再开源新的项目。而TA们只会转向下一家,继续TA们的白嫖活动。

所以,拒绝白嫖,从我做起。

结语

感谢这一年的开发过程中,遇到了一群支持开源并且有良好开源精神的小伙伴,并一起推动着 Flutter Candies 的成长。

欢迎加入Flutter Candies,一起生产可爱的Flutter小糖果(QQ群:181398081)flutter-candies

FlutterCandies