Vikidia:Achille/sources/wiki.php
< Vikidia:Achille | sources
Aller à la navigation
Aller à la recherche
Version 0.1.5 (c) Ces pages sont données pour consultation. Si vous souhaitez utiliser Achille, téléchargez de préférence les sources au format zip |
<?php /* gestion de Vikidia GPL Thomas Pimmel 2008 */ /*-------------------------------- Fonctions haut-niveau ----------------------------------*/ // connexion function w_Login($username, $password) { require ("includes/adrs.php"); // fichier coockies $coock='users/'.$username.'.vikidia.txt'; file_put_contents ($coock,"\n",LOCK_EX); // démo if ($_SESSION['status']==3) { $_SESSION['ctc']=true; return true; } // commande $username=urlencode($username); $url = $adrs['viki']['api']. '/api.php?action=login&lgname=' . $username . '&lgpassword=' . $password . '&format=php'; $post="wpName=".$username."&wpPassword=".$password."&wpLoginattempt=true"; $ret=w_Curl($url,$coock,$post); // Analyse réponse $ret = unserialize($ret); $result = $ret['login']['result']; if ($result != "Success") { Message ("Erreur lors de la connexion : $result<br>",1); return false; } // succès $_SESSION['ctc']=true; return true; } //déconnexion function w_Logout() { require ("includes/adrs.php"); if (!isset($_SESSION['ctc'])) return false; // démo if ($_SESSION['status']==3) { unset ($_SESSION['ctc']); return true; } $coock='users/'.$_SESSION['user'] . '.vikidia.txt'; $url = $adrs['viki']['api'].'/api.php?action=logout'; w_Curl($url,$coock); unset ($_SESSION['ctc']); return true; } // lecture d'une page function w_GetPage($article,$url=false) { require ("includes/adrs.php"); if (!$url) $url=$adrs['viki']['api']; $article = rawurldecode($article); $article = rawurlencode($article); //$article=str_replace(" ","_",$article); $url = $url . '/api.php?action=query&prop=revisions&titles=' . $article . '&rvprop=content&format=php'; $ret=w_Curl($url); if (!$ret) return false; $recup=unserialize($ret); $recup=$recup['query']; foreach ($recup['pages'] as $retval) { if (isset($retval['revisions'])) { foreach ($retval['revisions'] as $pipo) { return $pipo ["*"]; } } } return false; } // liste des pages selon recherche function w_Search($search,$namespace) { require ("includes/adrs.php"); $limit=100; if ($_SESSION['status']==3) { print ("<i>Démonstration, limitée à 10 pages</i><br />"); $limit=10; } $url=$adrs['viki']['api']; // nom de la page $search=rawurlencode($search); // Récup des modèles $url = $url . '/api.php?action=query&srnamespace='. $namespace . '&list=search&srwhat=text&srsearch="'.$search.'"&srlimit='.$limit.'&format=php'; $getpage = w_Curl($url); $recup=unserialize($getpage); // mise sous forme de liste $n=0; $list=false; while (isset($recup['query']['search'][$n])) { $list[$n]=$recup['query']['search'][$n]['title']; //print ("$list[$n]<br>"); $n++; } if (isset($recup['query-continue'])) message ("Attention, le nombre de réponses excède 100."); return $list; } // liste des pages d'une catégorie function w_GetPagesCat($category,&$continue="",$limit=500,$url=false) { require ("includes/adrs.php"); // nom de la page $category=rawurldecode($category); $category=rawurlencode($category); // Récup des modèles if (!$url) $url = $adrs['viki']['api']; $url=$url . '/api.php?action=query&list=categorymembers&cmtitle=Category:'.$category.'&cmlimit='.$limit.'&format=php'; if ($continue) { $conti=rawurlencode($continue); $url=$url."&cmcontinue=".$conti; } $getpage=w_Curl($url); //print ($getpage); $recup=unserialize($getpage); // mise sous forme de liste $n=0; $list=false; while (isset($recup['query']['categorymembers'][$n])) { $list[$n]=$recup['query']['categorymembers'][$n]['title']; //print ("$list[$n]<br>"); $n++; } if (isset($recup['query-continue']['categorymembers']['cmcontinue'])) $continue=$recup['query-continue']['categorymembers']['cmcontinue']; else $continue=""; return $list; } // chercher une information sur une page function w_GetPageInfo ($page,$nature,$url=false) { require ("includes/adrs.php"); $page=rawurldecode($page); $page=rawurlencode($page); if (!$url) $url=$adrs['viki']['api']; $request = $url . '/api.php?action=query&titles='.$page.'&prop='.$nature.'&format=php'; $result = w_Curl($request); if (!$result) return false; $result=unserialize($result); $pipo=$result['query']['pages']; $pipo = array_shift($pipo); $pipo = array_shift($pipo); $rawlist = $result['query']['pages'][$pipo][$nature]; if ($nature=='extlinks') $idx='*'; else $idx='title'; // mise sous forme de liste $n=0; unset ($list); while (isset($rawlist[$n])) { $list[$n]=$rawlist[$n][$idx]; //print ("$list[$n]<br>"); $n++; } return $list; } // chercher si existe function w_GetExist($page,$url=false) { require ("includes/adrs.php"); //print ("Test $page<br>"); $page=rawurldecode($page); $page=rawurlencode($page); if (!$url) $url=$adrs['viki']['api']; $request = $url . '/api.php?action=query&titles='.$page; $result = w_Curl($request); if (!$result) return false; $missing=strpos($result,'missing'); if (!is_int($missing)) return true; else return false; } // parser une variable function w_Parse($text) { require ("includes/adrs.php"); $text=rawurlencode($text); //$coock='users/'.$_SESSION['user'] . '.vikidia.txt'; $url=$adrs['viki']['api']. "/api.php?action=parse&text=" . $text . "&format=php&prop=text"; $response=w_Curl($url); if (!$response) return false; $response=unserialize($response); $response=$response['parse']['text']['*']; $response=str_ireplace("src=\"/images/","src=\"".$adrs['viki']['idx']."/images/",$response); return $response; } // chercher tous les fichiers function w_GetAllFiles(&$from,$limit,$namespace) { require ("includes/adrs.php"); if ($_SESSION['status']==3 && $limit>10) { print ("<i>Démonstration, limitée à 10 pages</i><br />"); $limit=10; } $from=rawurlencode($from); $url = $adrs['viki']['api']. '/api.php?action=query&list=allpages&apnamespace='.$namespace .'&apfrom='. $from . '&aplimit='.$limit.'&format=php'; $page = w_Curl($url); if (!$page) return false; $page=unserialize($page); // mise sous forme de liste $n=0; $list=false; while (isset($page['query']['allpages'][$n])) { $list[$n]=$page['query']['allpages'][$n]['title']; //print ("$list[$n]<br>"); $n++; } $from=false; if (isset($page['query-continue']['allpages']['apfrom'])) $from=$page['query-continue']['allpages']['apfrom']; return $list; } // Chercher modifs récentes function w_GetRC ($what,$stamp) { require ("includes/adrs.php"); $limit=500; if ($_SESSION['status']==3) { print ("<i>Démonstration, limitée à 10 pages</i><br />"); $limit=10; } switch ($what) { case "nouvelles images": $addurl='&rctype=log&rcnamespace=6&rcprop=title'; break; case "nouveaux articles": $addurl='&rctype=new&rcnamespace=0&rcprop=title'; break; case "articles édités": $addurl='&rctype=edit&rcnamespace=0&rcprop=title'; break; default: return false; } $request=$adrs['viki']['api'] . '/api.php?action=query&list=recentchanges&format=php'.$addurl.'&rclimit='.$limit.'&rcend='.$stamp; $result = w_Curl($request); if (!$result) return false; $result=unserialize($result); if (!$result['query']['recentchanges']) return 0; return $result['query']['recentchanges']; } // lire sa page de discussion function w_ReadMail($parse=false,$prefix="Discussion_Utilisateur:",$post="",$user="") { if ($_SESSION['status']==3) { if ($parse) message ("Fonction désactivée"); return ("<i>Mode démonstration</i>"); } require ("includes/adrs.php"); $coock='users/'.$_SESSION['user'] . '.vikidia.txt'; if (!$user) { $user=str_replace(" ", "_", $_SESSION['user']); $user=rawurlencode($user); } if (!$parse) $url = $adrs['viki']['idx'] . '/index.php/' . $prefix . $user . $post; else $url=$adrs['viki']['api']. "/api.php?action=parse&page=" . $prefix . $user. $post . "&format=php&prop=text"; $response=w_Curl($url,$coock); if ($response && $parse) { $recup=unserialize($response); $response=$recup['parse']['text']['*']; $response=str_ireplace("src=\"/images/","src=\"".$adrs['viki']['idx']."/images/",$response); } return $response; } // ajouter à une page une section function w_AddToPage($page,$editsum,$newtext,$minor,$botedit) { if ($_SESSION['status']==3) { print ("<i>Simulation d'écriture $page</i><br />"); return true; } require ("includes/adrs.php"); $coock='users/'.$_SESSION['user'] . '.vikidia.txt'; $page=rawurlencode($page); $url = $adrs['viki']['idx'] . '/index.php?action=edit§ion=new&title=' . $page; $response=w_Curl($url,$coock); $newsection=w_Value($response,"wpSection"); $starttime=w_Value($response,"wpStarttime"); $edittime=w_Value($response,"wpEdittime"); $autosum=w_Value($response,"wpAutoSummary"); $token=w_Value($response,"wpEditToken"); //echo $response; // test nouveaux messages $usernospace=str_replace(" ", "_", $_SESSION['user']); $match='<a href="/index.php?title=Discussion_Utilisateur:' . $usernospace . '&redirect=no" title="Discussion Utilisateur:' .$_SESSION['user'] . '">nouveaux messages</a>'; if (strpos($response,$match)) { message ("Le robot a reçu du courrier. Arrêt !",1); $retour=w_OwnMsg("Arrêt (message reçu)"); $_SESSION['log']['result']="Arrêt (message reçu)"; return false; } //return true; // DEBUG !!!! $url = $adrs['viki']['idx']. "/index.php?title=" . $page . "&action=submit". "&bot=$botedit"; $postData['wpScrolltop'] = ''; $postData['wpSection']=$newsection; $postData['wpEditToken']=$token; $postData['wpAutoSummary']=$autosum; $postData['wpSummary']=$editsum; $postData['wpTextbox1']=$newtext; $postData['wpSave']="Save page"; $postData['wpStarttime']=$starttime; $postData['wpEdittime']=$edittime; if ($minor) $postData['wpMinoredit']=$minor; $return=w_Curl($url,$coock,$postData); if (!$return) { sleep(EDIT_DELAY); return true; } else { print ("$return<br>"); return false; } } // ajouter une section function w_OwnMsg($nature) { require ("includes/adrs.php"); $coock='users/'.$_SESSION['user'] . '.vikidia.txt'; $page = rawurlencode("Discussion_Utilisateur:".$_SESSION['user']); w_ReadMail(); //pour enlever message reçu ! $url = $adrs['viki']['idx']. '/index.php?action=edit§ion=new&title=' . $page; $response=w_Curl($url,$coock); $newsection=w_Value($response,"wpSection"); $starttime=w_Value($response,"wpStarttime"); $edittime=w_Value($response,"wpEdittime"); $autosum=w_Value($response,"wpAutoSummary"); $token=w_Value($response,"wpEditToken"); $url = $adrs['viki']['idx'] . '/index.php?title=' . $page . '&action=submit'. "&bot=1"; $postData['wpScrolltop']=''; $postData['wpSection']=$newsection; $postData['wpEditToken']=$token; $postData['wpAutoSummary']=$autosum; $postData['wpSummary']=''; $postData['wpTextbox1']=":$nature. ~~~~"; $postData['wpSave']="Save page"; $postData['wpStarttime'] = $starttime; $postData['wpEdittime'] = $edittime; $return=w_Curl($url,$coock,$postData); if (!$return) { return true; } else { print ("$return<br>"); return false; } } // écrire une page function w_PutPage($page,$editsum,$newtext,$minor,$botedit) { if ($_SESSION['status']==3) { print ("<i>Simulation d'écriture $page</i><br />"); return true; } require ("includes/adrs.php"); $coock='users/'.$_SESSION['user'] . '.vikidia.txt'; $page = urlencode($page); $url = $adrs['viki']['idx'] . '/index.php?action=edit&title=' . $page; $response=w_Curl($url,$coock); $starttime=w_Value($response,"wpStarttime"); $edittime=w_Value($response,"wpEdittime"); $autosum=w_Value($response,"wpAutoSummary"); $token=w_Value($response,"wpEditToken"); // test nouveaux messages $usernospace=str_replace(" ", "_", $_SESSION['user']); $match='<a href="/index.php?title=Discussion_Utilisateur:' . $usernospace . '&redirect=no" title="Discussion Utilisateur:'.$_SESSION['user'] . '">nouveaux messages</a>'; //print ($match); if (strpos($response,$match)) { message ("Le robot a reçu du courrier. Arrêt !",1); $retour=w_OwnMsg("Arrêt (message reçu)"); $_SESSION['log']['result']="Arrêt (message reçu)"; return false; } $url = $adrs['viki']['idx'] . '/index.php?title=' . $page . '&action=submit' . "&bot=$botedit"; $postData['wpScrolltop']=''; $postData['wpSection']=''; $postData['wpEditToken']=$token; $postData['wpAutoSummary']=$autosum; $postData['wpSummary']=$editsum; $postData['wpTextbox1']=$newtext; $postData['wpSave']="Save page"; $postData['wpStarttime']=$starttime; $postData['wpEdittime']=$edittime; if ($minor) $postData['wpMinoredit']=$minor; $return=w_Curl($url,$coock,$postData); if (!$return) { sleep(EDIT_DELAY); return true; } else { print ("$return<br>"); return false; } } // écrire une page function wiki_PutImage($imagefile,$imagename,$imagedesc,$minor,$botedit) { if ($_SESSION['status']==3) { print ("<i>Simulation d'écriture $imagename</i><br />"); return true; } require ("includes/adrs.php"); $coock='users/'.$_SESSION['user'] . '.vikidia.txt'; $url=$adrs['viki']['idx'] . '/index.php?title=Special:T%C3%A9l%C3%A9chargement&action=submit'."&bot=$botedit"; $postData['wpUploadFile']='@'.$imagefile; //print ("$imagename--<br>"); $postData['wpDestFile']=$imagename; $postData['wpUploadDescription']=$imagedesc; $postData['wpIgnoreWarning']=true; $postData['wpUpload']="Upload file"; if ($minor != null) { $postData['wpMinoredit'] = $minor; } $return=w_Curl($url,$coock,$postData); if (!$return) { //sleep(EDIT_DELAY); return true; } else { print ("$return<br>"); return false; } } /*-------------------------------- Fonctions bas-niveau ----------------------------------*/ // usage de curl function w_Curl ($url, $coock=false, $post=false) { global $proxyaddr; //print ("<b>$url</b></br>"); // init et exécution $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($proxyaddr) curl_setopt($ch, CURLOPT_PROXY, $proxyaddr); if ($post) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } if ($coock) { curl_setopt ($ch, CURLOPT_COOKIEJAR, $coock); curl_setopt ($ch, CURLOPT_COOKIEFILE, $coock); } $response = curl_exec($ch); // traitement réponse if(curl_errno($ch)) { $err=curl_error($ch); Message ("Erreur : $err<br>",1); $_SESSION['log']['result']="Erreur : $err"; $response=false; } curl_close($ch); return $response; } // recherche d'une valeur dans une page html function w_Value($page,$variable) { // recherche partie formulaires $idx=strpos($page,"<form"); if (!is_int($idx)) return false; // non-trouvé // recherche de la variable $var=strpos($page,$variable,$idx); if (!is_int($var)) return false; // non-trouvé // recherche du début $deb=$idx; while (is_int($deb) && $deb<$var) { $start=$deb++; $deb=strpos($page,"<input",$deb); } // recherche de la valeur $value=strpos($page,"value=",$start); if (!is_int($value)) return false; $value=$value+6; $ns=$page[$value++]; // guillemet début $valend=strpos($page,$ns,$value); // on trouve la fin $found=substr($page,$value,$valend-$value); //print ("Found : $found<br>"); return $found; } ?>