mirror of
https://github.com/hamster1963/HomeDash-Backend.git
synced 2025-06-16 20:21:23 +08:00
205 lines
5.5 KiB
Go
205 lines
5.5 KiB
Go
package network_utils
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/gogf/gf/v2/encoding/gjson"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/gclient"
|
|
"github.com/gogf/gf/v2/os/gcache"
|
|
"github.com/gogf/gf/v2/os/glog"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
"home-network-watcher/manifest"
|
|
"time"
|
|
)
|
|
|
|
type uProxyNetwork struct{}
|
|
|
|
var ProxyNetwork = &uProxyNetwork{}
|
|
|
|
// GetXuiUserList
|
|
//
|
|
// @dc: 获取xui用户列表
|
|
// @author: hamster @date:2023/9/19 09:29:33
|
|
func (u *uProxyNetwork) GetXuiUserList() (err error) {
|
|
var (
|
|
url = manifest.XuiBaseUrl + "/xui/inbound/list"
|
|
session map[string]string
|
|
)
|
|
// 尝试获取缓存中的session
|
|
sessionData, err := gcache.Get(context.Background(), manifest.ProxySessionCacheKey)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if sessionData.IsNil() {
|
|
// 重新获取session
|
|
session, err = u.GetXuiSession()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
session = sessionData.MapStrStr()
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
post, err := g.Client().SetCookieMap(session).Post(context.Background(), url)
|
|
defer func(post *gclient.Response) {
|
|
err := post.Close()
|
|
if err != nil {
|
|
glog.Warning(context.Background(), err)
|
|
}
|
|
}(post)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if post.StatusCode != 200 {
|
|
glog.Warning(context.Background(), "获取xui用户列表失败")
|
|
return err
|
|
}
|
|
jsonData := gjson.New(post.ReadAllString())
|
|
userList := jsonData.Get("obj").Array()
|
|
// 删除敏感信息,计算总上传下载流量
|
|
userCacheList := make([]g.Map, 0)
|
|
upTotal := 0.00
|
|
downTotal := 0.00
|
|
for _, value := range userList {
|
|
userJson := gjson.New(value)
|
|
userCacheJson := g.Map{
|
|
"id": userJson.Get("id").Int(),
|
|
"enable": userJson.Get("enable").Bool(),
|
|
"protocol": userJson.Get("protocol").String(),
|
|
"remark": userJson.Get("remark").String(),
|
|
// 转换为 GB
|
|
"up": userJson.Get("up").Float64() / 1024 / 1024 / 1024,
|
|
"down": userJson.Get("down").Float64() / 1024 / 1024 / 1024,
|
|
}
|
|
userCacheList = append(userCacheList, userCacheJson)
|
|
upTotal += userJson.Get("up").Float64()
|
|
downTotal += userJson.Get("down").Float64()
|
|
}
|
|
// 按照下载流量排序
|
|
for i := 0; i < len(userCacheList); i++ {
|
|
for j := i + 1; j < len(userCacheList); j++ {
|
|
if userCacheList[i]["down"].(float64) < userCacheList[j]["down"].(float64) {
|
|
userCacheList[i], userCacheList[j] = userCacheList[j], userCacheList[i]
|
|
}
|
|
}
|
|
}
|
|
cacheXuiData := g.Map{
|
|
"user_list": userCacheList,
|
|
"user_count": len(userCacheList),
|
|
"up_total": upTotal / 1024 / 1024 / 1024,
|
|
"down_total": downTotal / 1024 / 1024 / 1024,
|
|
}
|
|
err = gcache.Set(context.Background(), manifest.XUIUserListCacheKey, cacheXuiData, 1*time.Minute)
|
|
return
|
|
}
|
|
|
|
// GetProxyNetwork
|
|
//
|
|
// @dc: 获取代理服务器的网速
|
|
// @author: laixin @date:2023/4/2 20:06:21
|
|
func (u *uProxyNetwork) GetProxyNetwork() (err error) {
|
|
var (
|
|
proxyNetwork = g.Map{
|
|
"time": "",
|
|
"rxSpeedKbps": 0,
|
|
"txSpeedKbps": 0,
|
|
"rxSpeedMbps": 0,
|
|
"txSpeedMbps": 0,
|
|
}
|
|
session map[string]string
|
|
url = manifest.XuiBaseUrl + "/server/status"
|
|
)
|
|
|
|
// 尝试获取缓存中的session
|
|
sessionData, err := gcache.Get(context.Background(), manifest.ProxySessionCacheKey)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if sessionData.IsNil() {
|
|
// 重新获取session
|
|
session, err = u.GetXuiSession()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
session = sessionData.MapStrStr()
|
|
}
|
|
|
|
// 通过xui进行网速的获取
|
|
post, err := g.Client().SetCookieMap(session).Post(context.Background(), url)
|
|
defer func(post *gclient.Response) {
|
|
err := post.Close()
|
|
if err != nil {
|
|
glog.Warning(context.Background(), err)
|
|
}
|
|
}(post)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if post.StatusCode != 200 {
|
|
glog.Warning(context.Background(), "获取网速失败")
|
|
return err
|
|
}
|
|
jsonData := gjson.New(post.ReadAllString())
|
|
rxSpeed := jsonData.Get("obj.netIO.down") // 下载速度
|
|
txSpeed := jsonData.Get("obj.netIO.up") // 上传速度
|
|
|
|
// 速度单位转换
|
|
rxSpeedKbps := gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(rxSpeed)/1024))
|
|
txSpeedKbps := gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(txSpeed)/1024))
|
|
proxyNetwork["rxSpeedKbps"] = rxSpeedKbps
|
|
proxyNetwork["txSpeedKbps"] = txSpeedKbps
|
|
|
|
// 转换成MB
|
|
rxSpeedMbps := gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(rxSpeed)/1024/1024))
|
|
txSpeedMbps := gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(txSpeed)/1024/1024))
|
|
proxyNetwork["rxSpeedMbps"] = rxSpeedMbps
|
|
proxyNetwork["txSpeedMbps"] = txSpeedMbps
|
|
|
|
proxyNetwork["time"] = gtime.Now().String()
|
|
err = gcache.Set(context.Background(), manifest.ProxyNetworkCacheKey, proxyNetwork, 10*time.Second)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// GetXuiSession
|
|
//
|
|
// @dc: 获取Xui登陆session
|
|
// @author: laixin @date:2023/4/2 20:06:21
|
|
func (u *uProxyNetwork) GetXuiSession() (sessionMap map[string]string, err error) {
|
|
var (
|
|
url = manifest.XuiBaseUrl + "/login"
|
|
)
|
|
post, err := g.Client().Post(context.Background(), url, manifest.XuiLoginDataMap)
|
|
defer func(post *gclient.Response) {
|
|
err := post.Close()
|
|
if err != nil {
|
|
glog.Warning(context.Background(), err)
|
|
}
|
|
}(post)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if post.StatusCode != 200 {
|
|
return nil, fmt.Errorf("登录失败")
|
|
}
|
|
if post.Header.Get("Set-Cookie") == "" {
|
|
return nil, fmt.Errorf("获取Cookie失败")
|
|
}
|
|
// 将session存入缓存
|
|
err = gcache.Set(context.Background(), manifest.ProxySessionCacheKey, post.GetCookieMap(), 15*time.Minute)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return post.GetCookieMap(), nil
|
|
}
|