简介

前面实现的一个简易suno-api。是使用cookie来获取suno-token发起请求的。当时并没有通过配置的方式来获取cookie,而是直接在代码中写死了cookie的值,这种做法并不好,所以现在打算把cookie值改造为一个配置,通过viper来读取。

什么是viper

Viper是一个用于Go语言的应用程序配置库,它支持多种格式的配置文件,如JSON、YAML、TOML等,并且可以轻松地从环境变量、命令行参数、远程配置源等读取配置。Viper由Spf13开发,是Cobra和Hugo等项目的一部分。

安装

要开始使用Viper,首先需要安装它。可以使用Go的包管理工具go get来安装:

go get github.com/spf13/viper

基本使用

配置定义

suno: cookie: "12321312312321"

配置结构体

package autoload type Config struct { *Suno `mapstructure:"suno"` } type Suno struct { Cookie string `mapstructure:"cookie"` }

全局变量

package internal import "go-suno/config/autoload" var ( // BasePath 项目根目录 BasePath string // Conf 全局配置 Conf *autoload.Config )

初始化Viper

定义viper初始化方法,读取配置文件并绑定到配置结构体

package viper import ( "fmt" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" "go-suno/internal" "log" "path" "runtime" ) // Init 初始化viper func Init() { _, filename, _, _ := runtime.Caller(0) internal.BasePath = path.Dir(path.Dir(path.Dir(filename))) viper.SetConfigFile(internal.BasePath + "/config/config.yaml") // 指定配置文件路径 err := viper.ReadInConfig() // 读取配置信息 if err != nil { // 读取配置信息失败 log.Fatal("viper.ReadInConfig() failed,err:" + err.Error()) } // 把读取到的配置信息反序列化到Conf 变量中 if err := viper.Unmarshal(&internal.Conf); err != nil { log.Fatal("viper.Unmarshal failed, err:" + err.Error()) } // 监控配置文件变化 viper.WatchConfig() viper.OnConfigChange(func(in fsnotify.Event) { fmt.Println("配置文件修改了") if err := viper.Unmarshal(&internal.Conf); err != nil { fmt.Printf("viper.Unmarshal failed, err:%v\n", err) } }) }

测试效果

main入口调用viper初始化方法,创建测试配置接口

package main import ( "github.com/gin-gonic/gin" "go-suno/internal" "go-suno/pkg/viper" "net/http" ) func main() { r := gin.Default() // 配置加载 viper.Init() // 使用中间件 internal.RateLimitMiddleware(r, 1, 100) // 创建一个路由组,可以为其添加中间件 handler := new(internal.Handler) v1 := r.Group("/api") { v1.POST("/gen", handler.GenMusic) v1.GET("/feed", handler.GetFeed) // 测试 v1.GET("/config", func(c *gin.Context) { c.JSON(http._StatusOK_, gin.H{ "data": internal.Conf.Suno.Cookie, }) }) } _ = r.Run() }

设置配置文件

启动项目

go run main.go

访问测试接口

完整代码

https://gitee.com/mofung1/go-suno

应用场景

在公司的项目中我也应用了这项技术,具体可以参考ChatMoney这款产品;ChatMoney专注于AI应用落地与变现,提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney.cn获取更多AI变现方案!

AI接口实现:简单实现Viper配置管理的更多相关文章

  1. 基于flask和百度AI接口实现前后端的语音交互

    话不多说,直接怼代码,有不懂的,可以留言 简单的实现,前后端的语音交互. import os from uuid import uuid4 from aip import AipSpeech from ...

  2. Java集合框架中List接口的简单使用

    Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...

  3. loadrunner做webservice接口之简单调用

    今天听大神讲了webservice做接口,我按照他大概讲的意思自己模拟实战了下,可能还有很多不对,一般使用webservice做接口,会使用到soapui,但是用了loadrunner以后发现lr很快 ...

  4. FFmpeg与libx264接口源代码简单分析

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. 采用ADM2483磁隔离器让RS485接口更简单更安全

    采用ADM2483磁隔离器让RS485接口更简单更安全 摘要:本文介绍RS485的特点及应用,指出了普通RS485接口易损坏的问题,针对存在的问题介绍了以ADM2483为核心的磁隔离解决方案. 关键词 ...

  6. 【转】MyBatis接口的简单实现原理

    MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...

  7. MyBatis接口的简单实现原理

    MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...

  8. usb接口类型 简单分类辨识

    usb接口类型 简单分类辨识 - [相似百科] 庆欣 0.0 4 人赞同了该文章 1. 先放图,随着越来越多的接触智能设备,会遇到各种各样的usb接口,对于很多人来说,接口类型只有:usb接口,安卓接 ...

  9. [初识]使用百度AI接口,图灵机器人实现简单语音对话

    一.准备 1.百度ai开放平台提供了优质的接口资源https://ai.baidu.com/  (基本免费) 2.在语音识别的接口中, 对中文来说, 讯飞的接口是很好的选择https://www.xf ...

  10. 使用百度ai接口加图灵机器人完成简单web版语音对话

    app文件 from flask import Flask, request, render_template, jsonify, send_file from uuid import uuid4 i ...

随机推荐

  1. SpringBoot的yml文件报org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here in 'reader', line 11, column 16:

    报错内容如下: 报错代码如下: 1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: query_route 6 uri: https://baidu.org ...

  2. BGP四大属性

    **公认必遵**:Origin.AS_Path.Next_hop(所有BGP路由都必须识别这类属性,且必须在Update报文中传递,如果缺少就报错) Origin:指示路由信息的来源(如IGP.EGP ...

  3. Spring定时任务的秘密

    Spring定时任务的秘密 在 Spring 框架中,定时任务主要通过 @Scheduled 注解或 TaskScheduler 接口实现. 1.基本使用 在 Spring Boot 项目中,通过 @ ...

  4. Linux性能分析-平均负载

    平均负载的理解 一般系统变慢时,我们会使用top或uptime命令来查看下系统的负载情况 [root@localhost shell]# uptime 13:51:08 up 5 days, 21:5 ...

  5. 探秘Transformer系列之(20)--- KV Cache

    探秘Transformer系列之(20)--- KV Cache 目录 探秘Transformer系列之(20)--- KV Cache 0x00 概述 0x01 自回归推理的问题 1.1 请求的生命 ...

  6. 如何优化和提高MaxKB回答的质量和准确性?

    目前 ChatGPT.GLM等生成式人工智能在文本生成.文本到图像生成等在各行各业的都有着广泛的应用,但是由于大模型训练集基本都是构建于网络公开的数据,对于一些实时性的.非公开的或离线的数据是无法获取 ...

  7. AIR780E引脚复用笔记

    1.应用场景:   使用AIR780E模块驱动TM1637数码管驱动芯片,原有方案是AIR724UG+TM1637.为了降低成本,按照官方方案进行代码迁移.   伴随着代码迁移,硬件引脚也需要做相应调 ...

  8. 再谈kettle两种循环之--调用http分页接口循环获取数据

    再谈kettle两种循环之 – 调用http分页接口循环获取数据 1.场景介绍: 由于数据量比较大,接口有返回限制,需要用到循环分页获取数据 2.案例适用范围: 循环job可参考,变量运用可参考,调用 ...

  9. app自动化的特殊操作

    一.截屏 File srcfile=driver.getScreenshotAs(OutputType.FILE); //得到截图源文件对象 File dstfile=new File("C ...

  10. windows下安装maven环境(windows10)

    1.下载maven https://archive.apache.org/dist/maven/maven-3/ 2.安装配置 1.解压后新建本地仓库 2.编辑apache-maven-3.0.5-b ...