Compare commits

...

22 Commits

Author SHA1 Message Date
郑诚 (Cheng Zheng)
71d4574dc7 docs: batch add 2 projects 2026-03-23 13:40:43 +08:00
郑诚 (Cheng Zheng)
a3a7699ab4 feat: expand project collection to all open issues (body and last 7 days comments) 2026-03-23 13:39:52 +08:00
郑诚 (Cheng Zheng)
d4c2c4f9d5 Merge pull request #787 from 1c7/batch-add-projects-20260320-161525
新增项目:批量添加 1 个项目
2026-03-23 13:28:20 +08:00
郑诚 (Cheng Zheng)
2c7fa289e3 Update README.md 2026-03-23 13:27:30 +08:00
郑诚 (Cheng Zheng)
3ca3cd43c2 Merge pull request #788 from raullenchai/add-rapid-mlx
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
添加 Rapid-MLX 到程序员版面
2026-03-22 13:13:37 +08:00
Raullen
57b3d25c0f 添加 Rapid-MLX — Apple Silicon 本地 AI 推理引擎 2026-03-21 14:43:18 -07:00
郑诚 (Cheng Zheng)
ff2918ce56 docs: batch add 1 projects 2026-03-21 00:15:28 +08:00
郑诚 (Cheng Zheng)
0929d713ec Merge pull request #786 from 1c7/batch-add-projects-20260319-162045
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
新增项目:批量添加 1 个项目
2026-03-20 22:14:19 +08:00
郑诚 (Cheng Zheng)
7deb764171 docs: batch add 1 projects 2026-03-20 00:20:48 +08:00
郑诚 (Cheng Zheng)
fe6773e86a Merge pull request #784 from 1c7/batch-add-projects-20260318-162538
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
新增项目:批量添加 1 个项目
2026-03-19 15:29:41 +08:00
郑诚 (Cheng Zheng)
5d95790028 docs: batch add 1 projects 2026-03-19 00:25:41 +08:00
郑诚 (Cheng Zheng)
fbe5c9ecd7 Merge pull request #783 from 1c7/batch-add-projects-20260317-162645
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
新增项目:批量添加 2 个项目
2026-03-18 12:18:58 +08:00
郑诚 (Cheng Zheng)
f2944627f5 docs: batch add 2 projects 2026-03-18 00:26:48 +08:00
郑诚 (Cheng Zheng)
c2a0edacd9 Merge pull request #782 from Moresl/master
添加 ImageMinify 图片批量压缩工具
2026-03-17 18:22:03 +08:00
Moresl
5e3caa67c2 feat: 添加 ImageMinify 图片批量压缩工具 2026-03-17 16:24:21 +08:00
郑诚 (Cheng Zheng)
c30aa3dd46 Merge pull request #781 from haosao12345/patch-5
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
Update README with new project listings
2026-03-16 18:08:38 +08:00
haosao12345
6a200863d0 Update README with new project listings
Added new project entries for March 16 and 15, 2026, including descriptions and links.
2026-03-16 16:50:00 +08:00
郑诚 (Cheng Zheng)
eca65a70f8 Merge pull request #780 from 1c7/batch-add-projects-20260315-160815
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
新增项目:批量添加 4 个项目
2026-03-16 10:50:32 +08:00
郑诚 (Cheng Zheng)
d7d4f9ef32 Update README.md 2026-03-16 10:50:21 +08:00
郑诚 (Cheng Zheng)
0312dc6f8d docs: batch add 4 projects 2026-03-16 00:08:18 +08:00
郑诚 (Cheng Zheng)
374e8673bc Update README.md 2026-03-15 23:08:11 +08:00
郑诚 (Cheng Zheng)
19eb3d9e3e Merge pull request #778 from 1c7/batch-add-projects-20260314-160808
Some checks failed
提交项目(每 24 小时运行一次,晚上 00:00) / build (push) Has been cancelled
新增项目:批量添加 1 个项目
2026-03-15 13:46:55 +08:00
3 changed files with 162 additions and 64 deletions

View File

@@ -79,62 +79,92 @@ def get_ai_project_line(raw_text):
)
return response.choices[0].message.content.strip()
def check_reactions(item):
"""检查对象Issue 或 IssueComment是否有触发表情且没有成功标记"""
reactions = item.get_reactions()
has_trigger = any(r.content == TRIGGER_EMOJI and r.user.login == ADMIN_HANDLE for r in reactions)
has_success = any(r.content == SUCCESS_EMOJI for r in reactions)
return has_trigger, has_success
def main():
# 检查环境变量
check_environment()
g = Github(PAT_TOKEN)
repo = g.get_repo(REPO_NAME)
issue = repo.get_issue(ISSUE_NUMBER)
# ===== 阶段 1收集待处理项 (Issue 160 评论 + 其他 Open Issue) =====
pending_items = [] # 存储 (item_object, parent_issue_object)
# 1.1 处理 Issue 160 的评论 (Legacy)
issue160 = repo.get_issue(ISSUE_NUMBER)
time_threshold = datetime.now(timezone.utc) - timedelta(days=3)
comments = issue.get_comments(since=time_threshold)
comments160 = issue160.get_comments(since=time_threshold)
for comment in comments160:
has_t, has_s = check_reactions(comment)
if has_t and not has_s:
pending_items.append((comment, issue160))
# ===== 阶段 1收集待处理评论 =====
pending_comments = []
formatted_entries = []
# 1.2 扫描所有其他 Open Issue
open_issues = repo.get_issues(state='open')
comment_time_threshold = datetime.now(timezone.utc) - timedelta(days=7)
for issue in open_issues:
if issue.number == ISSUE_NUMBER:
continue
# 1. 检查 Issue Body
has_t, has_s = check_reactions(issue)
if has_t and not has_s:
pending_items.append((issue, issue))
# 2. 检查最近 7 天的所有评论
comments = issue.get_comments(since=comment_time_threshold)
for comment in comments:
has_t, has_s = check_reactions(comment)
if has_t and not has_s:
pending_items.append((comment, issue))
for comment in comments:
reactions = comment.get_reactions()
has_trigger = any(r.content == TRIGGER_EMOJI and r.user.login == ADMIN_HANDLE for r in reactions)
has_success = any(r.content == SUCCESS_EMOJI for r in reactions)
if has_trigger and not has_success:
print(f"\n{'='*60}")
print(f"处理评论:\n{comment.body}")
print(f"\n评论链接:{comment.html_url}")
print(f"{'='*60}\n")
cleaned_body = remove_quote_blocks(comment.body)
# 判断用户是否自带了 Header
header_match = re.search(r'^####\s+.*', cleaned_body, re.MULTILINE)
if header_match:
header_line = header_match.group(0).strip()
body_for_ai = cleaned_body.replace(header_line, "").strip()
print(f"检测到用户自带 Header: {header_line}")
else:
author_name = comment.user.login
author_url = comment.user.html_url
header_line = f"#### {author_name} - [Github]({author_url})"
body_for_ai = cleaned_body
print(f"自动生成 Header: {header_line}")
# AI 处理项目详情行
project_line = get_ai_project_line(body_for_ai)
formatted_entry = f"{header_line}\n{project_line}"
pending_comments.append(comment)
formatted_entries.append(formatted_entry)
# ===== 阶段 2批量提交 =====
if not pending_comments:
print("无待处理评论")
if not pending_items:
print("无待处理项")
return
print(f"\n共收集 {len(pending_comments)} 个待处理评论")
print(f"\n共收集 {len(pending_items)} 个待处理")
# ===== 阶段 2格式化和 AI 处理 =====
formatted_entries = []
processed_items = [] # 用于最后标记和回复
for obj, parent in pending_items:
print(f"\n{'='*60}")
print(f"处理项目:来自 {parent.html_url}")
print(f"内容:\n{obj.body[:200]}...")
print(f"{'='*60}\n")
cleaned_body = remove_quote_blocks(obj.body)
# 判断用户是否自带了 Header
header_match = re.search(r'^####\s+.*', cleaned_body, re.MULTILINE)
if header_match:
header_line = header_match.group(0).strip()
body_for_ai = cleaned_body.replace(header_line, "").strip()
print(f"检测到用户自带 Header: {header_line}")
else:
author_name = obj.user.login
author_url = obj.user.html_url
header_line = f"#### {author_name} - [Github]({author_url})"
body_for_ai = cleaned_body
print(f"自动生成 Header: {header_line}")
# AI 处理项目详情行
project_line = get_ai_project_line(body_for_ai)
formatted_entry = f"{header_line}\n{project_line}"
formatted_entries.append(formatted_entry)
processed_items.append((obj, parent, formatted_entry))
# ===== 阶段 3批量提交 =====
# 更新 README
content = repo.get_contents("README.md", ref="master")
readme_text = content.decoded_content.decode("utf-8")
@@ -149,8 +179,8 @@ def main():
# 插入所有条目(用两个换行分隔)
insertion_point = new_readme.find(date_header) + len(date_header)
all_entries = "\n\n".join(formatted_entries)
final_readme = new_readme[:insertion_point] + "\n\n" + all_entries + new_readme[insertion_point:]
all_entries_str = "\n\n".join(formatted_entries)
final_readme = new_readme[:insertion_point] + "\n\n" + all_entries_str + new_readme[insertion_point:]
# 创建分支
branch_name = f"batch-add-projects-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
@@ -164,27 +194,27 @@ def main():
repo.create_git_ref(ref=f"refs/heads/{branch_name}", sha=base.commit.sha)
repo.update_file(
"README.md",
f"docs: batch add {len(pending_comments)} projects",
f"docs: batch add {len(processed_items)} projects",
final_readme,
content.sha,
branch=branch_name
)
# 构建 PR body
comment_links = "\n".join([
f"- [{c.user.login}]({c.html_url})"
for c in pending_comments
item_links = "\n".join([
f"- [{obj.user.login}]({obj.html_url})"
for obj, parent, entry in processed_items
])
formatted_list = "\n\n".join([
f"### {i+1}. {formatted_entries[i]}"
for i in range(len(formatted_entries))
f"### {i+1}. {entry}"
for i, (obj, parent, entry) in enumerate(processed_items)
])
pr_body = f"""批量添加 {len(pending_comments)} 个项目
pr_body = f"""批量添加 {len(processed_items)} 个项目
## 原始评论链接
{comment_links}
## 原始链接
{item_links}
## 格式化结果
{formatted_list}
@@ -194,7 +224,7 @@ def main():
"""
pr = repo.create_pull(
title=f"新增项目:批量添加 {len(pending_comments)} 个项目",
title=f"新增项目:批量添加 {len(processed_items)} 个项目",
body=pr_body,
head=branch_name,
base="master"
@@ -202,16 +232,25 @@ def main():
print(f"\n✅ PR 创建成功:{pr.html_url}")
# 标记所有评论(添加 🎉 表情)
for comment in pending_comments:
comment.create_reaction(SUCCESS_EMOJI)
# ===== 阶段 4标记成功并回复 =====
replies = {} # parent_issue -> set of users
# 创建一条评论提及所有用户
user_mentions = " ".join([f"@{c.user.login}" for c in pending_comments])
reply_body = f"{user_mentions} 感谢提交,已添加!\n\n PR 链接:{pr.html_url}"
issue.create_comment(reply_body)
for obj, parent, entry in processed_items:
# 标记所有条目(添加 🎉 表情)
obj.create_reaction(SUCCESS_EMOJI)
# 收集需要回复的 Issue 和用户
if parent not in replies:
replies[parent] = set()
replies[parent].add(obj.user.login)
print(f"\n✅ 已标记所有 {len(pending_comments)} 个评论")
# 分别在各 Issue 回复
for parent, users in replies.items():
user_mentions = " ".join([f"@{u}" for u in users])
reply_body = f"{user_mentions} 感谢提交,已添加!\n\n PR 链接:{pr.html_url}"
parent.create_comment(reply_body)
print(f"\n✅ 已在 {len(replies)} 个 Issue 中标记并回复")
if __name__ == "__main__":
main()

View File

@@ -16,6 +16,11 @@ Issue 和 PR 里偶尔有人提交一些不错的东西,但打开一看,不
程序员版开始于 2019 年 4 月 11 号, 主版面开始于 2018 年 3 月
-->
### 2026 年 3 月 21 号添加
#### raullenchai - [Github](https://github.com/raullenchai)
* :white_check_mark: [Rapid-MLX](https://github.com/raullenchai/Rapid-MLX)Apple Silicon 上最快的本地 AI 推理引擎OpenAI API 兼容,比 Ollama 快 2-4 倍,支持 17 种工具调用解析器、推理分离、视觉模型和语音功能
### 2026 年 3 月 10 号添加
#### my19940202(上海) - [Github](https://github.com/my19940202)

View File

@@ -20,8 +20,62 @@
## 3. 项目列表
### 2026 年 3 月 14 号添加
### 2026 年 3 月 23 号添加
#### aprilcc666 - [Github](https://github.com/aprilcc666)
* :white_check_mark: [WhiteScreen.Space](https://whitescreen.space/):在线全屏白屏工具,用于检测坏点、节省 OLED 屏幕电量、测试显示器以及清洁屏幕
#### stark-ydq - [Github](https://github.com/stark-ydq)
* :white_check_mark: [Voice to Instrument](https://voicetoinstrument.com?utm_source=github&utm_medium=directory&utm_campaign=backlink):在线 AI 工具将人声录音转换为器乐曲目。上传歌声或录音AI 自动生成钢琴、吉他、鼓等器乐伴奏。
#### zx88cvb - [Github](https://github.com/zx88cvb)[博客](https://haydenbi.com/)
* :white_check_mark: [Mydirs](https://mydirs.com):导航站收录产品和工具,吸引流量并建立高质量外部链接
### 2026 年 3 月 19 号添加
#### 小鹿(全国旅居中) - [小红书](https://xhslink.com/m/9njPzLyGqiB)
* :white_check_mark: [cat names](catnames.best):猫咪起名/猫咪画廊展示
### 2026 年 3 月 18 号添加
#### Albert-Weasker - [Github](https://github.com/Albert-Weasker)
* :white_check_mark: [socialplugarchive.com](https://www.socialplugarchive.com):全球首个针对 SocialPlug 的欺诈证据存档库。通过 SEO 和结构化数据,公开披露其虚假交付、退款拖延及欺诈模式,致力于保护开发者与营销人员免受数字资产诈骗。
### 2026 年 3 月 17 号添加
#### lkunxyz - [Github](https://github.com/lkunxyz)
* :white_check_mark: [Extension聚合平台](https://aiextension.ai)AI相关的extension聚合平台免费无限提交
#### damotiansheng - [Github](https://github.com/damotiansheng)
* :white_check_mark: [Photo Animate AI](https://photoanimate.org/):利用人工智能动画技术,将静态照片转化为动态、逼真的视频
#### Moresl - [Github](https://github.com/Moresl)
* :white_check_mark: [ImageMinify](https://github.com/Moresl/ImageMinify):轻量级图片批量压缩工具,支持 JPEG/PNG/WebP基于 C# WPF 开发,免费开源
### 2026 年 3 月 16 号添加
#### qqhaosao(广州)
* :white_check_mark: [mpeg to mp3](https://mpegtomp3.online/):免费将.mpeg/.mpg格式的视频文件转换为.mp3格式的文件无需注册无需登录本地执行注重隐私保护。
### 2026 年 3 月 15 号添加
#### Eric浙江 - [Github](https://github.com/erickkkyt)
* :white_check_mark: [WMHub](https://wmhub.io/):一体化 AI 创作工作空间,支持视频、图像与 3D 生成,帮助团队更快产出高质量媒体资产。
#### 阿健(杭州) - [Github](https://github.com/hugh2nd), [博客](https://parseword.net/blog)
* :white_check_mark: [Parseword](https://parseword.net):聚合多种经典每日单词谜题
#### damotiansheng(广州) - [Github](https://github.com/damotiansheng)
* :white_check_mark: [Deep Nostalgia AI](https://deep-nostalgia-ai.com/):借助人工智能照片动画,将家庭照片转变为引人入胜的动画视频,为珍贵的回忆注入活力的网站
#### newbe36524福建 - [Github](https://github.com/newbe36524)
* :white_check_mark: [Hagicode](https://hagicode.com/):用 OpenSpec 工作流、多 Agent 多实例并行、Hero Dungeon 游戏化重新定义 AI 编码体验
#### 我是欧阳
* :white_check_mark: [地理占星工具](https://astrocarto.net):用户输入出生日期、出生时间和出生地点后,可以直接生成一张全球地理占星图,把不同行星的 AS / DS / MC / IC 线投射到世界地图上,用来比较哪些城市更适合居住、工作、旅行、短住或做人生阶段选择。我做这个项目,主要是因为现有同类工具对普通用户不太友好:要么界面比较老,要么只给一张图、不解释结果,第一次接触的人很难真正用起来。所以这个版本更强调“可直接使用”和“降低理解门槛”
### 2026 年 3 月 14 号添加
#### maowei8888 - [Github](https://github.com/maowei8888)
* :white_check_mark: [BookletAI](https://bookletai.org/):面向普通用户的小册子 AI 工具,可自动调研、写作并生成排版好的 booklet 页面。