Files
HomeDash-Backend/utility/network_utils/proxy_network.go
2023-10-03 15:57:52 +08:00

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
}