Skip to content

Instantly share code, notes, and snippets.

@akazakou
Last active March 22, 2017 14:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akazakou/60d9f3324238131074e38de8ea8bb29f to your computer and use it in GitHub Desktop.
Save akazakou/60d9f3324238131074e38de8ea8bb29f to your computer and use it in GitHub Desktop.
Данный скрипт поможет вам воспользоваться списком пользователей с сайта Pikabu.ru и набить себе рейтинг :) https://goo.gl/DXPbi9
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