package main
import (
"context"
"fmt"
"github.com/labstack/gommon/log"
"github.com/satori/go.uuid"
"google.golang.org/grpc"
// proxy管理服务
proxymanService " *** .com/core/app/proxyman/command"
// 统计服务
statsService " *** .com/core/app/stats/command"
" *** .com/core/common/protocol"
" *** .com/core/common/serial"
" *** .com/core/proxy/vmess"
)
// 添加用户
func addUser(conn *grpc.ClientConn) error {
client := proxymanService.NewHandlerServiceClient(conn)
userUUID := uuid.NewV4().String() //使用UUID库生成一个UUID
resp, err := client.AlterInbound(context.Background(), &proxymanService.AlterInboundRequest{
Tag: "proxy", // 要添加用户的tag,目前只支持vmess协议
OperatiON: serial.ToTypedMessage(&proxymanService.AddUserOperation{
User: &protocol.User{
Level: 0, // 用户等级
Email: "usermail@qq.com", // 用户邮箱,删除和统计要用到
Account: serial.ToTypedMessage(&vmess.Account{
Id: userUUID, //用户UUID
AlterId: 4, // 额外ID
SecuritySettings: &protocol.SecurityConfig{Type: protocol.SecurityType_AUTO}, // 安全设置,auto为自动判断加密协议
}),
},
}),
})
if err != nil {
return err
}
fmt.Println(resp)
fmt.Println(userUUID)
return nil
}
// 删除用户
func removeUser(conn *grpc.ClientConn) error {
client := proxymanService.NewHandlerServiceClient(conn)
resp, err := client.AlterInbound(context.Background(), &proxymanService.AlterInboundRequest{
Tag: "proxy",
Operation: serial.ToTypedMessage(&proxymanService.RemoveUserOperation{
Email: "usermail@qq.com", // 用户邮箱地址
}),
})
if err != nil {
return err
}
fmt.Println(resp)
return nil
}
// 获取用户流量
func queryUserTraffic(conn *grpc.ClientConn) error {
client := statsService.NewStatsServiceClient(conn)
resp, err := client.QueryStats(context.Background(), &statsService.QueryStatsRequest{
/*
user>>>[email]>>>traffic>>>uplink
特定用户的上行流量,单位字节。
user>>>[email]>>>traffic>>>downlink
特定用户的下行流量,单位字节。
inbound>>>[tag]>>>traffic>>>uplink
特定入站代理的上行流量,单位字节。
inbound>>>[tag]>>>traffic>>>downlink
特定入站代理的下行流量,单位字节。
*/
Pattern: "user", // 筛选用户表达式
Reset_: false, // 查询完成后是否重置流量
})
if err != nil {
return err
}
// 获取返回值中的流量信息
stat := resp.GetStat()
// 返回的是一个数组,对其进行遍历输出
for _, e := range stat {
fmt.Println(e)
}
return nil
}
func main() {
// 连接grpc服务
conn, err := grpc.Dial("IP:port", grpc.WithInsecure())
if err != nil {
panic(err)
}
//err = queryUserTraffic(conn)
err = addUser(conn)
//err = removeUser(conn)
if err != nil {
log.Info(err)
}
if err = conn.Close(); err != nil {
log.Info("关闭连接失败")
}
}