需求:
我需要对腾讯云对象存储cos某一桶下目录前缀为xxx/的文件进行递归遍历,然后给文件添加cdn域名并对资源进行预热.
claude 与腾讯云cos api的联动
首先先体验一下腾讯云自有的api explorer:https://cloud.tencent.com/document/product/1278/46697,使用GET Bucket(List Object),参照:https://cloud.tencent.com/document/product/436/7734中的参数:
使用 API Explorer
稍微体验了一下:https://console.cloud.tencent.com/api/explorer?Product=cos&Version=2018-11-26&Action=GetBucket
怎么说呢,很差的体验,咱看一下其他的服务的api:
忍不住去用户群吐槽了一下.....
无论从文档还是左侧参数 右侧相关代码死代码,页面结构都是跟其他服务不一致..体验一下在线调用吧:
生成一个xml文件好纠结.......下面改怎么办呢?
我的解决方式:
导出这个xml文件---------过滤输出 <Key> /Key>的文件路径------------然后拼装加上cdn域名的头,然后把url文件给cdn预热api(这里直接使用了腾讯云的控制台操作)?正常的流程应该是这样的。
将文件导入到了服务器:
前几天 顺便体验了一下claude,chatgpt这些的。看小伙伴用poe:https://poe.com/ 也简单的玩了一下,以claude-2-100k为例,体验一下chat问答式的流程完成下面的流程:
chat式问答
问: 写一个脚本获取文件中所有<Key> /Key>中的内容,每一条一行输出
以下是答复,给出一个基于python的脚本:
貌似是可以的,但是想到,我想将输出内容到文件啊?再进一步提问:
问: 写一个脚本获取文件中所有<Key> /Key>中的内容,每一条一行输出到文件
好的,要将提取出来的<Key>内容输出到文件,只需要在打印的时候改为写入文件即可:
import re
with open('file.xml') as f:
content = f.read()
pattern = re.compile(r'<Key>(.*?)</Key>')
keys = pattern.findall(content)
with open('output.txt', 'w') as f:
for key in keys:
f.write(key + '\n')
主要改动:
打开一个输出文件output.txt用于写入
在循环中,使用文件对象的write()方法,将key的值和换行符'\n'一起写入文件
这样就可以把所有提取出来的<Key>内容,以换行分隔的格式写入到output.txt文件中
其他部分和匹配<Key>的正则表达式逻辑相同。
可以根据实际需求,调整打开文件方式,以及写入文件中的分隔符等。这种方法可以轻松地将提取后的内容输出到指定的文件中。
服务器尝试一下:
保存上面的py脚本为file.py 与file.xml为同一目录下运行python file.py:
ls查看目录下生成了output.txt,tail -f output.txt查看文件内容:
下一步接着给文件名添加上url前缀?
问: 给文件中upload的行添加一个url前缀
copy出脚本尝试一下:
cat url.py
prefix = 'https://example.com/'
with open('files.txt', 'r') as f:
lines = f.readlines()
with open('files_new.txt', 'w') as f:
for line in lines:
if line.startswith('upload'):
line = prefix + line
f.write(line)
运行脚本python url.py 查看目录生成files_new.txt,并tail -f查看:
下一步就直接用控制台操作了,直接忽略了!
以上步骤当然了还有其他的方法,腾讯云的cos大哥给我的控制台的方法:
我这里给API Explorer 团队建议能够实现成流水线的方式,实现步骤联动不知道他们是否会采纳......
chatgpt4完全使用一下生成式体验:
问:
完成以下操作:
1. 使用腾讯云go客户端密钥方式快速递归获取cos对象存储下某一文件夹下文件列表。
2. 获取文件表中所有<Key> /Key>中的内容,每一条一行输出到文件。
3. 为上一步中输出到文件的内容添加https://www.baidu.com/的前缀,并生成一个新的文件。
代码放入goland可能会有下面的提醒让将:= 替换成=操作一下:
最终main.go如下:
package main
import (
"bufio"
"context"
"fmt"
"net/http"
"net/url"
"os"
"time"
"github.com/tencentyun/cos-go-sdk-v5"
)
func main() {
u, _ := url.Parse("https://<your bucket>-<your appid>.cos.<region>.myqcloud.c")
b := &cos.BaseURL{BucketURL: u}
c := cos.NewClient(b, &http.Client{
Timeout: 100 * time.Second,
Transport: &cos.AuthorizationTransport{
SecretID: "xxxxxxxxxxxxxx",
SecretKey: "xxxxxxxxxxxxxxxxxx",
},
})
opt := &cos.BucketGetOptions{
Prefix: "1/",
Delimiter: "/",
EncodingType: "url",
}
v, _, err := c.Bucket.Get(context.Background(), opt)
if err != nil {
panic(err)
}
for _, cont := range v.Contents {
fmt.Printf("%s\n", cont.Key)
}
//v, _, err = c.Bucket.Get(context.Background(), opt)
//if err != nil {
// panic(err)
//}
file, err := os.Create("fileList.txt")
if err != nil {
panic(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
for _, cont := range v.Contents {
fmt.Fprintln(writer, cont.Key)
}
writer.Flush()
file, err = os.Open("fileList.txt")
if err != nil {
panic(err)
}
defer file.Close()
newFile, err := os.Create("newFileList.txt")
if err != nil {
panic(err)
}
defer newFile.Close()
scanner := bufio.NewScanner(file)
writer = bufio.NewWriter(newFile)
for scanner.Scan() {
fmt.Fprintln(writer, "https://www.baidu.com/"+scanner.Text())
}
writer.Flush()
}
运行main.go
完美但是没有忽略文件夹?但是gtp4次数用光了无法提问了.....也试了一下API Explorer。貌似会带这个文件夹根的忽略了!
另外正常生成文件应该在同一目录的,我这是在自己玩的一个项目下test目录执行的故都生成文件在上一层目录了! 当然了项目依赖的安装这里都忽略了,自己使用 go get -u 安装以下依赖包?
对了强调一下 我用的go1.17 用1.19的时候defer file.Close()报错了....小白搞不懂...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。