<?
/***************************************************************************
* acepompe.php
* -------------------
* begin : Mardi 14 Aout 2007
* copyright : (C) 2007 korb
* email : lekorbo@free.fr
* version : 0.1 2007/08/18 16:55:19
*
*
***************************************************************************/
/***************************************************************************
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
***************************************************************************/
//--------------------------------
// -- Configuration : A EDITER !
//------------------------------
// Les informations necessaires a l'identification sur le forum
// Pour les recuperer, chercher les cookies suivant dans votre navigateur:
// (apres vous etre idendifie sur votre forum)
// - cookiepseudo_XXXX
// - cookiemdp_XXXX
// - cookiesp_XXXX
// - cookieid_XXXX
$forum_id = "????"; // Contenu du cookie "cookieid_XXXX" (id du forum)
$forum_name = "????"; // Le nom de votre forum XXXXX.aceboard.fr
$forum_user = "????"; // Votre login sur le forum
$forum_mdp = "????"; // Votre mot de passe
$forum_sp = "????"; // Contenu du cookie "cookiesp_XXXX"
// MySql
$sql_base = "????";
$sql_phpBB_prefix = "phpbb_";
// Indique s'il faut ou non recuperer les message en bbcode ou en html
// $getBBCode = NULL ou $getBBCode = 1
$getBBCode = NULL;
// Indique s'il faut afficher les info de debug ou non
// $debug = NULL ou $debug = 1
$debug = NULL;
//--------------------------------
// --/ Configuration
//--------------------------------
//---------------------
// Fonctions
//--------------------
// Envoie une requette http vers un serveur donne en tenant compte des cookies
// Et lit le resultat
function readHTTPFile($url, $cookies)
{
$temp = explode("//", $url);
$temp = explode("/", $temp[1], 2);
$host = $temp[0];
$file = $temp[1];
if (!$fp=fsockopen(gethostbyname($host),80, $errno, $errstr, 15))
return false;
//put together the Authorization Request Header
$out = "GET /$file HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Accept-Language: en-us, en;q=0.50\r\n";
$out .= "Connection: keep-alive\r\n";
$out .= "Referer: http//$host/$file\r\n";
$out .= "Cookie: $cookies\r\n";
$out .= "Cache-control: max-age=0\r\n";
$out .= "\r\n";
if (!$fp=fsockopen($host,80, $errno, $errstr, 15))
return false;
fwrite($fp, $out);
$str="";
//read in a string which is the contents of the required file
while (!feof($fp))
{
$str.=fgets($fp, 4096);
}
fclose($fp);
$str = explode("\r\n\r\n",$str,2);
return $str[1];
}
// Convertir une date au format "JJ/MM/AA HH:MM:SS" vers le format POSIX
function convDate($chaine_date) {
preg_match("#([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*):([0-9]*):([0-9]*)#Us", $chaine_date, $out);
$date = mktime($out[4], $out[5], $out[6], $out[2], $out[1], $out[3]);
return $date;
}
// Affiche une commande + retour ligne
function sqlOut($cmd) {
echo $cmd."\r\n";
}
// Renvoi l'id (unique) d'un utilisateur deja ajoute
function getUserId($user_name) {
global $users_id_by_name;
$user_name = strtolower($user_name);
return $users_id_by_name[$user_name][0];
}
// Stocke l'id affecte par aceboard (pour la recuperation du profil en ligne)
function setUserAceId($user_name, $user_ace_id) {
global $users_id_by_name;
$user_name = strtolower($user_name);
if ($users_id_by_name[$user_name][0] !="") {
$users_id_by_name[$user_name][1] = $user_ace_id;
}
}
// Ajout un utilisateur dans la liste globale des utilisateurs
// Aucun effet si l'utilisateur existe deja
// (utilise pour la generation du sql)
function addUser($user_name) {
global $debug;
global $sql_phpBB_prefix;
static $user_id = 10;
global $users_id_by_name;
if ($user_name == "") return;
$user_name = strtolower($user_name);
// On recupere le user entry dans notre base locale
$user_entry = $users_id_by_name[$user_name];
if ($user_entry[0] =="") {
$user_entry[0] = $user_id;
$user_entry[1] = "";
$users_id_by_name[$user_name] = $user_entry;
if (!$debug)
sqlOut("INSERT INTO `".$sql_phpBB_prefix."users` (`user_id`, `username`, `user_password`) VALUES ('$user_id', '$user_name', MD5('mdp$user_name'));");
$user_id = $user_id + 1;
}
}
// Lecture d'une url en entier
function lireUrl($url) {
/*
$fp = fopen($url, "r");
$ch = "";
$contenu_page = "";
while (($ch = fread($fp,4096)) != "") {
$contenu_page .= $ch;
}
fclose($fp);
*/
global $cookies_auth;
$contenu_page = readHTTPFile($url, $cookies_auth);
return $contenu_page;
}
function lirePageProfil($url_profil) {
global $debug;
global $sql_phpBB_prefix;
// Lecture de la page
$contenu_page = lireUrl($url_profil);
// Pseudo
preg_match("#<td [^>]*>Pseudo</td>\s*<td [^>]*>\s*(\w[^>]*)\s*\[#Usim", $contenu_page, $pseudo);
// Extraction du mail
preg_match("#<a href=\"mailto[^>]*\">(\w[^>]*)</a>#Usim", $contenu_page, $mail);
// Ville
preg_match("#<td [^>]*>Ville</td>\s*<td [^>]*>\s*(\w[^>]*)\s*</td>#Usim", $contenu_page, $ville);
// Avatar
preg_match("#<td [^>]*>Avatar</td>\s*<td [^>]*>\s*<img src=\"*(http://[^>]*)\"*>\s*</td>#Usim", $contenu_page, $avatar);
// Si l'image est heberge localement, il n'y a pas http devant, et on ne recupere rien
// Cela force l'utilisateur a remettre son image pour ne pas faire un lien vers l'ancien forum
// Signature
preg_match("#<td [^>]*>Signature</td>\s*<td [^>]*>\s*(\w[^>]*)\s*</td>#Usim", $contenu_page, $signature);
// Nombre messages postes
preg_match("#<td [^>]*>Messages post.s</td>\s*<td [^>]*>\s*<b>([^>]*)</b>\s*</td>#Usim", $contenu_page, $nb_msg);
// Date d'inscription
preg_match("#<td [^>]*>Date d'arriv.e</td>\s*<td [^>]*>\s*([^>]*)\s*</td>#Usim", $contenu_page, $date_inscr);
preg_match("#^([0-9]*)-([0-9]*)-([0-9]*)$#Us", $date_inscr[1], $out);
$date_inscr[1] = mktime(0, 0, 0, $out[2], $out[1], $out[3]);
if ($debug) {
echo "Pseudo: ".$pseudo[1]."<br>";
echo "Mail: ".$mail[1]."<br>";
echo "Ville: ".$ville[1]."<br>";
echo "Avatar: ".$avatar[1]."<br>";
echo "Signature: ".$signature[1]."<br>";
echo "Nombres de messages: ".$nb_msg[1]."<br>";
echo "Date d'inscriptions: ".$date_inscr[1]."<br>";
} else {
sqlOut("UPDATE `".$sql_phpBB_prefix."users` SET `user_email`='$mail[1]' ,`user_from`='$ville[1]',`user_avatar`='$avatar[1]',`user_sig`='$signature[1]' ,`user_posts`='$nb_msg[1]' ,`user_regdate`='$date_inscr[1]', `user_avatar_type`='2' WHERE `user_id`='".getUserid($pseudo[1])."' LIMIT 1;");
}
}
// Lit l'ensemble des pages profils utilisateurs
// On considere que la table locale des utilisateurs est deja remplie
// (donc que le forum a ete parcouru en entier)
function lireEnsembleProfil () {
global $users_id_by_name;
global $url_forum;
global $forum_id;
global $debug;
$url_base = $url_forum."voirprofil.php?login=".$forum_id."&pseudo=";
foreach ($users_id_by_name as $pseudo => $user_entry) {
if ($pseudo != "") {
$id = $user_entry[0];
$id_ace = $user_entry[1];
if ($debug) {
echo "<b>LienProfil</b><br>";
echo $url_base.$id_ace."<br>";
}
// Lit la page du profil
lirePageProfil($url_base.$id_ace);
}
}
}
// Lit le message en BBcode sur la page d'edition
function lireMessageEditPageBBCode($url_edit_page) {
// Lecture de la page
$contenu_page = lireUrl($url_edit_page);
// Extraction du message
preg_match('#<textarea [^>]*>([^>]*)</textarea>#Usim', $contenu_page,$message);
return $message[1];
}
// Lecture du contenu des message sur une page d'un topic
function lireMessagePage($contenu_page) {
global $url_forum, $getBBCode;
// On coupe selon le haut de la page et le bas et le milieu
$regs = explode("Index du forum</a></b></td>",$contenu_page);
$test_page = explode("<div style=\"text-align:left\" class=\"petit\"><b>Pages :</b>",$regs[1]);
if ($test_page[1] != "")
$regs[1] = $test_page[1];
//echo $test_page[1];
// On decoupe le bloc du milieu selon les plus gros bloc (message pseudo etc..)
$regs = explode("<a id=\"bas\"></a><a id=\"vb\"></a><table ",$regs[1]);
$regs = array_merge(explode("</table><table ",$regs[0]), $regs[1]);
$i = 1;
while ($regs[$i] != "") {
// On extrait le contenu message (BBCode ou html)
//eregi("<div [^>]*>(.*)</div>", $regs[$i],$message);
if (!$getBBCode) {
preg_match('#<div style=\"text-align:left\">(.*)</div>#Usim', $regs[$i],$message);
} else {
// On extrait le lien de la page pour editer
preg_match('#<td class=\"menumessage\"><a href=\"(editmessage.php?[^>]*)"#Usim', $regs[$i],$edit_page);
$url_edit_page = $url_forum.$edit_page[1];
//echo $url_edit_message."<br>";
// On lit le message en BBCode sur la page d'edit
$message[1] = lireMessageEditPageBBCode($url_edit_page);
}
//echo $message[1]."<br>";
// On extrait la date
//eregi("<tr><td [^>]*> <a [^>]*><img [^>]*></a><a [^>]*></a>.nbsp. Post. le (.*)</td><td [^>]*><table [^>]*>",
// $regs[$i],$date);
preg_match("#<tr><td [^>]*> <a [^>]*><img [^>]*></a><a [^>]*></a>.nbsp. Post. le ([^>]*)</td><td [^>]*>#Usim",
$regs[$i],$date);
//echo $date[1]."<br>";
// On extrait le pseudo
//eregi("<td [^>]*><b> (.*)</b><span class=\"petit\"><br />", $regs[$i],$pseudo);
preg_match("#<td [^>]*><b> (.*)</b><span class=\"petit\"><br />#Usim", $regs[$i],$pseudo);
//echo $pseudo[1]."<br>";
// On extrait l'id aceboard du pseudo (pour recuperer le profil si besoin)
preg_match("#<a href=\"voirprofil.php.pseudo=([0-9]*)&[^>]*>#Usim", $regs[$i],$id_ace);
//echo "IDDDD".$id_ace[1]."ID\r\n";
//echo "<br>----------------<br>--------------------<br>";
//echo $regs[$i]."<br>"."<br>----------------<br>--------------------<br>";
// On vire les <br> et <br /> a cause de phpBB qui en rajoute deja
$message[1] = str_replace("<br>", "", $message[1]);
$message[1] = str_replace("<br />", "", $message[1]);
$tmp[0] = $pseudo[1];
$tmp[1] = $message[1];
$tmp[2] = $id_ace[1];
$posts[$date[1]] = $tmp;
$i = $i + 1;
}
return $posts;
}
// Renvoie le lien de la page suivante d'un topic (si elle existe dans le cas d'un topic sur plusieurs pages)
function getPageSuivanteTopic($contenu_page) {
global $url_forum;
//eregi("</a> <a href=\"([^>]*)\" target=\"_parent\">Suiv.</a>", $contenu_page, $lien);
preg_match("#</a> <a href=\"([^>]*)\" target=\"_parent\">Suiv.</a>#Usim", $contenu_page, $lien);
if ($lien[1] != "")
return $url_forum.$lien[1];
else
return "";
}
// Lecture de l'ensemble d'un topic page par page
function lireTopicEntier($url_topic, $forum_id, $topic_id) {
global $debug;
global $sql_phpBB_prefix;
$lien_suiv = $url_topic;
// Compter le nombre de posts
$nb_posts = 0;
static $post_id = 200000;
// Sauvegarde l'id du premier post du topic
$fist_and_last_post[0] = $post_id-1;
// Date du premier topic
$fist_and_last_post[2] = 0;
// Le pseudo proprietaire du topic = pseudo du premier post
// (car aceboard deforme le pseudo du proprio du topic sur la page des topics)
$fist_and_last_post[4] = "";
while ($lien_suiv != "") {
$contenu_page = lireUrl($lien_suiv);
//$users_name = array_merge($users_name,lecturePseudoPage($contenu_page));
$messages = lireMessagePage($contenu_page) ;
if ($debug)
echo "<b>LES MESSAGES:</b><br>";
foreach( $messages as $date => $pseudo_and_msg ) {
//foreach( $pseudo_and_msg as $date => $message ) {
$pseudo = $pseudo_and_msg[0];
$message = $pseudo_and_msg[1];
// Augmenter le post id
$post_id = $post_id - 1;
if ($debug) {
echo "<b>Date:</b> ".$date.
"<br><b>Auteur:</b> ". $pseudo.
"<br><b>Message:</b> ". $message.
"<br> -------------------<br>";
} else {
$date_posix = convDate($date);
// Sauvegarde la date du premier topic
if ($fist_and_last_post[2] == 0)
$fist_and_last_post[2] = $date_posix;
// Sauvegarde le pseudo du premier post
if ($fist_and_last_post[4] == "")
$fist_and_last_post[4] = $pseudo;
// Augmente le nombre de posts
$nb_posts = $nb_posts + 1;
// On genere un ID pour l'utilisateur (si l'utilisateur existe deja, sans effet)
addUser($pseudo);
// On stocke l'ace id de l'utilisateur
setUserAceId($pseudo, $pseudo_and_msg[2]);
sqlOut("INSERT INTO `".$sql_phpBB_prefix."posts` (`post_id`, `topic_id`, `forum_id`, `poster_id`, `post_time`) VALUES ('$post_id', '$topic_id', '$forum_id', '".getUserId($pseudo)."', '$date_posix');");
sqlOut("INSERT INTO `".$sql_phpBB_prefix."posts_text` (`post_id`, `post_text`) VALUES ('$post_id', '$message ');");
}
//}
}
// Lien Page suivante
$lien_suiv = getPageSuivanteTopic($contenu_page);
if ($debug)
echo "<b>Lien page suivante </b><br>".$lien_suiv."<br>";
}
// Sauvegarde l'id du dernier post du topic
$fist_and_last_post[1] = $post_id;
// Renvoie aussi le nombre de posts
$fist_and_last_post[3] = $nb_posts-1;
return $fist_and_last_post;
}
// Renvoie la page suivante (si elle existe) d'une page de liste des titres des topics
function getPageSuivanteCat($contenu_page) {
global $url_forum;
preg_match("#<b>Pages :</b>[^>]*(?:<a [^>]*>*[^>]*</a>[^>]*)*<b>[^>]*</b> <a href=\"([^>]*)\" target=\"_parent\">#Umsi", $contenu_page, $lien);
if ($lien[1] != "")
return $url_forum.$lien[1];
else
return "";
}
// Lit l'ensemble des titres des topics d'une categorie du forum
function lireTitreTopics($url_categorie, $forum_id) {
global $url_forum;
global $debug;
global $sql_phpBB_prefix;
// Compter le nombre de topics dans le sujet
$nb_topics = 0;
$nb_posts_total = 0;
$lien_suiv = $url_categorie;
// Tant qu'on a pas lu tt les pages
static $topic_id = 0;
while ($lien_suiv != "") {
// Lecture de la page
$contenu_page = lireUrl($lien_suiv);
preg_match_all("#</td><td class=\"colonne1\" [^>]*>[^>]*<a href=\"(.*)\" target=\"_parent\">([^>]*)</a></td><td class=\"colonne2\" [^>]*>.*<td class=\"colonne1\" [^>]*><span class=\'petit\'>([^>]*)</span></td>[^>]*<td class=\"colonne2\" [^>]*>([^>]*)</td><td class=\"colonne1\" [^>]*>#Umsi", $contenu_page, $topics, PREG_SET_ORDER);
foreach ($topics as $topic) {
// Url du topic
$url_topic = $url_forum.$topic[1];
// Augmenter l'id topic global
$topic_id = $topic_id + 1;
if ($debug) {
echo "<b>Lien topic:</b> ".$url_topic."<br>";
echo "<b>Titre topic:</b> ".$topic[2]."<br>";
echo "<b>Vues:</b> ".$topic[3]."<br>";
echo "<b>Createur:</b> ".$topic[4]."<br><br>";
}
// On lit le topic en entier, et on recupere le premier et dernier post
$first_and_last_post = lireTopicEntier($url_topic, $forum_id, $topic_id);
// Correction du bug aceboard sur le pseudo du topic
$topic[4] = $first_and_last_post[4];
// On genere un ID pour l'utilisateur (si l'utilisateur existe deja, sans effet)
addUser($topic[4]);
if(!$debug) {
// Augmente le nombre de topics
$nb_topics = $nb_topics + 1;
$nb_posts_total += $first_and_last_post[3] ;
sqlOut("INSERT INTO `".$sql_phpBB_prefix."topics` (`topic_id`, `forum_id`, `topic_title`, `topic_poster`, `topic_views`, `topic_first_post_id`, `topic_last_post_id`, `topic_time`, `topic_replies`) VALUES ('$topic_id', '$forum_id', '$topic[2] ', '".getUserId($topic[4])."', '$topic[3]', '$first_and_last_post[0]', '$first_and_last_post[1]', '$first_and_last_post[2]', '$first_and_last_post[3]');");
}
}
// Lien page suivante (de la cat)
$lien_suiv = getPageSuivanteCat($contenu_page);
if ($debug) {
echo "<b>Lien page suivante de la cat </b><br>".$lien_suiv."<br>";
}
}
$temp[0] = $nb_topics;
$temp[1] = $nb_posts_total;
return $temp;
}
// Lit la page d'index du forum pour en extraire toute les categories et sous categories
function lireIndexForum($url_index) {
global $debug;
global $sql_phpBB_prefix;
// Lecture de la page
$contenu_page = lireUrl($url_index);
// On vire le bas de la page
$regs = explode("<td align=\"left\" class=\"colonne2\" colspan=\"5\"><b>Messages Priv",$contenu_page,2);
// On coupe la page par categorie
$regs = explode("<tr><td colspan=\"5\" style=\"width: 100%\" class=\"colonne2\"><b>",$regs[0]);
$i = 1;
$j = 0; // compteur des forums (id)
// Pour chaque categorie, on va extraire chaque lien de forum
while ($regs[$i] != "") {
//echo $regs[$i]."<br>--------------<br>";
// On extrait le nom de la categorie
preg_match("#^([^>]*)</b></td></tr><tr>#Umsi", $regs[$i], $categorie);
if ($debug) {
echo "<b>Categorie:</b> ".$categorie[1]."<br>";
} else {
sqlOut("INSERT INTO `".$sql_phpBB_prefix."categories` ( `cat_id` , `cat_title` ) VALUES ('$i', '$categorie[1]');");
}
// On extrait l'ensemble des liens vers les forums et le nom des forums
preg_match_all("#<td style=\"width:45%\" class=\"colonne1\">(?:<[^>]*>)*<b><a href=\'([^>]*)\' target=\"_parent\">([^>]*)</a></b><br /><span class=\"petit\">([^><]*)(?:<br /><b><i>[^><]*</i></b>)*</span></td><td#Umsi", $regs[$i], $forums, PREG_SET_ORDER);
foreach ($forums as $forum) {
$url_sous_forum = $url_index.$forum[1];
$j = $j + 1;
if ($debug) {
echo "<b>Lien forum:</b> ".$url_sous_forum."<br>";
echo "<b>Titre forum:</b> ".$forum[2]."<br>";
echo "<b>Description:</b> ".$forum[3]."<br>";
}
$stats = lireTitreTopics($url_sous_forum, $j); // $j = forum_id
if (!$debug) {
sqlOut("INSERT INTO `".$sql_phpBB_prefix."forums` ( `forum_id` , `cat_id` , `forum_name` , `forum_desc`, `forum_topics`, `forum_posts`) VALUES ('$j', '$i', '$forum[2]', '$forum[3]', '$stats[0]', '".($stats[1]+$stats[0])."');");
}
}
if ($debug) {
echo "<br>";
}
$i = $i + 1;
}
}
//---------------------
// Main
//--------------------
// Ajout du temps d'execution
set_time_limit(1360);
// Url forum
$url_forum = "http://".$forum_name.".aceboard.fr/";
// Info d'authentification sur le forum
$cookies_auth = "cookiepseudo_$forum_id=$forum_user;".
"cookiesp_$forum_id=$forum_sp;".
"cookiemdp_$forum_id=$forum_mdp;".
"cookieid_$forum_id=$forum_sp;".
"cookieurl_$forum_name=$forum_id";
// Si on n'est pas en mode debug, on genere le sql sous forme de texte
if (!$debug) {
header("content-type: text");
// Selectionne la base sql
sqlOut("USE $sql_base;");
}
// On demarre le pompage du forum
lireIndexForum($url_forum);
lireEnsembleProfil();
?>