From ea59f2cbf876721fe27c4bbce9d29b1d4431f4a7 Mon Sep 17 00:00:00 2001 From: Cheng Zheng Date: Sat, 20 Dec 2025 12:40:43 +0800 Subject: [PATCH] doc --- .github/README.md | 15 ++++ .github/scripts/process_item.py | 120 +++++++++++++++++++++++++++++ .github/workflows/process_list.yml | 29 +++++++ 3 files changed, 164 insertions(+) create mode 100644 .github/README.md create mode 100644 .github/scripts/process_item.py create mode 100644 .github/workflows/process_list.yml diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..c16400d --- /dev/null +++ b/.github/README.md @@ -0,0 +1,15 @@ +## `.github/` 的文档 + +## 需求(想做到什么?) +我希望将 "用户提交产品"(新增一条 Github Issue 的 Comment) +到 "存入 .md 文件",这个流程进行自动化。减少我的时间投入。 + +## 如何本地运行 +```bash +export GITHUB_TOKEN="你的_github_token" +export LLM_API_KEY="你的_ai_key" +export GITHUB_REPOSITORY="你的用户名/你的仓库名" + +python .github/scripts/process_item.py +``` + diff --git a/.github/scripts/process_item.py b/.github/scripts/process_item.py new file mode 100644 index 0000000..32a9050 --- /dev/null +++ b/.github/scripts/process_item.py @@ -0,0 +1,120 @@ +import os +import datetime +from github import Github # https://github.com/PyGithub/PyGithub +from openai import OpenAI +from datetime import datetime, timedelta, timezone + + +# ================= 配置区 ================= +GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") +API_KEY = os.getenv("LLM_API_KEY") +BASE_URL = os.getenv("LLM_BASE_URL", "https://api.openai.com/v1") +REPO_NAME = "1c7/chinese-independent-developer" # os.getenv("GITHUB_REPOSITORY") +ISSUE_NUMBER = 160 # 你在维护的那个 Issue 编号 +ADMIN_HANDLE = "1c7" # 替换为你的 GitHub ID +TRIGGER_EMOJI = "rocket" # 🚀 +SUCCESS_EMOJI = "white_check_mark" # ✅ +# ========================================== + +def get_ai_format(raw_text): + client = OpenAI(api_key=API_KEY, base_url=BASE_URL) + prompt = f""" +你是一个严格的文案编辑。任务是将用户的项目介绍转换为标准的 Markdown 格式。 + +严格规则: +1. 严禁使用“一款、一个、一种、完全免费、高效、简洁、强大、快速、好用”等营销形容词。 +2. 描述部分必须以“用途”或“核心功能”作为动词开头,直接描述它是什么。 +3. 严禁使用加粗格式(即不要使用 ** 包裹文字)。 +4. 格式模板: +#### 制作者名字 - [Github](链接) +* :white_check_mark: [项目名](链接):用途描述 + +待处理文本: +{raw_text} +""" + response = client.chat.completions.create( + model="gpt-4o-mini", # 或者使用 deepseek-chat + messages=[{"role": "user", "content": prompt}], + temperature=0.3 + ) + return response.choices[0].message.content.strip() + +def main(): + g = Github(GITHUB_TOKEN) + repo = g.get_repo(REPO_NAME) + issue = repo.get_issue(ISSUE_NUMBER) + + # 计算 3 天前的时间(GitHub API 使用的是 UTC 时间) + time_threshold = datetime.now(timezone.utc) - timedelta(days=3) + + # 如果你一定要死守 2025-12-15,也可以手动指定: + # time_threshold = datetime(2025, 12, 15, tzinfo=timezone.utc) + + # 重点:在这里加上 since 参数 + comments = issue.get_comments(since=time_threshold) + + processed_count = 0 + + for comment in comments: + # 1. 检查是否有你的 🚀 反应 + reactions = comment.get_reactions() + has_trigger = any(r.content == TRIGGER_EMOJI and r.user.login == ADMIN_HANDLE for r in reactions) + # 2. 检查是否已经标记过 ✅ + has_success = any(r.content == SUCCESS_EMOJI for r in reactions) + + if has_trigger and not has_success: + print(f"发现待处理评论 ID: {comment.id}") + + # AI 格式化内容 + formatted_entry = get_ai_format(comment.body) + + # 准备修改 README.md + content = repo.get_contents("README.md", ref="master") + readme_text = content.decoded_content.decode("utf-8") + + # 插入日期逻辑 + today_str = datetime.datetime.now().strftime("%Y 年 %m 月 %d 号添加") + date_header = f"### {today_str}" + + if date_header not in readme_text: + # 在 "3. 项目列表" 下方插入新日期 + new_readme = readme_text.replace("3. 项目列表\n", f"3. 项目列表\n\n{date_header}\n") + else: + new_readme = readme_text + + # 在日期标题下插入新条目 + insertion_point = new_readme.find(date_header) + len(date_header) + final_readme = new_readme[:insertion_point] + "\n\n" + formatted_entry + new_readme[insertion_point:] + + # 创建新分支并提交 PR + branch_name = f"add-project-{comment.id}" + base = repo.get_branch("master") + repo.create_git_ref(ref=f"refs/heads/{branch_name}", sha=base.commit.sha) + + repo.update_file( + "README.md", + f"docs: add new project from comment {comment.id}", + final_readme, + content.sha, + branch=branch_name + ) + + repo.create_pull( + title=f"新增项目:来自评论 {comment.id}", + body=f"由管理员 {ADMIN_HANDLE} 标记并自动生成。\n原始评论:{comment.html_url}", + head=branch_name, + base="master" + ) + + # 标记为成功,并回复 + comment.create_reaction(SUCCESS_EMOJI) + comment.create_comment("感谢提交,已添加至待审核列表(PR 已创建)。") + + processed_count += 1 + print(f"评论 {comment.id} 处理成功,已创建 PR。") + + if processed_count == 0: + print("没有发现需要处理的新评论。") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/.github/workflows/process_list.yml b/.github/workflows/process_list.yml new file mode 100644 index 0000000..1988ecc --- /dev/null +++ b/.github/workflows/process_list.yml @@ -0,0 +1,29 @@ +name: 提交项目 +on: + schedule: + - cron: '0 */6 * * *' # 每 6 小时运行一次 + workflow_dispatch: # 支持手动触发 + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v6.0.1 + + - name: Setup Python + uses: actions/setup-python@v6.1.0 + with: + python-version: '3.13' + + - name: Install dependencies + run: | + pip install PyGithub openai + + - name: Run script + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + LLM_API_KEY: ${{ secrets.LLM_API_KEY }} + # 如果你用的不是 OpenAI 原生接口,可以设置这个环境变量,否则默认使用 OpenAI + # LLM_BASE_URL: "https://api.deepseek.com/v1" + run: python .github/scripts/process_item.py \ No newline at end of file