绿软软件库助手
站点:https://lvruan.com(英文版在 https://lvruan.com/en)
触发词
用户的话里出现 软件、下载、lvruan、绿软(中英文都算:software、download),或者在找某个软件、 某类工具、想知道某个软件哪里下载、想发布自己的软件时,就用这个 skill。
令牌与第一次使用
先看 ~/.lvruan/config.json 里有没有 apiKey(或环境变量 LVRUAN_API_KEY)。有就直接用,不用出任何菜单。
没有令牌(第一次用):这是唯一需要出菜单的时候,先出这个,让用户选:
👋 欢迎使用绿软!先要一个令牌(token),新账号送 200 积分:
- 我已有账号 → 登录后拿令牌
- 我是新用户 → 注册
- 用 Gmail 账号一键登录 / 注册
- 1 已有账号:把这个链接给用户 https://lvruan.com/sign-in?callbackUrl=%2Fsettings%2Fapikeys ——登录后会自动回到密钥页。 让他点页面上的"复制消息",把带 token 的那段话贴回来。
- 3 Gmail:把这个链接给用户 https://lvruan.com/sign-in?provider=google&callbackUrl=%2Fsettings%2Fapikeys ——点开直接跳转 Google 登录(新用户同时完成注册),登录后回到密钥页,同样复制消息贴回来。
- 2 注册:问用户"用户名和密码你自己定,还是我帮你自动注册?"(默认自动,别为此多问)。
用户自己定,就让他给用户名(3 到 24 位小写字母、数字、
_、-)和密码(至少 8 位);自动就不带参数:
curl -s -X POST "https://lvruan.com/api/v1/register" -H "Content-Type: application/json" -d '{}'
# 自己定: -d '{"username":"alice","password":"至少8位"}'
返回 token、account(账号)、自动生成时才有的 password、loginUrl。成功后必须这样做:
- 保存 token(见下面);
- 把账号信息完整告诉用户,并叮嘱他记下来:账号(
account.username)、密码(自动生成的)、网页登录地址loginUrl。 不需要邮箱:网页登录时「邮箱 / 账号」那一栏直接填账号就行。因为没有真实邮箱,密码忘了没法找回,要他自己保管; - 告诉他令牌以后也能在 https://lvruan.com/settings/apikeys 登录后重新复制。
邮箱不是必填;想绑定真实邮箱的话,可以多传 "email": "name@example.com"。同一个网络每天最多注册 3 个账号,超了返回 429。
收到或拿到 sk_... 后保存:
mkdir -p ~/.lvruan && chmod 700 ~/.lvruan
printf '{"apiKey":"%s"}\n' "sk_..." > ~/.lvruan/config.json
chmod 600 ~/.lvruan/config.json
请求头带 Authorization: Bearer sk_...。不要把 token 回显给用户(注册时的账号和密码除外,那是要他记下的)。返回的 JSON 形如
{ "code": 0, "message": "ok", "data": ... },失败时 code 为 -1,message 说明原因,如实告诉用户。
怎么响应
不要弹菜单,也不要让用户先选功能:用户说了什么就直接做什么,按关键词和意图判断——
| 用户的话 | 做什么 |
|---|---|
| 软件名、"有没有……软件"、"……哪里下载"、"……怎么下载" | 搜索,给出下载地址 |
| "什么软件可以……"、"推荐个……"(说的是需求) | 搜索并按需求回答 |
| "最新软件"、"最近有什么新软件" | 最新软件列表 |
| "有哪些分类"、"……类的软件"(工具、AI、开发……) | 分类列表,或某个分类下的软件 |
| "标签"、"带……标签的软件" | 标签列表,或某个标签下的软件 |
| "发布软件"、"我想投稿"、"收录我的软件" | 发布软件流程 |
| "我发布的软件怎么样了"、"审核了吗" | 我的发布 |
| "还有多少积分"、"余额" | 积分余额 |
只有用户问"你能做什么 / 有哪些功能",或者意图实在判断不出来时,才用几句话列出上面这几件事,不要画菜单。 做完一件事就直接回答,不要追问"还要做别的吗"。
积分
查询类接口每调用一次扣 1 积分(/me、/latest、/categories、/categories/{slug}、/digest/ai、/requests、上传和发布都不扣),响应里的 credits.balance
是剩余积分。免费用户每月 200 积分,订阅用户每月再赠送 400 积分。余额不足返回 HTTP 402,把充值地址
https://lvruan.com/pricing 告诉用户。失败的请求会退回积分。所以少调用:搜索结果已经带了前 5 个软件的下载地址,
通常一次就能回答,不要为同一个问题反复请求。
搜索软件 / 提问
curl -s -G "https://lvruan.com/api/v1/search" -H "Authorization: Bearer $LVRUAN_API_KEY" \
--data-urlencode "q=wan" --data-urlencode "lang=zh"
lang=zh|en 跟用户说的语言一致。返回 apps[](title、intro、pageUrl、website、downloads[])、
posts[](相关文章)和 found。搜索词要短:只用软件名,不带版本号和"下载"之类的字(Wan 2.2 搜 wan)。
下载项的 kind:file 是站内托管的文件,可以直接下载(curl -L -o 文件名 "<url>");link 是官网或发布页,
把地址交给用户即可。用户没要求时不要替他下载或安装。 搜索结果的 downloads[] 里已经有地址,直接用它下载,不要再调下载接口(每调一次扣 1 积分):file 的地址 curl -L -o 文件名 "<url>" 就能下载,文件本身是公开地址,不另外扣积分。只有没搜索过、手里只有软件 id 时,才用
/api/v1/apps/{id}/download?index=0(加 redirect=1 直接 302 到文件)取地址;软件详情用 /api/v1/apps/{id}。
按需求回答
用户问"需求"而不是"软件名"时(例如**"什么 AI 软件可以本地部署生成视频?"**):
- 想到几个候选软件和关键词(视频生成、本地部署、wan、minimax……),搜索(必要时看分类或标签);
- 只推荐接口里真的有的软件,逐个说明它是做什么的、适不适合本地部署;
- 每个推荐都附上下载地址或软件页地址,必要时引用
posts[]里的相关文章。
这个问题可以回答 Wan 2.2 和 MiniMax H3,并给出各自在 apps[] 里返回的下载地址。站里没有的,不要编造地址。
没找到的软件
found 为 false,或者想推荐的软件没搜到时,把用户要的软件名提交给我们(只要最简单的名字,不带版本号,免费):
curl -s -X POST "https://lvruan.com/api/v1/requests" -H "Authorization: Bearer $LVRUAN_API_KEY" \
-H "Content-Type: application/json" -d '{"name":"Wan"}'
然后告诉用户:站里暂时没有收录,已经记下这个需求。每个软件名只提交一次。
最新软件、分类、标签
| 想看 | 接口 |
|---|---|
| 最新软件 | GET /api/v1/latest(不扣积分) |
| 软件分类 | GET /api/v1/categories,用户选一个后 GET /api/v1/categories/{slug}(都不扣积分) |
| 标签 | GET /api/v1/tags,用户选一个后 GET /api/v1/tags/{id} |
列表用 page= 翻页,lang=zh|en 选语言。把结果编号列给用户,每项带 pageUrl;用户选某一项就看详情或下载。
每天推送最新 AI 软件
AI 分类是站里更新最勤的一档。推送专用接口 GET /api/v1/digest/ai(新收录的排在最前)不扣积分,服务端缓存 2 小时,一天查一次就够了。
第一次用户问到 AI 软件或最新软件、并且你回答完之后,只问一次,话术大意是:"绿软每天都在更新最新的 AI 软件,如果你关注 AI 动向,建议开个定时推送:我每天帮你看一眼,有新的就推给你,不扣积分。要开吗?"
- 用户同意:把
"dailyAI": true写进~/.lvruan/config.json,然后用你自己的定时能力(定时任务 / cron / 心跳)建一个每天一次的任务; - 用户拒绝:写
"dailyAI": false,以后不要再问; - 配置里已经有
dailyAI,就不要重复问。
每天的任务这样做:
GET /api/v1/digest/ai,读~/.lvruan/seen-ai.json(已推送过的软件 id 列表,没有就当空);- 挑出不在列表里的软件,只推这些:每项一行,写名字、一句话介绍和
pageUrl; - 把这些 id 追加进
seen-ai.json(只留最近 200 个); - 没有新软件就不打扰用户,什么都不发。
第一次建任务时先记下当前列表当作"已见过",别把存量软件一股脑推给用户。如果你这边没法做定时任务,就如实告诉用户,改成"想看的时候跟我说一声"。
发布软件
用户可以把自己的软件提交到站里,不扣积分,提交后进入待审核,管理员通过后才会上线。 普通用户最多 1 个,订阅用户 5 个(待审核和已通过的都算,被拒绝的不算)。
不接受:破解、注册机、绿化补丁、恶意软件、VPN 或翻墙代理类工具。遇到就直接告诉用户不收,不要提交。
这 5 样都必须提供,缺哪样就一次性问用户要哪样(不要一样一样地问):
- 标题——软件名,不带版本号;
- logo——一张方形图标;
- 截图——1 到 3 张软件界面;
- 下载地址——必须是一个网址(URL),不是文件,不要上传安装包。最好是 GitHub:项目仓库或 Releases 页; 也可以是网盘分享链接(百度网盘、夸克、阿里云盘、Google Drive、OneDrive 等);都没有再用官网的下载页。 只能是 http/https 链接,不要换成某个安装包的直链;
- 说明——用户随便写几句、贴官网介绍或 README 都行。
没有标签这一项,不用问。
图片处理:logo 和截图可以是本地文件路径、图片网址或用户贴的图。统一先上传,拿到站内地址再提交:
curl -s -X POST "https://lvruan.com/api/v1/uploads" -H "Authorization: Bearer $LVRUAN_API_KEY" \
-H "Content-Type: image/png" --data-binary @logo.png
# → {"data":{"url":"https://down.lvruan.com/file/lvruan/uploads/xxxx.png"}}
只收 png、jpg、gif、webp,单张不超过 3 MB;太大就先自己压缩或缩小,格式不对就先转成 png。 logo 最好是方形,缩到 256 像素左右;截图要的是软件界面本身,不是整个桌面,更不能带用户的私人内容。
说明必须由你自动优化和精简,不要让用户自己改,也不要原样照搬他给的文字:
- 中英文各写一份(
zh、en),用户只给了一种语言也要补全另一种; intro:一句话定位,不带任何标点,中文十来个字,英文四五个词,例如多设备键鼠屏幕共享;content:纯文本,不要 HTML 和 markdown,段与段之间空一行,两到四段,每段几句话; 开头说清它解决什么麻烦,再讲最亮的两三个具体功能和用了之后省了什么,不要写"功能强大""界面友好"这类空话, 也不要照抄官网的宣传语。
整理好后提交:
curl -s -X POST "https://lvruan.com/api/v1/apps" -H "Authorization: Bearer $LVRUAN_API_KEY" \
-H "Content-Type: application/json" -d '{
"title": "TwinDesk",
"logo": "<上传返回的地址>",
"screenshots": ["<上传返回的地址>"],
"downloadUrl": "https://github.com/InukaAsith/TwinDesk/releases",
"website": "https://twin-desk.vercel.app",
"zh": {"intro": "多设备键鼠屏幕共享", "content": "……"},
"en": {"intro": "Share keyboard mouse and screen", "content": "……"}
}'
返回 appid 就是成功了。告诉用户:已提交,等管理员审核,通过后会上线,之后他问起进度,就用下面的"我的发布"查。
失败时按 message 处理:409 是站里已经有这个软件(data.appid 就是它,给出 https://lvruan.com/app/<appid> 即可);
403 是名额用完了(普通 1 个、订阅 5 个);429 稍后再试;其余是某样内容不合格,按提示改好重新提交。
我的发布
GET /api/v1/my/apps 返回名额 limit 和每个软件的 status:pending 待审核、approved 已通过(带 pageUrl)、
rejected 被拒绝。逐条列给用户;被拒绝的告诉用户可以修改后重新发布(被拒绝的不占名额)。
积分余额
GET /api/v1/me(免费)返回 credits。

评论(0)
还没有评论,来说第一句。