You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Victorique/vtqe/tools/curl.go

211 lines
5.1 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package tools
import (
"fmt"
"io/ioutil"
"net/http"
"strings"
"b612.me/starainrt"
"github.com/spf13/cobra"
)
var curlcmd = &cobra.Command{
Use: "curl",
Short: "Curl工具",
Long: "Curl小工具",
Run: func(this *cobra.Command, args []string) {
var method string
var err error
var data []byte
o, _ := this.Flags().GetString("output")
d, _ := this.Flags().GetString("data")
f, _ := this.Flags().GetString("file")
h, _ := this.Flags().GetString("header")
c, _ := this.Flags().GetString("cookie")
b, _ := this.Flags().GetString("cookie-jar")
i, _ := this.Flags().GetBool("include")
x, _ := this.Flags().GetString("proxy")
m, _ := this.Flags().GetInt("max-time")
ua, _ := this.Flags().GetString("user-agent")
connecttimeout, _ := this.Flags().GetInt("connect-timeout")
if len(args) != 1 {
this.Help()
return
}
url := args[0]
shell := func(pect float64) {
if pect == 100 {
fmt.Println("已完成100.000000%")
} else {
fmt.Printf("已完成:%f%%\r", pect)
}
}
var postdata map[string]string
if d != "" {
postdata = make(map[string]string)
strip := strings.Split(d, "&")
for _, v := range strip {
tmp := strings.Split(v, "=")
if len(tmp) != 2 {
continue
}
postdata[tmp[0]] = tmp[1]
}
}
if len(d) == 0 {
method = "GET"
} else {
method = "POST"
}
tmp := strings.Split(f, ",")
curl := starainrt.NewStarCurl()
curl.TimeOut = m
curl.DialTimeOut = connecttimeout
curl.ReqHeader.Set("User-Agent", "Victorique - B612.ME")
if ua != "" {
curl.ReqHeader.Set("User-Agent", ua)
}
if x != "" {
curl.Proxy = x
}
if h != "" {
head := strings.Split(h, ",")
for _, v := range head {
hp := strings.Split(v, "=")
if len(hp) != 2 {
continue
}
curl.ReqHeader.Set(hp[0], hp[1])
}
}
if c != "" {
if starainrt.Exists(c) {
ck, err := ioutil.ReadFile(c)
if err != nil {
fmt.Println(err)
return
}
h = strings.TrimSpace(string(ck))
}
cook := strings.Split(h, ",")
for _, v := range cook {
hp := strings.Split(v, "=")
if len(hp) != 2 {
continue
}
curl.ReqCookies = append(curl.ReqCookies, &http.Cookie{Name: hp[0], Value: hp[1]})
}
}
if len(tmp) != 2 && f != "" {
fmt.Println("对file应使用逗号分隔区分文件名和路径")
return
}
if o != "" {
if f != "" {
_, err = curl.CurlWithFile(url, postdata, tmp[0], tmp[1], o, true, shell)
} else {
err = curl.CurlDataToFile(url, []byte(d), method, o, shell)
}
if err != nil {
fmt.Println(err)
}
if i {
for k, v := range curl.RespHeader {
for _, v2 := range v {
fmt.Println(k + ":" + v2)
}
}
fmt.Println("\n")
var cookiewriter string
for _, v := range curl.RespCookies {
fmt.Println(v.Name + ":" + v.Value)
if b != "" {
cookiewriter += v.Name + ":" + v.Value + ","
}
}
fmt.Println("\n\n")
if b != "" {
ioutil.WriteFile(b, []byte(cookiewriter), 0755)
}
}
} else {
if f != "" {
data, err = curl.CurlWithFile(url, postdata, tmp[0], tmp[1], "", false, shell)
} else {
data, err = curl.Curl(url, []byte(d), method)
}
if i {
for k, v := range curl.RespHeader {
for _, v2 := range v {
fmt.Println(k + ":" + v2)
}
}
fmt.Println("\n")
var cookiewriter string
for _, v := range curl.RespCookies {
fmt.Println(v.Name + ":" + v.Value)
if b != "" {
cookiewriter += v.Name + ":" + v.Value + ","
}
}
fmt.Println("\n\n")
if b != "" {
ioutil.WriteFile(b, []byte(cookiewriter), 0755)
}
}
fmt.Println(string(data))
if err != nil {
fmt.Println(err)
}
}
},
}
func init() {
Maincmd.AddCommand(curlcmd)
curlcmd.Flags().StringP("output", "o", "", "写入文件而不是标准输出")
curlcmd.Flags().StringP("data", "d", "", "http postdata数据")
curlcmd.Flags().StringP("file", "f", "", "上传文件的地址")
curlcmd.Flags().StringP("header", "H", "", "使用的header")
curlcmd.Flags().StringP("cookie", "b", "", "使用的cookie")
curlcmd.Flags().StringP("cookie-jar", "c", "", "写入返回的cookie到文件中")
curlcmd.Flags().BoolP("include", "i", false, "显示返回的header与cookie")
curlcmd.Flags().StringP("proxy", "x", "", "使用代理")
curlcmd.Flags().IntP("max-time", "m", 0, "最大传输超时时间")
curlcmd.Flags().Int("connect-timeout", 15, "最大连接建立超时时间")
curlcmd.Flags().StringP("user-agent", "A", "", "UA设置")
curlcmd.AddCommand(curlupcmd)
}
var curlupcmd = &cobra.Command{
Use: "upload",
Short: "victorique上传工具",
Long: "victorique上传工具",
Run: func(this *cobra.Command, args []string) {
if len(args) != 2 {
fmt.Println(args, "不合法啊")
return
}
curl := starainrt.NewStarCurl()
curl.TimeOut = 0
shell := func(pect float64) {
if pect == 100 {
fmt.Println("已完成100.000000%")
} else {
fmt.Printf("已完成:%f%%\r", pect)
}
}
data, err := curl.CurlWithFile("http://"+args[0]+"/vtqeupload1127", nil, "victorique", args[1], "", false, shell)
fmt.Println(string(data))
if err != nil {
fmt.Println(err)
}
},
}