n128

Basic login for Pokemon Showdown Bot - Golang

Jan 10th, 2025 (edited)
1,207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.97 KB | Source Code | 0 0
  1. package main
  2.  
  3. import (
  4.     "encoding/json"
  5.     "flag"
  6.     "fmt"
  7.     "io"
  8.     "net/http"
  9.     "net/url"
  10.     "strings"
  11.  
  12.     "github.com/gorilla/websocket"
  13. )
  14.  
  15. const (
  16.     Server              = "sim.psim.us"
  17.     WebsocketURL string = "wss://sim3.psim.us/showdown/websocket"
  18.     ActionURL    string = "https://play.pokemonshowdown.com/~~" + Server + "/action.php"
  19. )
  20.  
  21. // flags
  22. var (
  23.     name     = flag.String("name", "", "bot name")
  24.     password = flag.String("pass", "", "bot password")
  25. )
  26.  
  27. type Login struct {
  28.     ActionSuccess bool        `json:"actionsuccess"`
  29.     Assertion     string      `json:"assertion"`
  30.     CurUser       CurrentUser `json:"curuser"`
  31. }
  32.  
  33. type CurrentUser struct {
  34.     LoggedIn bool   `json:"loggedin"`
  35.     Username string `json:"username"`
  36.     UserID   string `json:"userid"`
  37. }
  38.  
  39. func main() {
  40.     flag.Parse()
  41.  
  42.     conn, _, err := websocket.DefaultDialer.Dial(WebsocketURL, nil)
  43.     if err != nil {
  44.         panic(err)
  45.     }
  46.     defer conn.Close()
  47.  
  48.     fmt.Println("Connecting to Showdown...")
  49.     for {
  50.         _, b, err := conn.ReadMessage()
  51.         if err != nil {
  52.             panic(err)
  53.         }
  54.  
  55.         fmt.Println(string(b))
  56.  
  57.         chunks := strings.Split(string(b), "|")
  58.         switch chunks[1] {
  59.         case "challstr":
  60.             id, data := chunks[2], chunks[3]
  61.             u, _ := url.Parse(ActionURL)
  62.             q := u.Query()
  63.             q.Set("act", "login")
  64.             q.Set("name", *name)
  65.             q.Set("pass", *password)
  66.             q.Set("challengekeyid", id)
  67.             q.Set("challstr", data)
  68.             u.RawQuery = q.Encode()
  69.  
  70.             fmt.Println(u.String())
  71.  
  72.             res, err := http.Post(u.String(), "application/x-www-form-urlencoded", nil)
  73.             if err != nil {
  74.                 panic(err)
  75.             }
  76.  
  77.             fmt.Println("Response:", res.Status)
  78.  
  79.             body, err := io.ReadAll(res.Body)
  80.             if err != nil {
  81.                 panic(err)
  82.             }
  83.  
  84.             var login Login
  85.             if err = json.Unmarshal(body[1:], &login); err != nil {
  86.                 panic(err)
  87.             }
  88.  
  89.             fmt.Println(login)
  90.             d := []byte(fmt.Sprintf("|/trn %s,0,%s", *name, login.Assertion))
  91.             err = conn.WriteMessage(websocket.TextMessage, d)
  92.             if err != nil {
  93.                 panic(err)
  94.             }
  95.         }
  96.     }
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment