本次是笔者在学习golang开发语言中自行编写的一个小工具,由于笔者本人目前还未学会golang的图形化界面打造,若使用图形化界面进行打造,可以增加更多的功能,本文章包含golang的http请求、flag包获取命令行输入、base64加密、base64解密、简单的逻辑运算等知识。
笔者本人目前还在golang学习的初级阶段,望大佬多多指点。
package main
import (
"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) // 提取Body
if 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 main
import (
"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=" + *md5
req, 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解密,在这里加一个设置开关即可。
这里应该分开请求的,使用图形化界面的话,就可以分开,变成模块化的。