修改账号注册方法,以及邮箱协议对接
This commit is contained in:
275
services/bit_browser_service.go
Normal file
275
services/bit_browser_service.go
Normal file
@@ -0,0 +1,275 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go-account-register/libs"
|
||||
"go-account-register/models"
|
||||
"go-account-register/utils"
|
||||
"log"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
"github.com/go-rod/rod/lib/proto"
|
||||
)
|
||||
|
||||
type BitBrowserService struct {
|
||||
}
|
||||
|
||||
var Browser libs.Browser
|
||||
var Chrome libs.Chrome
|
||||
|
||||
func (*BitBrowserService) CreateBrowser(proxy *models.Proxy) string {
|
||||
fingerprint := map[string]interface{}{
|
||||
"name": fmt.Sprintf(`推特注册%s`, utils.RandString(10)),
|
||||
"proxyMethod": 2,
|
||||
"proxyType": "noproxy",
|
||||
"host": "",
|
||||
"port": 0,
|
||||
"proxyUserName": "",
|
||||
"proxyPassword": "",
|
||||
"randomFingerprint": true,
|
||||
"syncTabs": false,
|
||||
"syncCookies": false,
|
||||
"browserFingerPrint": map[string]interface{}{
|
||||
"coreVersion": "130",
|
||||
"ostype": "PC",
|
||||
"os": "Win32",
|
||||
"osVersion": "11,10",
|
||||
"openWidth": 1920,
|
||||
"openHeight": 1480,
|
||||
"resolutionType": "0",
|
||||
},
|
||||
}
|
||||
if proxy != nil {
|
||||
var proxyHandle utils.ProxyHandle
|
||||
protocol, username, password, ip, port, err2 := proxyHandle.ParseProxy(proxy.Type + "://" + proxy.Proxy)
|
||||
if err2 == nil {
|
||||
fingerprint["proxyType"] = protocol
|
||||
fingerprint["host"] = ip
|
||||
fingerprint["port"] = port
|
||||
fingerprint["proxyUserName"] = username
|
||||
fingerprint["proxyPassword"] = password
|
||||
}
|
||||
|
||||
}
|
||||
bitBrowserRequest := utils.NewBitBrowserRequest()
|
||||
jsonStr, _ := bitBrowserRequest.CreateBrowser(fingerprint)
|
||||
var rawData map[string]interface{}
|
||||
if err := json.Unmarshal([]byte(jsonStr.Body()), &rawData); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
success := rawData["success"].(bool)
|
||||
if success {
|
||||
// 如果成功则将数据存入数据库
|
||||
data := rawData["data"].(map[string]interface{})
|
||||
id := data["id"].(string)
|
||||
browserInstanceService := InitBrowserInstanceService()
|
||||
var params = &models.BrowserInstance{
|
||||
BrowserId: id,
|
||||
Fingerprint: data,
|
||||
UpdateTime: time.Now().Unix(),
|
||||
CreateTime: time.Now().Unix(),
|
||||
}
|
||||
if proxy != nil {
|
||||
params.Proxy = proxy.Type + "://" + proxy.Proxy
|
||||
}
|
||||
browserInstanceService.Create(params)
|
||||
return id
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (*BitBrowserService) GetPid(id string) int {
|
||||
// 获取当前
|
||||
bitBrowserRequest := utils.NewBitBrowserRequest()
|
||||
jsonStr, _ := bitBrowserRequest.GetPids([]string{id})
|
||||
var result struct {
|
||||
Data map[string]int `json:"data"` // 动态键名 → 值
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
if err := json.Unmarshal([]byte(jsonStr.Body()), &result); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
success := result.Success
|
||||
if success {
|
||||
data := result.Data
|
||||
if value, exists := data[id]; exists {
|
||||
return value
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 打开浏览器
|
||||
func (*BitBrowserService) OpenBrowser(browserId string) string {
|
||||
// 获取当前
|
||||
bitBrowserRequest := utils.NewBitBrowserRequest()
|
||||
data := map[string]interface{}{
|
||||
"id": browserId,
|
||||
"queue": true,
|
||||
}
|
||||
jsonStr, _ := bitBrowserRequest.OpenBrowser(data)
|
||||
var rawData map[string]interface{}
|
||||
if err := json.Unmarshal([]byte(jsonStr.Body()), &rawData); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
success := rawData["success"].(bool)
|
||||
if success {
|
||||
data := rawData["data"].(map[string]interface{})
|
||||
ws := data["ws"].(string)
|
||||
browserInstanceService := InitBrowserInstanceService()
|
||||
browserInstanceService.Update(browserId, &models.BrowserInstance{
|
||||
BrowserUrl: ws,
|
||||
})
|
||||
return ws
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// 删除浏览器
|
||||
func (*BitBrowserService) DeleteBrowser(browserId string) bool {
|
||||
bitBrowserRequest := utils.NewBitBrowserRequest()
|
||||
// 先关闭浏览器
|
||||
_, err := bitBrowserRequest.CloseBrowser(browserId)
|
||||
if err != nil {
|
||||
log.Println("关闭浏览器失败")
|
||||
}
|
||||
// 删除浏览器
|
||||
_, err2 := bitBrowserRequest.DeleteBrowser(browserId)
|
||||
log.Println("删除浏览器,", err2 == nil)
|
||||
return err2 == nil
|
||||
}
|
||||
|
||||
func (bit *BitBrowserService) Register() *libs.ErrorInfo {
|
||||
// 随机获取代理
|
||||
proxyService := InitProxyService()
|
||||
proxy := proxyService.GetInfo()
|
||||
var browserId string
|
||||
// 创建新的浏览器
|
||||
if proxy != nil {
|
||||
browserId = bit.CreateBrowser(proxy)
|
||||
} else {
|
||||
browserId = bit.CreateBrowser(nil)
|
||||
}
|
||||
// 打开浏览器
|
||||
if browserId == "" {
|
||||
return libs.ErrorCode["BrowserCreationFailed"]
|
||||
}
|
||||
ws := bit.OpenBrowser(browserId)
|
||||
if ws == "" {
|
||||
return libs.ErrorCode["BrowserCreationFailed"]
|
||||
}
|
||||
// 获取一个邮箱
|
||||
emailService := InitEmailService()
|
||||
|
||||
emailInfo := emailService.GetEmailOne()
|
||||
obj := Browser.GetBitBrowser(ws)
|
||||
page := obj.Page
|
||||
page.MustNavigate("https://x.com/i/flow/signup").MustWaitLoad()
|
||||
// 判断当前是否是邮箱注册
|
||||
_, err := page.Element(`input[name="email"]`)
|
||||
if err != nil {
|
||||
switchButton := page.Timeout(5 * time.Second).MustElement(`button.css-146c3p1.r-bcqeeo.r-qvutc0.r-1qd0xha.r-1ff274t.r-a023e6.r-rjixqe.r-16dba41`)
|
||||
switchButton.MustClick()
|
||||
}
|
||||
// 获取邮箱输入框
|
||||
inputEmail := page.Timeout(5 * time.Second).MustElement(`input[name="email"]`)
|
||||
inputEmail.MustFocus()
|
||||
inputEmail.MustInput(emailInfo.Email)
|
||||
// 获取名称输入框
|
||||
inputName := page.Timeout(5 * time.Second).MustElement(`input[name="name"]`)
|
||||
inputName.MustFocus()
|
||||
nameStr := emailInfo.Name
|
||||
if emailInfo.Name == "" {
|
||||
nameStr = utils.RandString(12)
|
||||
}
|
||||
inputName.MustInput(nameStr)
|
||||
// 随机生成生日
|
||||
dateParams := utils.RandDate(18, 100)
|
||||
dateSelects, _ := page.Timeout(5 * time.Second).Elements(`select.r-30o5oe.r-1niwhzg.r-17gur6a.r-1yadl64.r-18jsvk2.r-1loqt21.r-1inkyih.r-rjixqe.r-crgep1.r-1wzrnnt.r-1ny4l3l.r-t60dpp.r-xd6kpl.r-is05cd.r-ttdzmv`)
|
||||
// 月份
|
||||
dateSelects[0].WaitVisible()
|
||||
dateSelects[0].MustSelect(strconv.Itoa(dateParams.Month))
|
||||
// 日期
|
||||
dateSelects[1].WaitVisible()
|
||||
dateSelects[1].MustSelect(strconv.Itoa(dateParams.Day))
|
||||
// 年份
|
||||
dateSelects[2].WaitVisible()
|
||||
dateSelects[2].MustSelect(strconv.Itoa(dateParams.Year))
|
||||
|
||||
// 点击下一步
|
||||
ocfSignupNextLink := page.Timeout(5 * time.Second).MustElement(`button[data-testid="ocfSignupNextLink"]`)
|
||||
ocfSignupNextLink.MustClick()
|
||||
// 判断是否需要验证码
|
||||
time.Sleep(4 * time.Second)
|
||||
codeInput, err1 := page.Timeout(5 * time.Second).Element(`input[name="verfication_code"]`)
|
||||
if err1 != nil {
|
||||
// res := getApiResponse(page, "")
|
||||
}
|
||||
//TODO 对接获取邮箱信息接口
|
||||
// 获取邮箱验证码
|
||||
codeInput.MustInput("")
|
||||
// 点击下一步
|
||||
codeNextButton := page.Timeout(5 * time.Second).MustElement(`button.css-175oi2r.r-sdzlij.r-1phboty.r-rs99b7.r-lrvibr.r-19yznuf.r-64el8z.r-1fkl15p.r-1loqt21.r-o7ynqc.r-6416eg.r-1ny4l3l`)
|
||||
codeNextButton.MustClick()
|
||||
// // 点击验证按钮
|
||||
// verifyButton := page.Timeout(5 * time.Second).MustElement(`button[data-theme="home.verifyButton"]`)
|
||||
// verifyButton.MustClick()
|
||||
// 输入密码
|
||||
passwordInput, err2 := page.Timeout(5 * time.Second).Element(`input[name="password"]`)
|
||||
if err2 != nil {
|
||||
// res := getApiResponse(page, "")
|
||||
}
|
||||
passwordInput.MustInput(emailInfo.Password)
|
||||
// 点击下一步
|
||||
loginButton := page.Timeout(5 * time.Second).MustElement(`button[data-testid="LoginForm_Login_Button"]`)
|
||||
loginButton.MustClick()
|
||||
time.Sleep(5 * time.Second)
|
||||
page.MustNavigate("https://x.com").MustWaitLoad()
|
||||
// 获取cookie
|
||||
cookieArr := getPageCookie(page, "https://x.com")
|
||||
// 创建用户
|
||||
twitterAccountService := InitTwitterAccountService()
|
||||
twitterAccountService.Create(&models.TwitterAccount{
|
||||
Name: nameStr,
|
||||
Email: emailInfo.Email,
|
||||
Password: emailInfo.Password,
|
||||
Birthday: strconv.Itoa(dateParams.Year) + "-" + strconv.Itoa(dateParams.Month) + "-" + strconv.Itoa(dateParams.Day),
|
||||
Cookies: cookieArr,
|
||||
Status: "注册成功",
|
||||
LoginStatus: "登录成功",
|
||||
Proxy: func() string {
|
||||
if proxy != nil {
|
||||
return proxy.Type + "://" + proxy.Proxy
|
||||
}
|
||||
return ""
|
||||
}(),
|
||||
})
|
||||
|
||||
// 删除浏览器
|
||||
bit.DeleteBrowser(browserId)
|
||||
return libs.ErrorCode["RegisterSuccessful"]
|
||||
|
||||
}
|
||||
|
||||
// 获取指定页面的cookie列表
|
||||
func getPageCookie(page *rod.Page, url string) []*proto.NetworkCookieParam {
|
||||
cookieArr, _ := page.Cookies([]string{url})
|
||||
var cookies []*proto.NetworkCookieParam
|
||||
for _, cookie := range cookieArr {
|
||||
cookies = append(cookies, &proto.NetworkCookieParam{
|
||||
Name: cookie.Name,
|
||||
Value: cookie.Value,
|
||||
Domain: cookie.Domain,
|
||||
Path: cookie.Path,
|
||||
Expires: cookie.Expires, // 过期时间
|
||||
HTTPOnly: cookie.HTTPOnly, // 禁止 JS 访问
|
||||
Secure: cookie.Secure, // 仅 HTTPS 传输
|
||||
})
|
||||
}
|
||||
return cookies
|
||||
}
|
||||
Reference in New Issue
Block a user