mirror of
https://github.com/hamster1963/HomeDash-Backend.git
synced 2025-06-17 12:41:21 +08:00
update: 初始化代码提交
This commit is contained in:
204
utility/network_utils/proxy_network.go
Normal file
204
utility/network_utils/proxy_network.go
Normal file
@ -0,0 +1,204 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user