package main
import (
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"net/http"
"strings"
)
const (
GetLocalTokenUrl = "http://192.168.199.1/local-ssh/api?method=get"
GetRouterInfoUrl = "http://192.168.199.1/cgi-bin/turbo/proxy/router_info"
LaunchSshUrl = "http://192.168.199.1/local-ssh/api?method=valid&data=%s"
GetCloudTokenUrl = "http://www.hiwifi.wtf/"
ParametersFormat = "local_token=%s&uuid=%s"
)
type LocalTokenResp struct {
Data string
}
type LaunchSshResp struct {
Data string
}
type RouterInfoResp struct {
Data RouterInfoData
}
type RouterInfoData struct {
Uuid string
}
func main() {
sshLauncher()
fmt.Print("按回车退出...")
var input string
_, _ = fmt.Scanln(&input)
}
func sshLauncher() {
ltr := LocalTokenResp{}
rir := RouterInfoResp{}
osr := LaunchSshResp{}
var err error
for i := 0; i < 5; i++ {
if i != 0 {
fmt.Printf("第%d次重试\n\n", i)
}
fmt.Println("开始获取local_token")
err = httpGet(GetLocalTokenUrl, <r)
if err != nil {
fmt.Printf("获取local_token出错: \n%v\n\n", err)
continue
}
fmt.Printf("获取local_token成功:\n%s\n\n", ltr.Data)
fmt.Println("开始获取uuid")
err = httpGet(GetRouterInfoUrl, &rir)
if err != nil {
fmt.Printf("获取uuid出错: \n%v\n\n", err)
continue
}
fmt.Printf("获取uuid成功:\n%s\n\n", rir.Data.Uuid)
fmt.Println("开始获取cloud_token")
ltr.Data = ReplacePlus(ltr.Data)
kv := fmt.Sprintf(ParametersFormat, ltr.Data, rir.Data.Uuid)
cloudToken := ""
cloudToken, err = getCloudToken(kv)
if err != nil {
fmt.Printf("获取cloud_token出错: \n%v\n\n", err)
continue
}
fmt.Printf("获取local_token成功:\n%s\n\n", cloudToken)
cloudToken = ReplacePlus(cloudToken)
err = httpGet(fmt.Sprintf(LaunchSshUrl, cloudToken), &osr)
if err != nil {
fmt.Printf("开启ssh端口出错: %v\n\n", err)
continue
}
if strings.Contains(osr.Data, "ssh port is") {
suc := strings.ReplaceAll(osr.Data, "Success: ssh port is ", "ssh开启成功, 端口号为:")
fmt.Println(suc)
} else {
fmt.Println(ltr.Data)
fmt.Println(rir.Data.Uuid)
fmt.Println(cloudToken)
}
break
}
}
func ReplacePlus(str string) string {
return strings.ReplaceAll(str, "+", "%2B")
}
func getCloudToken(kv string) (string, error) {
str, err := httpPost(GetCloudTokenUrl, strings.NewReader(kv))
if err != nil {
return "", err
}
if strings.Contains(str, "local_token 或 uuid 错误!") {
return "", errors.New("local_token 或 uuid 错误!")
}
strs := strings.Split(str, "cloud_token:")
strs = strings.Split(strs[1], "</br>请输入cloud_token并提交!")
strs = strings.Split(strs[0], "请输入cloud_token并提交!")
return strs[0], nil
}
func httpGet(url string, v interface{}) error {
resp, err := http.Get(url)
if err != nil {
return err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
err = json.Unmarshal(body, v)
if err != nil {
return err
}
return nil
}
func httpPost(url string, reader io.Reader) (string, error) {
resp, err := http.Post(url, "application/x-www-form-urlencoded", reader)
if err != nil {
return "", err
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}