Aller au contenu principal

Go SDK [community]

SDK communautaire

Ce SDK est entièrement maintenu par la communauté.

Le Remnawave Go SDK est une bibliothèque pour interagir facilement avec la RestAPI.

✨ Fonctionnalités clés

  • Généré avec ogen v1.19.0: Décodeur JSON sans réflexion pour un débit élevé
  • Sûreté des types: Validation à la compilation contre la spécification OpenAPI 3.0
  • Conception basée sur les contrôleurs: Sous-clients organisés pour un accès propre à l'API
  • Signatures simplifiées: Pas de structs Params verbeux pour les opérations simples
  • Support du contexte: Support de première classe pour context.Context
  • OpenTelemetry: Instrumentation de traçage intégrée
  • Options de requête: Personnalisation par requête via ...RequestOption
  • Éditeurs: Support de middleware pour les requêtes/réponses

Installation

go get github.com/Jolymmiles/remnawave-api-go/v2@latest
attention

Choisissez et fixez toujours la version correcte du SDK pour correspondre à la version du backend Remnawave.

Version du SDKVersion du Panel Remnawave
v2.6.12.6.1
v2.5.32.5.3
v2.3.0-62.3.0
v2.2.6-32.2.6

Utilisation

Exemple de base
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

// Create base client
baseClient, err := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
if err != nil {
log.Fatal(err)
}

// Wrap with organized sub-clients
client := remapi.NewClientExt(baseClient)

// Get user by UUID - simplified signature
resp, err := client.Users().GetUserByUuid(ctx, "user-uuid-here")
if err != nil {
log.Fatal(err)
}

switch r := resp.(type) {
case *remapi.UserResponse:
fmt.Printf("User: %s\n", r.Response.Username)
case *remapi.NotFoundError:
fmt.Println("User not found")
case *remapi.BadRequestError:
fmt.Printf("Validation error: %v\n", r.Errors)
}
}
Créer et gérer des utilisateurs
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Create user
createResp, err := client.Users().CreateUser(ctx, &remapi.CreateUserRequest{
Username: "john_doe",
})
if err != nil {
log.Fatal(err)
}

user := createResp.(*remapi.UserResponse).Response
fmt.Printf("Created user: %s (UUID: %s)\n", user.Username, user.UUID)

// Disable user
_, err = client.Users().DisableUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User disabled")

// Enable user
_, err = client.Users().EnableUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User enabled")

// Delete user
_, err = client.Users().DeleteUser(ctx, user.UUID.String())
if err != nil {
log.Fatal(err)
}
fmt.Println("User deleted")
}
Gestion des nœuds
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Get all nodes
nodesResp, err := client.Nodes().GetAllNodes(ctx)
if err != nil {
log.Fatal(err)
}

nodes := nodesResp.(*remapi.NodesResponse).Response
fmt.Printf("Total nodes: %d\n", len(nodes))

for _, node := range nodes {
fmt.Printf(" - %s (%s): connected=%v\n",
node.Name, node.Address, node.IsConnected)
}

// Get single node
if len(nodes) > 0 {
nodeResp, _ := client.Nodes().GetOneNode(ctx, nodes[0].UUID.String())
node := nodeResp.(*remapi.NodeResponse).Response
fmt.Printf("\nNode details: %s\n", node.Name)
}
}
Pagination
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

// Use PaginationHelper for iterating through pages
pager := remapi.NewPaginationHelper(50) // 50 items per page

for pager.HasMore {
resp, err := client.Users().GetAllUsers(ctx,
pager.Limit, // size
pager.Offset, // start
)
if err != nil {
log.Fatal(err)
}

users := resp.(*remapi.GetAllUsersResponse)
for _, user := range users.Response.Users {
fmt.Printf("User: %s (UUID: %s)\n", user.Username, user.UUID)
}

// Advance to next page
pager.SetTotal(int(users.Response.Total))
pager.NextPage()
}

fmt.Printf("Total users: %d\n", *pager.Total)
}
Gestion des erreurs
package main

import (
"context"
"fmt"
"log"

remapi "github.com/Jolymmiles/remnawave-api-go/v2/api"
)

func main() {
ctx := context.Background()

baseClient, _ := remapi.NewClient(
"https://your-panel.example.com",
remapi.StaticToken{Token: "YOUR_API_TOKEN"},
)
client := remapi.NewClientExt(baseClient)

resp, err := client.Users().GetUserByUuid(ctx, "invalid-uuid")
if err != nil {
log.Fatal("Network error:", err)
}

// Available error types depend on the endpoint — check the generated
// Res interface (e.g. UsersGetUserByUuidRes) for the full list.
switch e := resp.(type) {
case *remapi.UserResponse:
fmt.Printf("User found: %s\n", e.Response.Username)
case *remapi.BadRequestError:
fmt.Println("Validation errors:")
for _, ve := range e.Errors {
fmt.Printf(" - %s: %s (path: %v)\n",
ve.Code, ve.Message, ve.Path)
}
case *remapi.NotFoundError:
fmt.Println("Resource not found")
case *remapi.InternalServerError:
fmt.Printf("Server error: %s\n", e.Message.Value)
}
}

Contrôleurs disponibles

ContrôleurDescription
client.ApiTokens()Gestion des tokens API
client.Auth()Authentification
client.BandwidthStatsNodes()Statistiques de bande passante des nœuds
client.BandwidthStatsUsers()Statistiques de bande passante des utilisateurs
client.ConfigProfile()Profils de configuration
client.ExternalSquad()Groupes externes
client.Hosts()Gestion des hôtes
client.HostsBulkActions()Opérations en masse sur les hôtes
client.HwidUserDevices()Appareils HWID
client.InfraBilling()Facturation d'infrastructure
client.InternalSquad()Groupes internes
client.Keygen()Génération de clés
client.Nodes()Gestion des nœuds
client.NodesUsageHistory()Historique d'utilisation des nœuds
client.Passkey()Authentification par passkey
client.RemnawaveSettings()Paramètres du panel
client.Snippets()Extraits de code
client.Subscription()Gestion des abonnements
client.SubscriptionPageConfig()Configuration de la page d'abonnement
client.SubscriptionSettings()Paramètres d'abonnement
client.SubscriptionTemplate()Modèles d'abonnement
client.Subscriptions()Abonnements multiples
client.System()Informations système
client.UserSubscriptionRequestHistory()Historique des requêtes
client.Users()Gestion des utilisateurs
client.UsersBulkActions()Opérations en masse sur les utilisateurs

Types d'erreurs

TypeStatut HTTPDescription
BadRequestError400Erreurs de validation avec détails
UnauthorizedError401Authentification requise
ForbiddenError403Accès refusé
NotFoundError404Ressource introuvable
InternalServerError500Erreur serveur

🛠️ Liens du projet