go语言实现调用阿里云api,获取hostname和ip字段值,输出exl表

简介: go语言实现调用阿里云api,获取hostname和ip字段值,输出exl表

效果


调用阿里云EMR服务API,获取集群中的主机名和ip地址,输出到exl表中

1675239813314.jpg


实现过程


例子:调用阿里云EMR服务的api,获取集群主机名和ip,输出到exl表

1、去阿里云api文档,查找接口文档

我这里只想获取集群的hostname和ip信息,所以我这里选择的是【查询集群主机列表】即可满足我的需求

1675239840439.jpg

1675239845060.jpg2、把上图右侧代码复制到自己电脑中编辑

1)使用go mod init emr初始化mod仓库

2)直接get下远程仓库代码,使用go mod tidy 自动获取依赖文件

go get github.com/alibabacloud-go/emr-20160408
go get github.com/thedevsaddam/gojsonq
• 1
• 2
go mod tidy

3)修改代码

调用阿里云api,默认返回json格式值,把它转化成字符串,在函数中_main中添加_string返回字符串类型值,得到字符串返回值赋值给HostNameIp字符串变量,gojsonq包调用这个字符串变量,截取字段值,清空覆盖输出到exl表格中

// This file is auto-generated, don't edit it. Thanks.
package main
import (
  "fmt"
  openapi "github.com/alibabacloud-go/darabonba-openapi/client"
  emr20160408 "github.com/alibabacloud-go/emr-20160408/client"
  "github.com/alibabacloud-go/tea/tea"
  "github.com/tealeg/xlsx"
  "github.com/thedevsaddam/gojsonq"
  "os"
)
var HostNameIp string
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *emr20160408.Client, _err error) {
  config := &openapi.Config{
    // 您的AccessKey ID
    AccessKeyId: accessKeyId,
    // 您的AccessKey Secret
    AccessKeySecret: accessKeySecret,
  }
  // 访问的域名
  config.Endpoint = tea.String("emr.cn-zhangjiakou.aliyuncs.com")
  _result = &emr20160408.Client{}
  _result, _err = emr20160408.NewClient(config)
  return _result, _err
}
func _main(args []*string) (_err error, _string string) {
  client, _err := CreateClient(tea.String("LTxxxxxxD95t"), tea.String("VKrUZeSH5xxxxxxxxxxxxxxxxxvAqM"))//填写AccessKey ID和AccessKey Secret
  if _err != nil {
    return _err, "登录失败"
  }
  listClusterHostRequest := &emr20160408.ListClusterHostRequest{
      StatusList: []*string{tea.String("NORMAL")}, //主机状态
    PageNumber: tea.Int32(1), //分页数
    PageSize: tea.Int32(10), //分页主机数量
    RegionId:  tea.String("cn-zhangjiakou"), //阿里云区域
    ClusterId: tea.String("C-FD39C77B200AEB73"), //集群id
  }
  // 复制代码运行请自行打印 API 的返回值
  List, _err := client.ListClusterHost(listClusterHostRequest)
  if _err != nil {
    return _err, "获取失败"
  }
  ListHostnameip := fmt.Sprint(*List)//把指针类型的值转化成字符串
  fmt.Printf("list的类型是%T", ListHostnameip)
  return _err, ListHostnameip //把得到的json格式值用string类型返回
}
func stdout() {
  jq := gojsonq.New().FromString(HostNameIp).From("body.HostList.Host").Select("HostName", "PrivateIp")//定义字段,在body下的hostlist下的host中截取hostname和privateip值
  deviceInfoList, ok := jq.Get().([]interface{})
  if !ok {
    fmt.Println("Convert deviceInfoList error")
  }
  xlsxFile := xlsx.NewFile()
  sheet, err := xlsxFile.AddSheet("Sheet 1")
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  sheet.AddRow().WriteSlice(&[]string{"主机名", "IP"}, 3)
  for _, deviceInfo := range deviceInfoList {
    deviceInfoMap, ok := deviceInfo.(map[string]interface{})
    if !ok {
      fmt.Println("Convert deviceInfoMap error")
    }
    row := sheet.AddRow()
    row.AddCell().SetValue(deviceInfoMap["HostName"])
    row.AddCell().SetValue(deviceInfoMap["PrivateIp"])
  }
  xlsxFile.Save("./result.xlsx")
}
func main() {
  err, Hostnameip := _main(tea.StringSlice(os.Args[1:]))
  if err != nil {
    panic(err)
  }
  HostNameIp = fmt.Sprint(Hostnameip)
  stdout()
  //fmt.Println(HostNameIp)
}

上一段代码运行完成后会发现,出现了很多不存在的主机也被输出到xls表格中,根据阿里云提供的api字段修改,可以解决这个问题,指定主机状态和页数

1675239896181.jpg

// This file is auto-generated, don't edit it. Thanks.
package main
import (
  "fmt"
  openapi "github.com/alibabacloud-go/darabonba-openapi/client"
  emr20160408 "github.com/alibabacloud-go/emr-20160408/client"
  "github.com/alibabacloud-go/tea/tea"
  "github.com/tealeg/xlsx"
  "github.com/thedevsaddam/gojsonq"
  "os"
)
var HostNameIp string
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *emr20160408.Client, _err error) {
  config := &openapi.Config{
    // 您的AccessKey ID
    AccessKeyId: accessKeyId,
    // 您的AccessKey Secret
    AccessKeySecret: accessKeySecret,
  }
  // 访问的域名
  config.Endpoint = tea.String("emr.cn-zhangjiakou.aliyuncs.com")
  _result = &emr20160408.Client{}
  _result, _err = emr20160408.NewClient(config)
  return _result, _err
}
func _main(args []*string) (_err error, _string string) {
  client, _err := CreateClient(tea.String("LTxxxxxxxxxxxxxxxxxxt"), tea.String("VKrUZeS9oDxxxxxxxxxxxxxxxxxxM"))//填写AccessKey ID和AccessKey Secret
  if _err != nil {
    return _err, "登录失败"
  }
  listClusterHostRequest := &emr20160408.ListClusterHostRequest{
    RegionId:  tea.String("cn-zhangjiakou"), //阿里云区域
    ClusterId: tea.String("C-FD39C77B200AEB73"), //集群id
    PageNumber: tea.Int32(1),
    PageSize: tea.Int32(10),
    // Array, 可选, 主机状态列表:  - NORMAL:正常  - ABNORMAL:异常  - RESIZING:配置中  - INITIALIZING:初始化中  - RELEASED:已释放
    StatusList: []*string{tea.String("NORMAL")},
  }
  // 复制代码运行请自行打印 API 的返回值
  List, _err := client.ListClusterHost(listClusterHostRequest)
  if _err != nil {
    return _err, "获取失败"
  }
  ListHostnameip := fmt.Sprint(*List)//把指针类型的值转化成字符串
  fmt.Printf("list的类型是%T", ListHostnameip)
  return _err, ListHostnameip //把得到的json格式值用string类型返回
}
func stdout() {
  jq := gojsonq.New().FromString(HostNameIp).From("body.HostList.Host").Select("HostName", "PrivateIp")//定义字段,在body下的hostlist下的host中截取hostname和privateip值
  deviceInfoList, ok := jq.Get().([]interface{})
  if !ok {
    fmt.Println("Convert deviceInfoList error")
  }
  xlsxFile := xlsx.NewFile()
  sheet, err := xlsxFile.AddSheet("Sheet 1")
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  sheet.AddRow().WriteSlice(&[]string{"主机名", "IP"}, 3)
  for _, deviceInfo := range deviceInfoList {
    deviceInfoMap, ok := deviceInfo.(map[string]interface{})
    if !ok {
      fmt.Println("Convert deviceInfoMap error")
    }
    row := sheet.AddRow()
    row.AddCell().SetValue(deviceInfoMap["HostName"])
    row.AddCell().SetValue(deviceInfoMap["PrivateIp"])
  }
  xlsxFile.Save("./result.xlsx")
}
func main() {
  err, Hostnameip := _main(tea.StringSlice(os.Args[1:]))
  if err != nil {
    panic(err)
  }
  HostNameIp = fmt.Sprint(Hostnameip)
  stdout()
  //fmt.Println(HostNameIp)
}

再次打开xls表格,会发现与现有集群信息一致

1675239922177.jpg


相关文章
|
7月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
369 2
|
7月前
|
人工智能 自然语言处理 测试技术
Apipost智能搜索:只需用业务语言描述需求,就能精准定位目标接口,API 搜索的下一代形态!
在大型项目中,API 数量庞大、命名不一,导致“找接口”耗时费力。传统工具依赖关键词搜索,难以应对语义模糊或命名不规范的场景。Apipost AI 智能搜索功能,支持自然语言查询,如“和用户登录有关的接口”,系统可理解语义并精准匹配目标接口。无论是新人上手、模糊查找还是批量定位,都能大幅提升检索效率,降低协作成本。从关键词到语义理解,智能搜索让开发者少花时间找接口,多专注核心开发,真正实现高效协作。
|
9月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
550 1
|
9月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
563 0
|
9月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
396 0
|
9月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
442 0
|
9月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
495 0
|
7月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
7月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
8月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。