|
|
@@ -11,127 +11,130 @@ import (
|
|
|
"wartank/pkg/types"
|
|
|
)
|
|
|
|
|
|
-// BotNetLogin -- объект сетевого входа на сервер
|
|
|
-type BotNetLogin struct {
|
|
|
- botNet types.ИБотСеть
|
|
|
- conn *http.Client
|
|
|
- cookie types.ИБотКуки
|
|
|
+// БотСетьЛогин -- объект сетевого входа на сервер
|
|
|
+type БотСетьЛогин struct {
|
|
|
+ сеть types.ИБотСеть
|
|
|
+ клиент *http.Client
|
|
|
+ куки types.ИБотКуки
|
|
|
}
|
|
|
|
|
|
-// NewBotNetLogin -- возвращает новый *NetLogin
|
|
|
-func NewBotNetLogin(botNet types.ИБотСеть) (*BotNetLogin, error) {
|
|
|
+// НовБотСетьЛогин -- возвращает новый *БотСетьЛогин
|
|
|
+func НовБотСетьЛогин(ботСеть types.ИБотСеть) (БотСетьЛогин, error) {
|
|
|
{ // Предусловия
|
|
|
- if botNet == nil {
|
|
|
- return nil, fmt.Errorf("NewBotNetLogin(): IBotNet is nil")
|
|
|
+ if ботСеть == nil {
|
|
|
+ return БотСетьЛогин{}, fmt.Errorf("НовБотСетьЛогин(): ИБотСеть пустышка")
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- sf := &BotNetLogin{
|
|
|
- botNet: botNet,
|
|
|
- conn: botNet.Коннект(),
|
|
|
- cookie: botNet.Куки(),
|
|
|
+ sf := БотСетьЛогин{
|
|
|
+ сеть: ботСеть,
|
|
|
+ клиент: ботСеть.Коннект(),
|
|
|
+ куки: ботСеть.Куки(),
|
|
|
}
|
|
|
- if err := sf.connect(); err != nil {
|
|
|
- return nil, fmt.Errorf("NewBotLogin() in connect to server, err=\n\t%w", err)
|
|
|
+ if err := sf.подключить(); err != nil {
|
|
|
+ return БотСетьЛогин{}, fmt.Errorf("НовБотСетьЛогин() in connect to server, err=\n\t%w", err)
|
|
|
}
|
|
|
return sf, nil
|
|
|
}
|
|
|
|
|
|
// Вызывается один раз
|
|
|
-func (sf *BotNetLogin) connect() (err error) {
|
|
|
- linkBegin, err := sf.getMainPage()
|
|
|
+func (сам *БотСетьЛогин) подключить() (err error) {
|
|
|
+ ссылкаНачать, err := сам.получСтрГлав()
|
|
|
if err != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.connect(): при получении главной страницы, err=\n\t%w", err)
|
|
|
+ return fmt.Errorf("БотСетьЛогин.подключить(): при получении главной страницы, err=\n\t%w", err)
|
|
|
}
|
|
|
- switch linkBegin != "" {
|
|
|
+ switch ссылкаНачать != "" {
|
|
|
case true: // Это вход на базу
|
|
|
- strBodyLogin, err := sf.getPageLogin(linkBegin)
|
|
|
- if err != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.connect(): при получении страницы логина, err=\n\t%w", err)
|
|
|
+ стрСтрЛогин, ош := сам.получСтрЛогин(ссылкаНачать)
|
|
|
+ if ош != nil {
|
|
|
+ return fmt.Errorf("БотСетьЛогин.подключить(): при получении страницы логина, err=\n\t%w", ош)
|
|
|
}
|
|
|
- if err = sf.makePostLogin(strBodyLogin); err != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.connect(): при выполнении логина, err=\n\t%w", err)
|
|
|
+ if ош = сам.выполнитьЛогин(стрСтрЛогин); ош != nil {
|
|
|
+ return fmt.Errorf("БотСетьЛогин.подключить(): при выполнении логина, err=\n\t%w", ош)
|
|
|
}
|
|
|
return nil
|
|
|
default: // Логин уже был
|
|
|
- req, err1 := http.NewRequest("GET", "https://wartank.ru/angar", nil)
|
|
|
- if err1 != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.connect(): in get page angar, err=\n\t%w", err1)
|
|
|
+ запр, ош1 := http.NewRequest("GET", "https://wartank.ru/angar", nil)
|
|
|
+ if ош1 != nil {
|
|
|
+ return fmt.Errorf("БотСетьЛогин.подключить(): in get page angar, err=\n\t%w", ош1)
|
|
|
|
|
|
}
|
|
|
- resp, err2 := sf.conn.Do(req)
|
|
|
- if err2 != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.connect(): in make request, err=\n\t%w", err2)
|
|
|
+ resp, ош2 := сам.клиент.Do(запр)
|
|
|
+ if ош2 != nil {
|
|
|
+ return fmt.Errorf("БотСетьЛогин.подключить(): in make request, err=\n\t%w", ош2)
|
|
|
}
|
|
|
defer resp.Body.Close()
|
|
|
- _, err := io.ReadAll(resp.Body)
|
|
|
- if err != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.connect(): in read body response, err=\n\t%w", err)
|
|
|
+ _, ош := io.ReadAll(resp.Body)
|
|
|
+ if ош != nil {
|
|
|
+ return fmt.Errorf("БотСетьЛогин.подключить(): in read body response, err=\n\t%w", ош)
|
|
|
}
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// Прочитать главную страницу для получения кукисов
|
|
|
-func (sf *BotNetLogin) getMainPage() (linkBegin string, err error) {
|
|
|
- // _mt.Println("\BotNetLogin.getMainPage()")
|
|
|
- resp, err := sf.conn.Get("https://wartank.ru/")
|
|
|
- if err != nil {
|
|
|
- return "", fmt.Errorf("BotNetLogin.getMainPage(): err=\n\t%w", err)
|
|
|
+func (сам *БотСетьЛогин) получСтрГлав() (string, error) {
|
|
|
+ // _mt.Println("\БотСетьЛогин.getMainPage()")
|
|
|
+ ответ, ош := сам.клиент.Get("https://wartank.ru/")
|
|
|
+ if ош != nil {
|
|
|
+ return "", fmt.Errorf("БотСетьЛогин.получСтрГлав(): err=\n\t%w", ош)
|
|
|
}
|
|
|
- defer resp.Body.Close()
|
|
|
+ defer ответ.Body.Close()
|
|
|
// Получить куки из ответа
|
|
|
- cookies := resp.Cookies()
|
|
|
- if len(cookies) > 0 {
|
|
|
- if err = sf.cookie.Уст(cookies); err != nil {
|
|
|
- return "", fmt.Errorf("BotNetLogin.getMainPage(): при установки куки, err=\n\t%w", err)
|
|
|
+ куки := ответ.Cookies()
|
|
|
+ if len(куки) > 0 {
|
|
|
+ if ош = сам.куки.Уст(куки); ош != nil {
|
|
|
+ return "", fmt.Errorf("БотСетьЛогин.получСтрГлав(): при установки куки, err=\n\t%w", ош)
|
|
|
}
|
|
|
}
|
|
|
- binData, err := io.ReadAll(resp.Body)
|
|
|
- if err != nil {
|
|
|
- return "", fmt.Errorf("BotNetLogin.getMainPage(): при чтении тела ответа, err=\n\t%w", err)
|
|
|
+ бинДанные, ош := io.ReadAll(ответ.Body)
|
|
|
+ if ош != nil {
|
|
|
+ return "", fmt.Errorf("БотСетьЛогин.получСтрГлав(): при чтении тела ответа, err=\n\t%w", ош)
|
|
|
}
|
|
|
// Вырезать из тела страницы ссылку на вход
|
|
|
- lstStr := strings.Split(string(binData), "\n")
|
|
|
- var strOut string
|
|
|
- for _, strLink := range lstStr {
|
|
|
- if strings.Contains(strLink, `w:id="showSigninLink"`) {
|
|
|
- strOut = strLink
|
|
|
+ списСтр := strings.Split(string(бинДанные), "\n")
|
|
|
+ var (
|
|
|
+ стрВых string
|
|
|
+ ссылкаНач string
|
|
|
+ )
|
|
|
+ for _, стрСсылка := range списСтр {
|
|
|
+ if strings.Contains(стрСсылка, `w:id="showSigninLink"`) {
|
|
|
+ стрВых = стрСсылка
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- if strOut == "" { // Уже был логин
|
|
|
+ if стрВых == "" { // Уже был логин
|
|
|
return "", nil
|
|
|
}
|
|
|
{ // Получить ссылку на вход
|
|
|
- lstLink := strings.Split(strOut, `href="`)
|
|
|
- lstLink = strings.Split(lstLink[1], `"><span><span>`)
|
|
|
- linkBegin = "https://wartank.ru/" + lstLink[0]
|
|
|
+ списСсылка := strings.Split(стрВых, `href="`)
|
|
|
+ списСсылка = strings.Split(списСсылка[1], `"><span><span>`)
|
|
|
+ ссылкаНач = "https://wartank.ru/" + списСсылка[0]
|
|
|
}
|
|
|
- return linkBegin, nil
|
|
|
+ return ссылкаНач, nil
|
|
|
}
|
|
|
|
|
|
// Получает страницу логина
|
|
|
-func (sf *BotNetLogin) getPageLogin(linkBegin string) (strBodyLogin string, err error) {
|
|
|
- // _mt.Println("\BotNetLogin.getPageLogin()")
|
|
|
- resp, err := sf.conn.Get(linkBegin)
|
|
|
- if err != nil {
|
|
|
- return "", fmt.Errorf("NetLogin.getPageLogin(): in mske GET-request for send login page, err=\n\t%w", err)
|
|
|
+func (сам *БотСетьЛогин) получСтрЛогин(linkBegin string) (string, error) {
|
|
|
+ // _mt.Println("\БотСетьЛогин.getPageLogin()")
|
|
|
+ ответ, ош := сам.клиент.Get(linkBegin)
|
|
|
+ if ош != nil {
|
|
|
+ return "", fmt.Errorf("БотСетьЛогин.получСтрЛогин(): in mske GET-request for send login page, err=\n\t%w", ош)
|
|
|
}
|
|
|
- defer resp.Body.Close()
|
|
|
+ defer ответ.Body.Close()
|
|
|
// sf.cookie = resp.Cookies()
|
|
|
- binData, err := io.ReadAll(resp.Body)
|
|
|
- if err != nil {
|
|
|
- return "", fmt.Errorf("NetLogin.getPageLogin(): in read body response, err=\n\t%w", err)
|
|
|
+ данные, ош := io.ReadAll(ответ.Body)
|
|
|
+ if ош != nil {
|
|
|
+ return "", fmt.Errorf("БотСетьЛогин.получСтрЛогин(): in read body response, err=\n\t%w", ош)
|
|
|
}
|
|
|
- strBodyLogin = string(binData)
|
|
|
- // sf.app.AddLog(fmt.Sprintf("BotNetLogin.getPageLogin(): page_login=\n%v\n\n", strBodyLogin))
|
|
|
- return strBodyLogin, nil
|
|
|
+ стрТелоЛогин := string(данные)
|
|
|
+ // sf.app.AddLog(fmt.Sprintf("БотСетьЛогин.получСтрЛогин(): page_login=\n%v\n\n", strBodyLogin))
|
|
|
+ return стрТелоЛогин, nil
|
|
|
}
|
|
|
|
|
|
// Выполняет логин через POST-запрос
|
|
|
-func (sf *BotNetLogin) makePostLogin(strBody string) (err error) {
|
|
|
- // _mt.Println("\BotNetLogin.makePostLogin()")
|
|
|
+func (сам *БотСетьЛогин) выполнитьЛогин(strBody string) (err error) {
|
|
|
+ // _mt.Println("\БотСетьЛогин.makePostLogin()")
|
|
|
var strBodyMain string
|
|
|
{ // Получить форму логина
|
|
|
lstLogin := strings.Split(strBody, "\n")
|
|
|
@@ -152,19 +155,19 @@ func (sf *BotNetLogin) makePostLogin(strBody string) (err error) {
|
|
|
{ // Конструируем ПОСТ-форму логина
|
|
|
form := url.Values{}
|
|
|
form.Add("id1_hf_0", "")
|
|
|
- form.Add("login", sf.botNet.Бот().Имя())
|
|
|
- form.Add("password", sf.botNet.Бот().Пароль())
|
|
|
+ form.Add("login", сам.сеть.Бот().Имя())
|
|
|
+ form.Add("password", сам.сеть.Бот().Пароль())
|
|
|
|
|
|
- resp, err := sf.conn.PostForm(postLink, form)
|
|
|
+ resp, err := сам.клиент.PostForm(postLink, form)
|
|
|
if err != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.makePostLogin(): in get POST-login response, err=\n\t%w", err)
|
|
|
+ return fmt.Errorf("БотСетьЛогин.makePostLogin(): in get POST-login response, err=\n\t%w", err)
|
|
|
}
|
|
|
defer resp.Body.Close()
|
|
|
if _, err = io.ReadAll(resp.Body); err != nil {
|
|
|
- return fmt.Errorf("BotNetLogin.makePostLogin(): in read body POST-login response, err=\n\t%w", err)
|
|
|
+ return fmt.Errorf("БотСетьЛогин.makePostLogin(): in read body POST-login response, err=\n\t%w", err)
|
|
|
}
|
|
|
urlObj, _ := url.Parse("https://wartank.ru/")
|
|
|
- sf.conn.Jar.SetCookies(urlObj, sf.cookie.Получ())
|
|
|
+ сам.клиент.Jar.SetCookies(urlObj, сам.куки.Получ())
|
|
|
}
|
|
|
return nil
|
|
|
}
|