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 功能设计
我们实现两种创建方式:
- 普通创建:手动指定分类、名称和描述
- 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 默认创建书签逻辑
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创建书签流程
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语言博客"
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. 总结 🚀
本文详细介绍了命令行书签管理工具的实现,关键点包括:
- 双模式创建:支持普通和AI两种创建方式
- 智能交互:友好的命令行提示和确认流程
- AI集成:复用Web端AI功能,保持一致性
- 批处理支持:通过
-y
参数实现无人值守操作
- Ai书签管理工具开发全记录(一):项目总览与技术蓝图
- Ai书签管理工具开发全记录(二):项目基础框架搭建
- AI书签管理工具开发全记录(三):配置及数据系统设计
- AI书签管理工具开发全记录(四):日志系统设计与实现
- AI书签管理工具开发全记录(五):后端服务搭建与API实现
- AI书签管理工具开发全记录(六):前端管理基础框框搭建 Vue3+Element Plus
- AI书签管理工具开发全记录(七):页面编写与接口对接
- AI书签管理工具开发全记录(八):Ai创建书签功能实现
- AI书签管理工具开发全记录(九):用户端页面集成与展示