<?
/***************************************************************************
 *                               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$errstr15))
        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$errstr15))
        return 
false;
   
    
fwrite($fp$out);
   
    
$str="";
    
//read in a string which is the contents of the required file
    
while (!feof($fp))
    {
        
$str.=fgets($fp4096);
    }
   
    
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(000$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>&nbsp;(.*)</b><span class=\"petit\"><br />", $regs[$i],$pseudo);
      
preg_match("#<td [^>]*><b>&nbsp;(.*)</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> &nbsp;<a href=\"([^>]*)\" target=\"_parent\">Suiv.</a>", $contenu_page, $lien);
      
preg_match("#</a> &nbsp;<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$topicsPREG_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], $forumsPREG_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();

?>