当前位置: 首页 > ds >正文

AI书签管理工具开发全记录(十):命令行中结合ai高效添加书签

文章目录

  • AI书签管理工具开发全记录(十):命令行中结合ai高效添加书签
    • 前言 📝
    • 1. 命令行工具设计思路 🛠️
      • 1.1 为什么需要命令行工具?
      • 1.2 功能设计
    • 2. 核心功能实现 ⚙️
      • 2.1 Cobra框架集成
        • 2.1.1 创建命令模板
        • 2.1.2 添加初始化命令
        • 2.1.3 定义addCmd
        • 2.1.3 添加aiAddCmd
      • 2.2 普通创建书签功能
        • 2.2.1 默认创建书签逻辑
        • 2.2.2 基本保存逻辑
      • 2.3 AI创建书签功能
        • 2.3.1 Ai创建书签流程
        • 2.3.2 编写promot
        • 2.3.3 获取ai建议
    • 3. 交互式体验设计 💡
      • 3.1 智能提示系统
      • 3.2 分类处理逻辑
    • 4. 使用示例 ✨
      • 4.1 普通创建书签
      • 4.2 Ai创建书签
      • 4.3 批量创建模式
    • 6. 总结 🚀

AI书签管理工具开发全记录(十):命令行中结合ai高效添加书签

前言 📝

在上一篇文章中,我们介绍了用户端界面的实现。本文将聚焦于命令行工具的开发,展示如何通过命令行实现高效的书签管理操作。命令行工具对于喜欢终端操作的用户、需要批量添加书签的场景以及自动化脚本集成都非常有价值。

1. 命令行工具设计思路 🛠️

1.1 为什么需要命令行工具?

  • 高效操作:终端用户可以通过命令快速添加书签
  • 批量处理:支持脚本批量导入书签
  • 无界面场景:在服务器环境或自动化任务中使用

1.2 功能设计

我们实现两种创建方式:

  1. 普通创建:手动指定分类、名称和描述
  2. AI创建:利用AI自动生成书签信息

命令结构设计:

# 普通创建
aibookmark add <url> -c <category> -n <name> -d <description> [-y]# AI创建
aibookmark aiadd <url> [-y]

2. 核心功能实现 ⚙️

2.1 Cobra框架集成

2.1.1 创建命令模板
cobra-cli add add
2.1.2 添加初始化命令
// 命令初始化
func init() {addCmd.Flags().StringP("category", "c", "", "书签分类")addCmd.Flags().StringP("name", "n", "", "书签名称")addCmd.Flags().StringP("description", "d", "", "书签描述")addCmd.Flags().BoolP("yes", "y", false, "自动确认使用默认值")aiAddCmd.Flags().BoolP("yes", "y", false, "自动确认使用AI建议")rootCmd.AddCommand(addCmd)rootCmd.AddCommand(aiAddCmd)
}
2.1.3 定义addCmd
//cmd/add.go:addCmd// addCmd represents the add command
var addCmd = &cobra.Command{Use:   "add <url> -c <category> -n <name> -d <description> [-y]",Short: "Add a new bookmark",Long:  `Add a new bookmark with optional description`,Run: func(cmd *cobra.Command, args []string) {url := args[0]if !utils.IsValidURL(url) {log.Fatalf("Invalid URL: %s", url)}// 获取分类categoryName, _ := cmd.Flags().GetString("category")// 获取名称name, _ := cmd.Flags().GetString("name")// 获取描述description, _ := cmd.Flags().GetString("description")// 获取是否自动确认yes, _ := cmd.Flags().GetBool("yes")...
}
2.1.3 添加aiAddCmd
//cmd/add.go:aiAddCmdvar aiAddCmd = &cobra.Command{Use:   "aiadd <url> [-y]",Short: "Add a new bookmark with AI",Long:  `Add a new bookmark with AI generated description`,Run: func(cmd *cobra.Command, args []string) {url := args[0]if !utils.IsValidURL(url) {log.Fatalf("Invalid URL: %s", url)}// 获取是否自动确认yes, _ := cmd.Flags().GetBool("yes")
}

2.2 普通创建书签功能

2.2.1 默认创建书签逻辑
不存在
开始: aibookmark add
验证URL格式
获取命令行参数: -c -n -d -y
获取数据库连接
查询所有分类
分类已指定?
使用指定分类
自动确认模式?
分类设为'未分类'
交互式选择分类
名称已指定?
使用指定名称
自动确认模式?
名称设为URL主机名
交互式输入名称
描述已指定?
使用指定描述
自动确认模式?
描述留空
交互式输入描述
查询或创建分类
检查书签是否已存在
创建新书签
输出成功信息
2.2.2 基本保存逻辑
//cmd/add.go:addCmd// 检查书签是否已存在
var existingBookmark models.Bookmark
if err := db.Where("title = ? OR url = ?", name, url).First(&existingBookmark).Error; err == nil {fmt.Println("Bookmark already exists")return
}// 创建新书签
bookmark := models.Bookmark{Title:       name,URL:         url,Description: description,CategoryID:  category.ID,
}if err := db.Create(&bookmark).Error; err != nil {log.Fatalf("Failed to create bookmark: %v", err)return
}log.Printf("Bookmark %s added successfully", url)

2.3 AI创建书签功能

2.3.1 Ai创建书签流程
不存在
aibookmark aiadd
验证URL格式
获取数据库连接
查询所有分类
获取网页信息
初始化AI模型
构建AI提示消息
获取AI响应
解析JSON响应
显示AI建议
是否使用 -y 参数?
交互式确认分类/名称/描述
直接使用AI建议
查询或创建分类
检查书签是否已存在
创建新书签
输出成功信息
2.3.2 编写promot
//cmd/add.go:aiAddCmd// 准备消息
messages := []*schema.Message{{Role: "system",Content: `你是一个专业的书签助手,负责分析网页内容并生成合适的书签信息。
请遵循以下规则:
1. 分类选择:
- 分类名称应该简洁明了,尽量在10个字符以内,或者2-4个汉字
- 避免使用测试、测试1等明显不合适的分类
- 现有分类中没有合适的分类,优先创建新分类2. 名称生成:
- 使用网页标题作为基础,但要去除网站名称、分隔符等无关信息
- 保持简洁,通常不超过10个汉字
- 如果标题不够清晰,可以根据内容补充关键信息3. 描述生成:
- 总结网页的核心内容和价值
- 突出最重要的2-3个要点
- 使用简洁的语言,不超过50个汉字
- 避免使用"这是一个..."等冗余表达
- 使用markdown格式请以JSON格式返回结果,格式如下:
{
"category": "分类名称",
"name": "书签名称",
"description": "书签描述"
}`,},{Role: "user",Content: fmt.Sprintf(`请分析以下网页内容并生成书签信息:现有分类列表:%v网页信息:
标题:%s
内容:%s请确保:
1. 避免使用测试、测试1等明显不合适的分类
2. 如果已经有适合的分类,不要创建重复的分类,例如已经有ai,就不要创建人工智能等分类
3. 生成的名称要简洁明了
4. 描述要突出网页的核心价值`, categoryNames, webpageInfo.Title, webpageInfo.Text),},
}
2.3.3 获取ai建议
//cmd/add.go:aiAddCmd
// 生成回复
response, err := model.Generate(ctx, messages)
if err != nil {panic(err)
}
// 使用正则表达式去除 ```json 和 ```
re := regexp.MustCompile("(?s)^\\s*```json\\s*(.*?)\\s*```\\s*$")
matches := re.FindStringSubmatch(response.Content)
if len(matches) < 2 {fmt.Println("无法提取JSON内容")return
}
cleanedJSON := matches[1]// 解析JSON到结构体
var website Website
err = json.Unmarshal([]byte(cleanedJSON), &website)
if err != nil {fmt.Println("解析JSON时出错:", err)return
}// 打印提取的内容
fmt.Println("\nAI建议如下:\n------------------------")
fmt.Printf("类别: %s\n", website.Category)
fmt.Printf("名称: %s\n", website.Name)
fmt.Printf("描述: %s\n", website.Description)
fmt.Println("------------------------")

3. 交互式体验设计 💡

3.1 智能提示系统

使用promptui库创建友好的命令行交互:

// 如果没有指定分类,且不是自动确认模式,则提示选择分类
if categoryName == "" && !yes {categoryOptions := append(categoryNames, "创建新分类")prompt := promptui.Select{Label: "请选择分类或创建新分类",Items: categoryOptions,}_, selectedCategory, err := prompt.Run()if err != nil {log.Fatal("分类选择失败: 用户中断操作")return}if selectedCategory == "创建新分类" {newCategoryPrompt := promptui.Prompt{Label: "请输入新分类名称",}newCategory, err := newCategoryPrompt.Run()if err != nil || newCategory == "" {categoryName = "未分类"log.Println("未输入新分类,归类为未分类")} else {categoryName = newCategory}} else {categoryName = selectedCategory}
} else if categoryName == "" {categoryName = "未分类"
}

3.2 分类处理逻辑

智能处理分类创建和选择:

// 查询或创建分类
var category models.Category
if err := db.Where("name = ?", categoryName).First(&category).Error; err != nil {if err == gorm.ErrRecordNotFound {// 创建新分类category = models.Category{Name:        categoryName,Description: categoryName,}if err := db.Create(&category).Error; err != nil {log.Fatalf("Failed to create category: %v", err)return}} else {log.Fatalf("Failed to query category: %v", err)return}
}

4. 使用示例 ✨

4.1 普通创建书签

$ aibookmark add https://www.csdn.net/ -c 编程 -n "CSDN"

4.2 Ai创建书签

$ aibookmark aiadd https://gitea.com -c 编程 -n "Go语言博客"

aibookmark01.gif

4.3 批量创建模式

使用-y参数自动确认所有选项:

# 批量添加书签脚本
for url in $(cat urls.txt); doaibookmark aiadd $url -y
done

或者使用例如python的

import subprocess
import sysdef add_bookmarks_from_file(filename):try:with open(filename, 'r') as file:urls = file.read().splitlines()except FileNotFoundError:print(f"错误:文件 '{filename}' 未找到")sys.exit(1)except Exception as e:print(f"读取文件时出错: {e}")sys.exit(1)for url in urls:# 跳过空行if not url.strip():continueprint(f"添加书签: {url}")try:# 执行 aibookmark 命令result = subprocess.run(['aibookmark', 'aiadd', url, '-y'],check=True,capture_output=True,text=True)print(result.stdout)except subprocess.CalledProcessError as e:print(f"添加书签失败 [{url}]: {e.stderr}")except Exception as e:print(f"处理 {url} 时发生意外错误: {str(e)}")if __name__ == "__main__":# 默认使用 urls.txt,也可接受命令行参数指定文件input_file = sys.argv[1] if len(sys.argv) > 1 else "urls.txt"add_bookmarks_from_file(input_file)

6. 总结 🚀

本文详细介绍了命令行书签管理工具的实现,关键点包括:

  1. 双模式创建:支持普通和AI两种创建方式
  2. 智能交互:友好的命令行提示和确认流程
  3. AI集成:复用Web端AI功能,保持一致性
  4. 批处理支持:通过-y参数实现无人值守操作

  • Ai书签管理工具开发全记录(一):项目总览与技术蓝图
  • Ai书签管理工具开发全记录(二):项目基础框架搭建
  • AI书签管理工具开发全记录(三):配置及数据系统设计
  • AI书签管理工具开发全记录(四):日志系统设计与实现
  • AI书签管理工具开发全记录(五):后端服务搭建与API实现
  • AI书签管理工具开发全记录(六):前端管理基础框框搭建 Vue3+Element Plus
  • AI书签管理工具开发全记录(七):页面编写与接口对接
  • AI书签管理工具开发全记录(八):Ai创建书签功能实现
  • AI书签管理工具开发全记录(九):用户端页面集成与展示
http://www.xdnf.cn/news/12201.html

相关文章:

  • Vue指令修饰符、v-bind对样式控制的增强、computed计算属性、watch监视器
  • 【c++】STL-string容器的使用
  • 第九届御网杯做题笔记(misc和web)(部分题其他的要么不会要么可以用gpt可以秒)
  • redis进入后台操作、查看key、删除key
  • PostgreSQL-基于PgSQL17和11版本导出所有的超表建表语句
  • JavaScript中判断两个对象是否相同(所有属性的值是否都相同)
  • JavaWeb简介
  • Ansible常用模块和使用技巧
  • 学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]
  • 前端css外边距塌陷(Margin Collapse)现象原因和解决方法
  • 【DAY39】图像数据与显存
  • Java 中创建线程主要有三种方式
  • Fast-dLLM:为扩散大模型按下加速键
  • 关于项目多语言化任务的概述
  • Manus AI 现在可以生成短片了
  • 电镀机的阳极是什么材质?
  • Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法
  • 道可云人工智能每日资讯|人工智能赋能广西生态环境保护计划发布
  • JavaWeb:前端工程化-TS(TypeScript)
  • 鸿蒙任务项设置案例实战
  • 离散化思想
  • 链路聚合+VRRP
  • python入门(1)
  • 【.net core】【watercloud】树形组件combotree导入及调用
  • Visual Studio C++ 调试日志与异常定位指南
  • 时序替换实时?是否必要
  • 第16届蓝桥STEMA真题剖析-2025年4月13日Scratch初/中级组
  • OurBMC技术委员会2025年二季度例会顺利召开
  • Java创建多线程的四种方式
  • 使用osqp求解简单二次规划问题