极路由 开启shell 脚本 go 需要配置go环境

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, &ltr)
		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
}


作者:spike

分类: Tool

创作时间:2023-06-25

更新时间:2024-12-09

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1