niedziela, 13 lutego 2011

Curl+PHP - Wyciąganie maili

Ostatnio zauważyłem, że na niektórych forach listy użytkowników są dostępne bez zalogowania oraz przy nicku niemal każdego użytkownika widnieje jego adres email.
Jako przykład, mogę podać forum break.pl. Od razu wpadłem na pomysł: może by tak napisać skrypt, który zapisze mi adresy wszystkich użytkowników. No i napisałem :) Efekt jest zadowalający - posiadam ważący ponad 40kb plik tekstowy z kilkoma tysiącami emaili.

Oto skrypt (w skrypty.php - funkcja connection() do połączenia z bazą danych):

<font color="red"><strong>ZNIWIARKA</strong></font>, czyli - Pobieranie emaili z listy uzytkownikw forum "Powered by phpBB 2.0.21", by <big><big><strong><font color="red">akcz4</font></strong></big></big></big>!!11!1! <br /><br />


Podaj link do forum (np. www.break.pl/forum)<br />
<form action ="" method ="post">
<input type = "text" name= "link">   <br /><br />
Ile podstron <br />
<input type = "text" name= "podstrony">   <br /> <br />
Typ linku do podstrony:<br />
<input type="radio" name="typ" value="1" />modules.php?name=Members_List&file=index&mode=joined&order=ASC&start=<br />
<input type="radio" name="typ" value="2" />memberlist.php?mode=joined&order=ASC&start=<br /> <br />

Nazwa pliku tekstowego: (.txt)   <br />
<input type = "text" name= "nazwa">   <br />
<input type = "submit" value ="Zbieraj maile!"><br /><br />
///////////////////////////////////////////////
///////////////////////////////////////////////

<?php
if ( $_POST['link'] !=NULL)
{
require "skrypty.php";
connection();
set_time_limit();
$podstrony =$_POST['podstrony'];
$podstrony = $podstrony * 50 - 50;
$typ = $_POST['typ'];
$link = $_POST['link'];
$nazwa=$_POST['nazwa'];
$zapis=$_POST['zapis'];
if ($typ == 1)
{
$p = '/modules.php?name=Members_List&file=index&mode=joined&order=ASC&start=';
}
else
{
$p =  '/memberlist.php?mode=joined&order=ASC&start=';
};

$ile = 0;
echo '<font color="red"><b>!!!ZACZYNAM ZNIWA!!!</b> </font><br />';
for ($i=0; $i<=$podstrony;$i=$i+50)
{
$url =   $link. $p . $i  ;
$f = curl_init();
curl_setopt($f, CURLOPT_URL, $url); 
curl_setopt($f, CURLOPT_HEADER, 0); 
curl_setopt($f, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; pl-PL; rv:1.9) Gecko/2008061015 Firefox/3.0)'); 


curl_setopt($f, CURLOPT_RETURNTRANSFER, 1); 

$file = curl_exec($f);
curl_close($f);
echo 'Odwiedzam <a href="http://'.$url.'">'.$url.'</a><br />';
preg_match_all('/[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}/', $file, $znalezione_maile);

if ($znalezione_maile[0][0]!= NULL)
{
for ($indeks=0; $znalezione_maile[0][$indeks] != NULL; $indeks++)
{

$email= $znalezione_maile[0][$indeks];
$zapytanie = "SELECT count(*) FROM  `emaile` WHERE `email` ='$email'";
$wykonaj = mysql_query($zapytanie);
$rezultat = mysql_fetch_array($wykonaj);
if (!$rezultat[0])
{
$zapytanie = "INSERT INTO `emaile` (`id`, `email`) VALUES ('', '$email')";
$wykonaj = mysql_query($zapytanie);
if ($wykonaj)
{
$ile = $ile+1;
echo 'Dodano email: <b>'.$email.'</b>.<br /> Jest to: '.$ile.' email.<br />';
}
else
{
echo 'Blad';
};
};
};
};
};
///////////////////////////////////////////////
echo '<font color="red"><b>!!!ZACZYNAM ZAPISYWAC DO PLIKU!!!</b> </font><br />';


for($id=0; $id <=$podstrony; $id++)
{
$zapytanie= "SELECT `email` FROM `emaile` WHERE `id`='$id'";
$wykonaj = mysql_query($zapytanie);

echo mysql_error();
while ($wiersz= mysql_fetch_row($wykonaj))
{
$dane = $wiersz[0]."\r\n";
$plik = $nazwa;
$uchwyt = fopen($plik, a);
flock($uchwyt, 2);
fwrite($uchwyt, $dane);
flock($uchwyt, 3);
fclose($uchwyt);
};
};
$wykonaj = mysql_query("TRUNCATE TABLE emaile");
//////////////////////////
echo '...uff, no i skonczylem ...<br />';
echo 'Lacznie zebralem '.$ile.' maili :-)<br />';
echo 'Plik txt: <a href="'.$nazwa.'">'.$nazwa.'</a>';


};
?>

Wytłumaczę pokrótce co skrypt robi.
1 linia - taki nagłówek :)
6 - 29 - formularz, w którym podajemy link do forum, typ linku do podstron oraz nazwę pliku tekstowego, w którym będą emaile
35 - 104 - za pomocą curla dana podstrona jest pobierana, ze strony wyciągane są maile(preg_match_all), następnie jeśli dany email nie jest jeszcze w bazie to jest do niej dodawany
195 - 126 - pobieranie z bazy danych i zapis do pliku tekstowego (każdy mail w nowej linii) i wyczyszczenie bazy
128 - 132 - podsumowanie ilości zebranych emaili oraz link do pliku tekstowego

Na końcu chcę dodać, że nie pomagam spamerom, jedynie script kiddies , które i tak nic z tą pokaźną listą emaili nie zrobią.

2 komentarze:

  1. Witam,pierwszy raz spotkałem się z cURLem i mam pytanie,
    czy muszę te pliki wrzucać na serwer?
    czy mogę napisać program?
    Wolał bym napisać program, tylko nie wiem jak się za to zabrać pozdrawiam

    OdpowiedzUsuń
  2. Czy muszę te pliki wrzucać na serwer?
    Najlepiej skrypt uruchamiać na localhoście - w tym celu zainstaluj sobie Xampa, Webserva lub inny tego typu program.

    Czy mogę napisać program?
    Jasne :) Poczytaj o bibliotece cURLa. Z tego co się orientuję to w C++ napiszesz to spokojnie, jednak na razie nie posiadam takiej wiedzy by ci dosadnie pomóc. Poczytaj trochę o tym.

    Pozdrawiam.

    OdpowiedzUsuń