Get Public Ip
This commit is contained in:
commit
41293c6d47
12
build.sh
Normal file
12
build.sh
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
:
|
||||||
|
set -x
|
||||||
|
|
||||||
|
# 静态构建Linux
|
||||||
|
go build -ldflags "-s -w"
|
||||||
|
|
||||||
|
# Windows 后台运行
|
||||||
|
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-H windowsgui" -o public_ip-Daemon.exe
|
||||||
|
|
||||||
|
# Windows Dos运行
|
||||||
|
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o public_ip-Dos.exe
|
||||||
|
|
8
go.mod
Normal file
8
go.mod
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
module public_ip
|
||||||
|
|
||||||
|
go 1.20
|
||||||
|
|
||||||
|
require (
|
||||||
|
golang.org/x/sys v0.15.0 // indirect
|
||||||
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
|
)
|
4
go.sum
Normal file
4
go.sum
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||||
|
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||||
|
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
8
isNotWin.go
Normal file
8
isNotWin.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
// isWin.go
|
||||||
|
package main
|
||||||
|
|
||||||
|
func regedit() {
|
||||||
|
|
||||||
|
}
|
55
isWin.go
Normal file
55
isWin.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
//go:build windows
|
||||||
|
|
||||||
|
// isWin.go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
func regedit() {
|
||||||
|
fmt.Println("当前操作系统是 Windows")
|
||||||
|
|
||||||
|
// 程序启动参数
|
||||||
|
runArry := " -d -f"
|
||||||
|
|
||||||
|
// 获取当前可执行文件的路径
|
||||||
|
exePath, err := os.Executable()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("无法获取可执行文件路径:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将可执行文件路径添加到注册表中
|
||||||
|
key, _, err := registry.CreateKey(
|
||||||
|
registry.CURRENT_USER,
|
||||||
|
`SOFTWARE\Microsoft\Windows\CurrentVersion\Run`,
|
||||||
|
registry.ALL_ACCESS,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("无法打开注册表键:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer key.Close()
|
||||||
|
|
||||||
|
_, _, err = key.GetStringValue(filepath.Base(exePath))
|
||||||
|
if err != nil {
|
||||||
|
err = key.SetStringValue(
|
||||||
|
filepath.Base(exePath),
|
||||||
|
exePath+runArry,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("无法设置键值:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Printf("%s 已被添加到开机自启动项中!\n", filepath.Base(exePath))
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
162
main.go
Normal file
162
main.go
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gopkg.in/ini.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getRequest(url string, client *http.Client) ([]byte, error) {
|
||||||
|
response, err := client.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(response.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return body, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeGETRequestAndProcessData(url string, client *http.Client, storeNo string, setURLTemplate string) {
|
||||||
|
responseData, err := getRequest(url, client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("发送GET请求失败: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(string(responseData))
|
||||||
|
|
||||||
|
slice := strings.Split(string(responseData), ",")
|
||||||
|
|
||||||
|
for _, publicIPURL := range slice {
|
||||||
|
fmt.Println(publicIPURL)
|
||||||
|
publicIPURL = "https://" + publicIPURL + "/"
|
||||||
|
publicIPResponse, err := getRequest(publicIPURL, client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("发送GET请求失败: %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
parsedIP := net.ParseIP(string(publicIPResponse))
|
||||||
|
if parsedIP != nil {
|
||||||
|
fmt.Printf("%s 有效的IP地址\n", publicIPResponse)
|
||||||
|
|
||||||
|
setURL := fmt.Sprintf(setURLTemplate, publicIPResponse, storeNo)
|
||||||
|
fmt.Printf("%s\n", setURL)
|
||||||
|
publicIPSendResponse, err := getRequest(setURL, client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("发送GET请求失败: %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fmt.Printf("发送Get请求返回状态: %s\n", string(publicIPSendResponse))
|
||||||
|
// 成功时候跳出循环
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
DAEMON = "d"
|
||||||
|
FOREVER = "f"
|
||||||
|
)
|
||||||
|
|
||||||
|
func StripSlice(slice []string, element string) []string {
|
||||||
|
for i := 0; i < len(slice); {
|
||||||
|
if slice[i] == element && i != len(slice)-1 {
|
||||||
|
slice = append(slice[:i], slice[i+1:]...)
|
||||||
|
} else if slice[i] == element && i == len(slice)-1 {
|
||||||
|
slice = slice[:i]
|
||||||
|
} else {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return slice
|
||||||
|
}
|
||||||
|
|
||||||
|
func SubProcess(args []string) *exec.Cmd {
|
||||||
|
cmd := exec.Command(args[0], args[1:]...)
|
||||||
|
cmd.Stdin = os.Stdin
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
err := cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "[-] Error: %s\n", err)
|
||||||
|
}
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
var version = "1.0.0"
|
||||||
|
|
||||||
|
// 读取配置文件
|
||||||
|
cfgs, err := ini.Load("public_ip.ini")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
Get_Find_Ip_Url := cfgs.Section("global").Key("Get_Find_Ip_Url").Value()
|
||||||
|
SedIpURL := cfgs.Section("global").Key("SedIpURL").Value()
|
||||||
|
StoreNo := cfgs.Section("global").Key("StoreNo").Value()
|
||||||
|
While_Time, _ := cfgs.Section("global").Key("While_Time").Int()
|
||||||
|
|
||||||
|
daemon := flag.Bool(DAEMON, false, "run in daemon")
|
||||||
|
forever := flag.Bool(FOREVER, false, "run in forever")
|
||||||
|
showVersion := flag.Bool("h", false, "打印应用程序信息")
|
||||||
|
showVersion_long := flag.Bool("help", false, "打印应用程序信息")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if *showVersion || *showVersion_long {
|
||||||
|
fmt.Println(" Public_Ip ")
|
||||||
|
fmt.Println(" Obtain the public network IP of the LAN terminal and send it to a specific interface")
|
||||||
|
fmt.Println("Version:", version)
|
||||||
|
fmt.Printf("Author:%s\n", "aixiao@aixiao.me")
|
||||||
|
fmt.Println("")
|
||||||
|
os.Exit(0)
|
||||||
|
} else {
|
||||||
|
fmt.Println("其他逻辑...")
|
||||||
|
}
|
||||||
|
|
||||||
|
if *daemon {
|
||||||
|
SubProcess(StripSlice(os.Args, "-"+DAEMON))
|
||||||
|
fmt.Printf("[*] Daemon running in PID: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||||||
|
os.Exit(0)
|
||||||
|
} else if *forever {
|
||||||
|
for {
|
||||||
|
cmd := SubProcess(StripSlice(os.Args, "-"+FOREVER))
|
||||||
|
fmt.Printf("[*] Forever running in PID: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||||||
|
time.Sleep(time.Second * 5)
|
||||||
|
cmd.Wait()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Printf("[*] Service running in PID: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 把自己加入注册表,开机自启
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
regedit()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 主函数
|
||||||
|
for {
|
||||||
|
client := &http.Client{
|
||||||
|
Timeout: 5 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
makeGETRequestAndProcessData(Get_Find_Ip_Url, client, StoreNo, SedIpURL)
|
||||||
|
time.Sleep(time.Second * time.Duration(While_Time))
|
||||||
|
}
|
||||||
|
}
|
BIN
public_ip-Daemon.exe
Normal file
BIN
public_ip-Daemon.exe
Normal file
Binary file not shown.
BIN
public_ip-Dos.exe
Normal file
BIN
public_ip-Dos.exe
Normal file
Binary file not shown.
13
public_ip.ini
Normal file
13
public_ip.ini
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[global]
|
||||||
|
# 获取可以获取公网Ip的Url 地址(返回值','为分割符)
|
||||||
|
Get_Find_Ip_Url="http://58.34.44.125:6108/ip/find/ip/url"
|
||||||
|
|
||||||
|
# 获取公网Ip后需要发送的Url地址
|
||||||
|
SedIpURL="http://58.34.44.125:6108/ip/set/ip?ip=%s&storeNo=%s"
|
||||||
|
|
||||||
|
# 门店编号
|
||||||
|
StoreNo=2
|
||||||
|
|
||||||
|
# 等待时间
|
||||||
|
While_Time=20
|
||||||
|
|
Loading…
Reference in New Issue
Block a user