本次是笔者在学习golang开发语言中自行编写的一个小工具,由于笔者本人目前还未学会golang的图形化界面打造,若使用图形化界面进行打造,可以增加更多的功能,本文章包含golang的http请求、flag包获取命令行输入、base64加密、base64解密、简单的逻辑运算等知识。
笔者本人目前还在golang学习的初级阶段,望大佬多多指点。
package mainimport ("flag""fmt")func main() {act := flag.String("act", "", "")flag.Parse()fmt.Println("act:", *act)}
使用go run xx.go -act qwe执行看看效果。
解析一下这个flag包的用法,flag.String()包默认是*String的类型。flag.Parse()主要是把用户传递的命令行参数解析为对应变量的值。flag.String("act","","")是需要用户使用-act参数来获取用户输入的参数。当然flag包还有其他写法。
http请求主要用的是golang内置的net/http包,这里先采用GET请求。
使用http.NewRequest函数构造一个GET请求
testUrl := "http://127.0.0.1"// 其中testUrl,是我们要请求的url。req, err := http.NewRequest("GET", testUrl, nil)tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //忽略证书校验}var client *http.Client = &http.Client{Transport: tr}// 这里的err 不等于空的情况下返回err错误信息。if err != nil {panic(err)}req.Header.Set("","") // 这里可以添加一些header以防止服务端认为是爬虫// client := http.Client{// Timeout: 5 * time.Second, // 设置访问超时时间// }resp, err := client.Do(req) // 发送http请求if err != nil { //当出现err不等于nil的时候,说明出现某些错误,需要做异常处理fmt.Println("request fail", err.Error())return} else {fmt.Printf("StatusCode: %v\n", resp.StatusCode) // 输出状态码body, err := ioutil.ReadAll(resp.Body) // 提取Bodyif err != nil {panic(err)}fmt.Println("解密值为:",string(Body)) // 打印输入请求的body内容}
// base64加密message := *b64decode// 编码消息encodedMessage := base64.StdEncoding.EncodeToString([]byte(message))// 输出编码完成的消息fmt.Println(encodedMessage)
简单的一个解密函数,固定写法base64.StdEncoding.EncodeToString([]byte())
// bse64解密enmessage := *enb64code// base64解密data, err := base64.StdEncoding.DecodeString(enmessage)// 出错处理if err != nil {fmt.Println(err)} else {// 打印解码完成的数据fmt.Println(string(data))}
base64.StdEncoding.DecodeString()解密函数也是固定的写法。后面依旧是err报错的处理方法。
package mainimport ("crypto/tls""encoding/base64""flag""fmt" //当下面调用到包时会自动填充"io/ioutil""net/http")func main() {// 获取命令行参数flag.String("h", "", "-h 显示帮助信息")md5 := flag.String("m", "", "-m 输入要解密的md5字符串")b64decode := flag.String("d", "", "-d 输入要加密的Base64字符串")enb64code := flag.String("a", "", "-a 输入要加密的Base64字符串")// 解析命令行参数写入注册的flag里flag.Parse()// MD5解密 [email protected] 是你cmd5的账号,key是你cmd5的密钥testUrl := "http://www.cmd5.com/[email protected]&key=xxxx&hash=" + *md5req, err := http.NewRequest("GET", testUrl, nil)tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //忽略证书校验}var client *http.Client = &http.Client{Transport: tr}if err != nil {panic(err)}req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) Chrome/103.0.0.0 Safari/537.36") //自定义http请求头//client := http.Client{// Timeout: 5 * time.Second, //设置访问超时时间//}resp, err := client.Do(req) //发送请求if err != nil { //当出现err不等于nil的时候,说明出现某些错误,需要做异常处理fmt.Println("request fail", err.Error())return} else {//fmt.Printf("StatusCode: %v\n", resp.StatusCode) //输出状态码body, err := ioutil.ReadAll(resp.Body)if err != nil {panic(err)}fmt.Println(string(body)) //打印提取结果,这里不需要正则了,因为返回的body只有结果这一行}// base64加密message := *b64decode// 编码消息encodedMessage := base64.StdEncoding.EncodeToString([]byte(message))// 输出编码完成的消息fmt.Println(encodedMessage)// bse64解密enmessage := *enb64code// base64解密data, err := base64.StdEncoding.DecodeString(enmessage)// 出错处理if err != nil {fmt.Println(err)} else {// 打印解码完成的数据fmt.Println(string(data))}}
打开终端进行测试go run test1.go -h
这里使用一下加密base64字符串。go run test1.go -d 233
再进行一下base64解密操作。go run test1.go -a MjMz
这里看到输出了一个CMD5-ERROR:-4,这是因为这里去请求了MD5解密,在这里加一个设置开关即可。
这里应该分开请求的,使用图形化界面的话,就可以分开,变成模块化的。