-
-
Save akazakou/60d9f3324238131074e38de8ea8bb29f to your computer and use it in GitHub Desktop.
Данный скрипт поможет вам воспользоваться списком пользователей с сайта Pikabu.ru и набить себе рейтинг :) https://goo.gl/DXPbi9
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"net/http" | |
"io/ioutil" | |
"net/url" | |
"encoding/json" | |
"strings" | |
"regexp" | |
"sync" | |
) | |
// структура описывает ответ от сервера на ajax запросы | |
type ResponseMessage struct { | |
Result bool | |
Message string | |
Message_code int | |
Data []string | |
} | |
// структура описывает пользователя | |
// прокси описывается как DSN запись | |
type User struct { | |
Login, Password, Proxy string | |
} | |
// указываем ID истории которую нужно бустить | |
var storyId string = "4850208" | |
// создаем слушателя завершения горутин | |
var wg sync.WaitGroup | |
/** | |
Главный метод, который вызывает авторизацию для пользователей | |
*/ | |
func main() { | |
// список пользователей с настройками для выполнения запросов | |
var users = []User { | |
User { Login: "user1", Password: "user_password_1", Proxy: "http://http.proxy1:port/"}, | |
User { Login: "user2", Password: "user_password_2", Proxy: "http://http.proxy2:port/"}, | |
} | |
wg.Add(len(users)) | |
for _,user := range users { | |
go auth(user) | |
} | |
wg.Wait() | |
} | |
/** | |
Метод получает CSRF токен с сайта для подписи AJAX запросов | |
*/ | |
func tokenExtract(user User) (string,*http.Cookie) { | |
req, err := http.NewRequest("GET", "http://pikabu.ru/", nil) | |
// маскируемся под браузер | |
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") | |
// выполняем запрос | |
proxyUrl, err := url.Parse(user.Proxy) | |
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} | |
resp, err := client.Do(req) | |
if err != nil { | |
fmt.Printf("Error on opening main page: %s\n", user.Login) | |
return "", nil | |
} | |
defer resp.Body.Close() | |
body, err := ioutil.ReadAll(resp.Body) | |
var cookies = resp.Cookies() | |
var phpsess *http.Cookie = nil | |
for i := 0; i < len(cookies); i++ { | |
if cookies[i].Name == "PHPSESS" { | |
phpsess = cookies[i] | |
} | |
} | |
re := regexp.MustCompile("\"sessionID\":\"([a-z0-9]+)") | |
match := re.FindStringSubmatch(string(body)) | |
return match[1], phpsess | |
} | |
/** | |
Метод производит авторизацию пользователя на сервере | |
*/ | |
func auth(user User) { | |
defer wg.Done() | |
// генерируем новый csrf токен для генерации AJAX запросов | |
csrfToken, phpsess := tokenExtract(user); | |
if csrfToken == "" { | |
fmt.Printf("Recieving wrong user token: %s\n", user.Login) | |
return | |
} | |
// генерируем HTTP запрос | |
var values = url.Values{"mode": {"login"}, "password": {user.Password}, "username": {user.Login}} | |
req, err := http.NewRequest("POST", "http://pikabu.ru/ajax/auth.php", strings.NewReader(values.Encode())) | |
// маскируемся под браузер | |
req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") | |
req.Header.Add("X-Csrf-Token", csrfToken) | |
req.Header.Add("X-Requested-With", "XMLHttpRequest") | |
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") | |
// добавляем идентификатор сессии, чтобы не потерять авторизацию | |
req.AddCookie(phpsess) | |
// выполняем запрос | |
proxyUrl, err := url.Parse(user.Proxy) | |
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} | |
resp, err := client.Do(req) | |
if err != nil { | |
fmt.Printf("Error on authorizing of user: %s\n", user.Login) | |
return; | |
} | |
// проверяем код ответа от сервера на то, что все ОК | |
if resp.StatusCode != 200 { | |
fmt.Printf("User %s unsuccessfully authorized\n", user.Login) | |
return | |
} | |
// лайкаем пост пользователя | |
like(user, resp.Cookies(), csrfToken, phpsess) | |
} | |
/** | |
Метод производит клик по кнопке Like | |
*/ | |
func like(user User, cookies []*http.Cookie, csrfToken string, phpsess *http.Cookie) { | |
var values = url.Values{"story_id": {storyId}, "vote": {"1"}} | |
req, err := http.NewRequest("POST", "http://pikabu.ru/ajax/vote_story.php", strings.NewReader(values.Encode())) | |
req.Header.Add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") | |
req.Header.Add("X-Csrf-Token", csrfToken) | |
req.Header.Add("X-Requested-With", "XMLHttpRequest") | |
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") | |
req.AddCookie(phpsess); | |
// прилетает во время авторизации странная кука. на всяк случай сохранил ее для выполнения запроса | |
for i := 0; i < len(cookies); i++ { | |
if cookies[i].Name == "phpDug2" { | |
req.AddCookie(cookies[i]) | |
} | |
} | |
// выполняем запрос к серверу | |
proxyUrl, err := url.Parse(user.Proxy) | |
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} | |
resp, err := client.Do(req) | |
if err != nil { | |
fmt.Printf("Error on authorizing of user: %s\n", user.Login) | |
return; | |
} | |
// проверяем что запрос прошел успешно | |
if resp.StatusCode != 200 { | |
fmt.Printf("Request to like is fail for user %s\n", user.Login) | |
return | |
} | |
// парсим ответ от сервера | |
defer resp.Body.Close() | |
body, err := ioutil.ReadAll(resp.Body) | |
if err != nil { | |
fmt.Printf("Error on parse like response: %s\n", err.Error()) | |
return; | |
} | |
// разбираем JSON ответ сервера | |
var message ResponseMessage | |
if json.Unmarshal(body, &message) != nil { | |
fmt.Printf("Error on decode like response: %s\n", err.Error()) | |
return; | |
} | |
// Проверяем что сервер подтердил простановку лайка | |
if message.Result == true && message.Message_code == 0 { | |
fmt.Printf("User %s liked story %s\n", user.Login, storyId) | |
return; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment