main.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. "sync"
  10. )
  11. type LoginResponse struct {
  12. Data struct {
  13. AccessToken string `json:"access_token"`
  14. TokenType string `json:"token_type"`
  15. Token string `json:"token"`
  16. } `json:"data"`
  17. }
  18. type ClaimResponse struct {
  19. Message string `json:"message"`
  20. }
  21. func dailyClaim3DOS(email, password string) string {
  22. client := &http.Client{}
  23. loginURL := "https://api.dashboard.3dos.io/api/auth/login"
  24. loginPayload := map[string]string{
  25. "email": email,
  26. "password": password,
  27. }
  28. loginPayloadJSON, _ := json.Marshal(loginPayload)
  29. loginReq, _ := http.NewRequest("POST", loginURL, bytes.NewBuffer(loginPayloadJSON))
  30. loginReq.Header.Set("Accept", "application/json, text/plain, */*")
  31. loginReq.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
  32. loginReq.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
  33. loginReq.Header.Set("Content-Type", "application/json")
  34. loginReq.Header.Set("Origin", "https://dashboard.3dos.io")
  35. loginReq.Header.Set("Priority", "u=1, i")
  36. loginReq.Header.Set("Referer", "https://dashboard.3dos.io/")
  37. loginReq.Header.Set("Sec-CH-UA", `"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"`)
  38. loginReq.Header.Set("Sec-CH-UA-Mobile", "?0")
  39. loginReq.Header.Set("Sec-CH-UA-Platform", `"Windows"`)
  40. loginReq.Header.Set("Sec-Fetch-Dest", "empty")
  41. loginReq.Header.Set("Sec-Fetch-Mode", "cors")
  42. loginReq.Header.Set("Sec-Fetch-Site", "same-site")
  43. loginReq.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36")
  44. loginResp, err := client.Do(loginReq)
  45. if err != nil {
  46. return fmt.Sprintf("%s: 登录请求失败", email)
  47. }
  48. defer loginResp.Body.Close()
  49. if loginResp.StatusCode != 200 {
  50. return fmt.Sprintf("%s: 登录失败", email)
  51. }
  52. var loginData LoginResponse
  53. json.NewDecoder(loginResp.Body).Decode(&loginData)
  54. token := loginData.Data.AccessToken
  55. if token == "" {
  56. token = loginData.Data.Token
  57. }
  58. tokenType := loginData.Data.TokenType
  59. if token == "" || tokenType == "" {
  60. return fmt.Sprintf("%s: 登录响应中未找到 Token 或 Token 类型", email)
  61. }
  62. authorizationHeader := fmt.Sprintf("%s %s", tokenType, token)
  63. optionsURL := "https://api.dashboard.3dos.io/api/claim-reward"
  64. optionsReq, _ := http.NewRequest("OPTIONS", optionsURL, nil)
  65. optionsReq.Header.Set("Accept", "*/*")
  66. optionsReq.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
  67. optionsReq.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
  68. optionsReq.Header.Set("Access-Control-Request-Headers", "authorization,cache-control,content-type,expires,pragma")
  69. optionsReq.Header.Set("Access-Control-Request-Method", "POST")
  70. optionsReq.Header.Set("Origin", "https://dashboard.3dos.io")
  71. optionsReq.Header.Set("Priority", "u=1, i")
  72. optionsReq.Header.Set("Referer", "https://dashboard.3dos.io/")
  73. optionsReq.Header.Set("Sec-Fetch-Dest", "empty")
  74. optionsReq.Header.Set("Sec-Fetch-Mode", "cors")
  75. optionsReq.Header.Set("Sec-Fetch-Site", "same-site")
  76. optionsReq.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36")
  77. optionsResp, err := client.Do(optionsReq)
  78. if err != nil {
  79. return fmt.Sprintf("%s: OPTIONS 请求失败", email)
  80. }
  81. defer optionsResp.Body.Close()
  82. claimURL := "https://api.dashboard.3dos.io/api/claim-reward"
  83. claimPayload := map[string]string{
  84. "id": "daily-reward-api",
  85. }
  86. claimPayloadJSON, _ := json.Marshal(claimPayload)
  87. claimReq, _ := http.NewRequest("POST", claimURL, bytes.NewBuffer(claimPayloadJSON))
  88. claimReq.Header.Set("Accept", "application/json, text/plain, */*")
  89. claimReq.Header.Set("Authorization", authorizationHeader)
  90. claimReq.Header.Set("Cache-Control", "no-cache")
  91. claimReq.Header.Set("Content-Type", "application/json")
  92. claimReq.Header.Set("Expires", "0")
  93. claimReq.Header.Set("Origin", "https://dashboard.3dos.io")
  94. claimReq.Header.Set("Pragma", "no-cache")
  95. claimReq.Header.Set("Priority", "u=1, i")
  96. claimReq.Header.Set("Referer", "https://dashboard.3dos.io/")
  97. claimReq.Header.Set("Sec-CH-UA", `"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"`)
  98. claimReq.Header.Set("Sec-CH-UA-Mobile", "?0")
  99. claimReq.Header.Set("Sec-CH-UA-Platform", `"Windows"`)
  100. claimReq.Header.Set("Sec-Fetch-Dest", "empty")
  101. claimReq.Header.Set("Sec-Fetch-Mode", "cors")
  102. claimReq.Header.Set("Sec-Fetch-Site", "same-site")
  103. claimReq.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36")
  104. claimResp, err := client.Do(claimReq)
  105. if err != nil {
  106. return fmt.Sprintf("%s: claim-reward 请求失败", email)
  107. }
  108. defer claimResp.Body.Close()
  109. var claimData ClaimResponse
  110. json.NewDecoder(claimResp.Body).Decode(&claimData)
  111. if claimResp.StatusCode != 200 && claimResp.StatusCode != 429 {
  112. return fmt.Sprintf("%s: claim 报错: %s, 状态码%d", email, claimData.Message, claimResp.StatusCode)
  113. }
  114. return fmt.Sprintf("%s: %s", email, claimData.Message)
  115. }
  116. func main() {
  117. fmt.Println("开始执行...")
  118. configPath := "account.txt"
  119. content, err := ioutil.ReadFile(configPath)
  120. if err != nil {
  121. fmt.Println("读取配置失败")
  122. return
  123. }
  124. accountList := strings.Split(string(content), "\n")
  125. var wg sync.WaitGroup
  126. results := make(chan string, len(accountList))
  127. for _, account := range accountList {
  128. if account == "" {
  129. continue
  130. }
  131. wg.Add(1)
  132. go func(acc string) {
  133. defer wg.Done()
  134. email, password := strings.Split(acc, "|||")[0], strings.Split(acc, "|||")[1]
  135. results <- dailyClaim3DOS(email, password)
  136. }(account)
  137. }
  138. wg.Wait()
  139. close(results)
  140. for result := range results {
  141. fmt.Println(result)
  142. }
  143. }