wtorek, 22 lutego 2011

Bot do Plemion

cURL + PHP oczywiście :)


Nie znalazłem w sieci żadnych skryptów/programów więc postanowiłem napisać sam. Jestem pod ogromnym zdziwieniem, że znając podstawy PHP i cURLa potrafię napisać prostego bota. Czemu prostego? Bo bot tylko (aż) buduje podane przez nas budynki dostarczające surowców - tartak, cegielnia(?), huta żelaza. Jeśli ktoś chce może go sobie poszerzyć o inne budynki.

Najtrudniejsze było to jak się zalogować do gry. Próbowałem przeglądać przesyłane do i z serwera GETy i POSTy, jednak nie wiele mi to dawało. Rozwiązanie znalazłem na pewnym forum o autoit (to chyba jakiś język "programowania"(?)). Niejaki Sparrow napisał tam:

Założyłem konto na tym forum specjalnie po to, żeby podzielić się z wami tą informacją.
Aby automatycznie zalogować się na konto plemion wystarczy użyć adresu który dostajecie w mailu dotyczącym raportu z wioski czy coś w tym stylu (nie gram w plemiona, robie bota dla znajomego dla zabawy).

us1.tribalwars.us/login.php?user=TWOJA_NAZWA_UZYTKOWNIKA&password=ZAKODOWANE_HASŁO&more_mails&utf-8
Wkleiłem do paska przeglądarki, działa! No to lecimy z logowaniem :)

$url_login = 'http://us1.tribalwars.us/login.php?user=TWOJA_NAZWA_UZYTKOWNIKA&password=ZAKODOWANE_HASŁO&more_mails&utf-8';
$cookie = 'cookie.txt';
$useragent = 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3';


$ch = curl_init( $url_login );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_COOKIE, $cookie);
curl_setopt( $ch, CURLOPT_USERAGENT, $useragent );
curl_setopt( $ch, CURLOPT_REFERER, 'http://tribalwars.us' );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
$page = curl_exec($ch);
curl_close($ch);
if ($page != NULL)
{
echo "Zalogowany<\r\n";
}
else
echo "Blad w logowaniu\r\n";

Spróbujcie, na 100% zadziała :)
To może teraz stan surowców? Czemu nie.. (Tutaj troche nie dopracowałem, bo mi się nie chciało już- gdy spichlerz jest pełny wtedy nie pobiera stanu surowców)

//////////////////////      STAN SUROWCÓW
preg_match_all('/title\=\"[0-9]{0,5}\"\s\>[0-9]{0,5}/', $page, $surowce);

$drewno = explode('>', $surowce[0][0]);
$glina = explode('>', $surowce[0][1]);
$zelazo = explode('>', $surowce[0][2]);

echo 'Stan surowcow: \r\n
- drewno ' . $drewno[1].'\r\n
- glina ' .$glina[1].'\r\n
- zelazo ' .$zelazo[1].'\r\n';

Teraz sprawdzamy czy coś się buduje. Po co? Dla jaj, które będą potrzebne później.
/////////////////////        CZY COS SIE BUDUJE

$ch = curl_init( 'http://us1.tribalwars.us/game.php?village=NUMER_WIOCHY&screen=main' );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_COOKIE, $cookie);
curl_setopt( $ch, CURLOPT_USERAGENT, $useragent );
curl_setopt( $ch, CURLOPT_REFERER, 'http://tribalwars.us' );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
$page = curl_exec($ch);
curl_close($ch);

preg_match_all('/today at/', $page, $budowanie);
$wbudowie = count($budowanie[0]);
echo 'W budowie '.$wbudowie.' budynkow.\r\n';

Wiemy czy i ile się budynków buduje. Jeśli możemy to zaczynamy budować, nic prostszego.

if ( $wbudowie< 2)
{
require "skrypty.php";
connection();
while ($wbudowie < 2)
{
preg_match_all('/game\.php\?village\=NUMER_WIOCHY\&\;screen\=main\&\;action\=build\&\;h\=[0-9a-z]{0,4}\&\;id\=(wood|stone|iron)/', $page, $linki);
$dodrewna = $linki[0][0];
$dogliny  = $linki[0][1];
$dozelaza = $linki[0][2];
               


$zapytanie = "SELECT `ostatni` FROM `ostatni`";
$wykonaj = mysql_query($zapytanie);
$ostatni = mysql_fetch_row($wykonaj);

$ostatni = $ostatni[0]+1;

$zapytanie = "SELECT `typ` FROM `budowanie` WHERE `id`='$ostatni'";
$wykonaj = mysql_query($zapytanie);
$typ =   mysql_fetch_row($wykonaj);

switch ($typ[0])
       {
        case 1:
        $link = $dodrewna;
        break;
        
        case 2:
        $link = $dogliny;
        break;
        
        case 3:
        $link = $dozelaza;
        break;
       };

$link = 'http://us1.tribalwars.us/'.$link;
$link = str_replace("amp;", "", $link);


$ch = curl_init( $link);
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_COOKIE, $cookie);
curl_setopt( $ch, CURLOPT_USERAGENT, $useragent );
curl_setopt( $ch, CURLOPT_REFERER, 'http://us1.tribalwars.us/game.php?village=NUMER_WIOCHY&screen=main&mode=build' );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
$page = curl_exec($ch);
curl_close($ch);

$zapytanie = "UPDATE `ostatni` SET `ostatni` = '$ostatni'";
$wykonaj = mysql_query($zapytanie);
echo 'Zlecilem budowe :) 
';





$wbudowie=$wbudowie +1;
}
}
W tej części powyżej jest trochę pogmatwane, bo musicie mieć bazę danych(straszne prawda?). Co potrzebujecie: - plik skrypty.php z funckją connection(), która łączy się z bazą - bazę danych :) - 2 tabele ("ostatni" i "budowanie"), ostatni - struktura (int(255), jedyny rekord ustawiamy na 0), budowanie - struktura(id - nadawane automatycznie przez bazę, typ - int(255), 1-dla drewna, 2 dla gliny, 3 dla żelaza) Do tabeli budowanie dodajecie kolejne budynki, które skrypt ma zlecić do budowy. Skrypt ma jeszcze pewny mankament :) Otóż gdy nie ma budynków w kolejce, skrypt "myśli", że może budować i buduję nie zwracając uwagi na surowce, tzn. że nie sprawdza czy surowców jest wystarczająco, a co za tym idzie będzie omijać pewne budowle. Jeśli mi się będzie chciało, w co wątpię, to poprawię. Myślę, że i tak ten skrypt wiele wam pomoże :) Btw. mój blog do tej pory nie jest indeksowany przez google... DOPRACOWANA WERSJA BOTA - TUTAJ

2 komentarze:

  1. "ZAKODOWANE_HASŁO" W jaki sposób zakodowane ?

    OdpowiedzUsuń
  2. Jedyny działający na tę chwilę bot, to http://pomocnikplemiona.tk/ Tylko on rozwala captchę. Za resztę to można co najwyżej bana dostać

    OdpowiedzUsuń