345 lines
14 KiB
PHP
345 lines
14 KiB
PHP
#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini
|
|
<?php
|
|
include_once(FWK_PATH.'common/chiffres.php');
|
|
include_once(FWK_PATH.'common/dates.php');
|
|
include_once(INCLUDE_PATH.'bodacc/classMBodacc.php');
|
|
include_once(INCLUDE_PATH.'insee/classMInsee.php');
|
|
include_once(INCLUDE_PATH.'partenaires/classMBourse.php');
|
|
include_once(FWK_PATH.'mail/sendMail.php');
|
|
|
|
$tabReg=array( 'Aquitaine',
|
|
'Alsace',
|
|
'Auvergne',
|
|
'Basse-Normandie',
|
|
'Bourgogne',
|
|
'Bretagne',
|
|
'Centre',
|
|
'Champagne-Ardenne',
|
|
'Corse',
|
|
'Franche-Comté',
|
|
'Haute-Normandie',
|
|
'Île-de-France',
|
|
'Languedoc-Roussillon',
|
|
'Limousin',
|
|
'Lorraine',
|
|
'Midi Pyrénées',
|
|
'Nord-Pas-de-Calais',
|
|
'Outre-Mer',
|
|
'Pays-de-la-Loire',
|
|
'Picardie',
|
|
'Poitou-Charentes',
|
|
'Provence-Alpes-Côte-d\'Azur',
|
|
'Rhône-Alpes',
|
|
'Etranger');
|
|
|
|
function getNextDate($dateCour, $nbJours=7) {
|
|
$nextDate=date('Ymd', mktime(0, 0, 0, WDate::dateT('Ymd','m', $dateCour), WDate::dateT('Ymd','d', $dateCour)+$nbJours, WDate::dateT('Ymd','Y', $dateCour)));
|
|
return $nextDate;
|
|
}
|
|
|
|
$repPdf='/home/data/infosreg/djo_infos_fi/'; // Avec slash final SVP !!!
|
|
|
|
echo date('Y/m/d - H:i:s') .' - DEBUT du script'. EOL;
|
|
flush();
|
|
|
|
|
|
function getInfosAnnonce($annonceHtml) {
|
|
$tabRet=array();
|
|
$tabRet['raisonSociale']=trim(str_replace(chr(160),' ',html_entity_decode(@getTextInHtml($annonceHtml,'<dd><label>Société : </label><strong>', '<strong>', '</strong></dd>'))));
|
|
$tabRet['isin']=strtoupper(trim(strtr(@getTextInHtml($annonceHtml, '<dd><label>ISIN : </label>', '</label>', '</dd>'), array(':'=>'',' '=>''))));
|
|
$tabRet['docDesc']=trim(@getTextInHtml($annonceHtml, '<div class="r_desc">', 'class="r_desc">', '</div>'));
|
|
$tabRet['docDate']=WDate::DateT('d/m/Y','Y-m-d', trim(@getTextInHtml($annonceHtml, '<span class="date">', 'class="date">', '</span>'))).' '.trim(@getTextInHtml($annonceHtml, '<span class="heure">', 'class="heure">', '</span>')).':00';
|
|
$tabRet['docCategorie']=utf8_decode(strip_tags('<a href="'.trim(str_replace(chr(160), ' ', html_entity_decode(@getTextInHtml($annonceHtml, '<div class="resultat_HitGroup">', '<a href="', '</div>'))))));
|
|
$tabRet['docTitre']=utf8_decode(trim(str_replace(chr(160),' ',html_entity_decode(@getTextInHtml($annonceHtml, '<dd><label>Titre du document : </label>', '"> ', '</a></dd>')))));
|
|
$tabRet['docLangue']=trim(@getTextInHtml($annonceHtml, '<dd><label>Langue : </label>', '</label>', '</dd>'));
|
|
$tabRet['pdfLink']=str_replace('https://', 'http://', str_replace(chr(160), ' ', html_entity_decode(@getTextInHtml($annonceHtml, '<a href="http://www.info-financiere.fr/', 'href="', '">'))));
|
|
|
|
return $tabRet;
|
|
}
|
|
|
|
$tempsMinEntreRequetes=5;
|
|
$tempsMaxEntreRequetes=30;
|
|
set_time_limit(0);
|
|
$lastJO=$dateDebut=$dateFin=$dateF=$dateCour=false;
|
|
$iDb=new WDB();
|
|
$iInsee=new MInsee();
|
|
$iBourse=new MBourse();
|
|
|
|
$strInfoProg='Usage : '.basename($argv[0]). " [OPTION]
|
|
Recupère les dernières annonces BOAMP sur le site de la DJO.
|
|
|
|
Sans aucun paramètre, récupération des dernières Annonces.
|
|
Sinon:
|
|
-d:JJ/MM/AAAA Date de début de publication
|
|
-f:JJ/MM/AAAA Date de fin de publication
|
|
-l Dernières parutions uniquement (*)
|
|
-n:X Intervalle MIN en secondes entre les requêtes sur le site des JO (défaut=$tempsMinEntreRequetes)
|
|
-i:X \" MAX \" \" \" \" \" \" \" \" \" \" (défaut=$tempsMaxEntreRequetes)
|
|
";
|
|
|
|
$argv=$_SERVER['argv'];
|
|
if ($_SERVER['argc']==1) $lastJO=true;
|
|
else {
|
|
for ($i=1; isset($argv[$i]); $i++) {
|
|
if (substr($argv[$i],0,1)=='-') {
|
|
switch (substr($argv[$i],1,1)) {
|
|
case 'd':
|
|
$dateDebut=substr($argv[$i],3,10);
|
|
$dateDeb=WDate::dateT('d/m/Y', 'Ymd', $dateDebut);
|
|
$lastJO=false;
|
|
break;
|
|
case 'f':
|
|
$dateFin=substr($argv[$i],3,10);
|
|
$dateF=WDate::dateT('d/m/Y', 'Ymd', $dateFin);
|
|
$lastJO=false;
|
|
break;
|
|
case 'n':
|
|
$tempsMinEntreRequetes=trim(substr($argv[$i],3))*1;
|
|
if ($tempsMinEntreRequetes<0) $tempsMinEntreRequetes=0;
|
|
break;
|
|
case 'i':
|
|
$tempsMaxEntreRequetes=trim(substr($argv[$i],3))*1;
|
|
if ($tempsMaxEntreRequetes<5) $tempsMaxEntreRequetes=2;
|
|
break;
|
|
case 'l':
|
|
$lastJO=true;
|
|
break;
|
|
case '-':
|
|
die($strInfoProg);
|
|
break;
|
|
default: die('Option '. $argv[$i] . " inconnue !\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($lastJO) {
|
|
// Voir pour callibrer correctement les dates
|
|
$dateDeb=getNextDate(date('Ymd'), -4);
|
|
$dateF =getNextDate(date('Ymd'), 0);
|
|
} else {
|
|
if ($dateFin==false) {
|
|
$dateFin=date('d/m/Y');
|
|
$dateF=WDate::dateT('d/m/Y', 'Ymd', $dateFin);
|
|
}
|
|
if ($dateDebut==false)
|
|
die($strInfoProg);
|
|
}
|
|
$dateCour=$dateDeb;
|
|
|
|
echo date('Y/m/d - H:i:s') ." - DEBUT du la récupération des BOAMP du $dateDebut au $dateFin...".EOL;
|
|
echo date('Y/m/d - H:i:s') ." - La durée maximum entre chaque requête est de $tempsMaxEntreRequetes secondes.". EOL;
|
|
flush();
|
|
|
|
while ($dateCour<=$dateF/* || $lastJO*/) { // Boucle sur les dates
|
|
|
|
$dateDebut = WDate::dateT('Ymd', 'd/m/Y', $dateCour);
|
|
$dateFrom = str_replace('/','%2F', $dateDebut);
|
|
$dateFin = WDate::dateT('Ymd', 'd/m/Y', getNextDate($dateCour,1));
|
|
$dateTo = str_replace('/','%2F', $dateFin);
|
|
|
|
echo date('Y/m/d - H:i:s') ." - Traitement des annonces d'informations financières du $dateDebut au $dateFin...".EOL;
|
|
|
|
$userAgent='Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';
|
|
|
|
/** Cookie de session **
|
|
$url='http://www.boamp.fr/index.php?action=afficherFormRechAvancee';
|
|
$referer='';
|
|
$page=getUrl($url, '', '', $referer, false);
|
|
$body=$page['body'];
|
|
$cookie=@$page['header']['Set-Cookie'];
|
|
$referer=$url;
|
|
echo date('Y/m/d - H:i:s') .' - Cookie = "'. trim($cookie) .'"' . EOL;
|
|
*/
|
|
foreach ($tabReg as $region) {
|
|
$tabPost=array( 'action'=>'rechercher',
|
|
'type_recherche'=>'March%E9s+en+cours',
|
|
'dep'=>'',
|
|
'mots'=>'',
|
|
'ref_ann'=>'',
|
|
'seuil%5B%5D'=>'',
|
|
'date_pub_min='=>str_replace('/20','/', $dateFrom),
|
|
'date_pub_max='=>str_replace('/20','/', $dateTo),
|
|
'date_reponse_min'=>'jj%2Fmm%2Faa',
|
|
'date_reponse_max'=>'jj%2Fmm%2Faa',
|
|
'dep%5B%5D'=>urlencode($region),
|
|
);
|
|
$strPost=implode('&', $tabPost);
|
|
exec('wget --save-cookies cookies.txt http://www.boamp.fr/index.php?action=afficherFormRechAvancee');
|
|
|
|
exec('wget --load-cookies cookies.txt --append-output=/tmp/wget2.log --keep-session-cookies --save-headers --output-document=/tmp/wget2.htm --post-data \''.$strPost.'\' "http://www.boamp.fr/index.php"');
|
|
$str=file_get_contents('/tmp/wget2.htm');
|
|
die($str);
|
|
|
|
//print_r($tabPost);
|
|
//die();
|
|
|
|
// $cookie=str_replace('; path=/', 'xtvrn=$397545$', $cookie);
|
|
// Cookie[PHPSESSID=f64cf6d8cebcf0cf4a55a176b61dba3d; xtvrn=$397545$]
|
|
|
|
$url="http://www.boamp.fr/index.php";
|
|
$page=getUrl($url, '',/*$cookie, */$tabPost, $referer);
|
|
$body=$page['body'];
|
|
print_r($page);
|
|
die();
|
|
}
|
|
|
|
die();
|
|
|
|
if (preg_match('/<div class="nb_resultats">(?:.*)\:(.*)<\/div>/Uim', $body, $matches))
|
|
$nbAnnonces=trim($matches[1]);
|
|
else
|
|
die('Erreur : Aucun résultat trouvé'.EOL);
|
|
$nbPages=round($nbAnnonces/10);
|
|
echo date('Y/m/d - H:i:s') . " - Nombre du publication du $dateDebut au $dateFin : $nbAnnonces soit $nbPages page(s)...". EOL;
|
|
if ($nbPages>100) {
|
|
echo date('Y/m/d - H:i:s') . " - ERREUR : Arrêt du traitement car il y a plus de 100 pages d'annonces !". EOL;
|
|
die();
|
|
}
|
|
|
|
if ($nbAnnonces>0) {
|
|
if (preg_match('/ href="search\.php\?action=changepage&c=(.*)&page=/mUis', $body, $matches)) {
|
|
$c=$matches[1];
|
|
echo date('Y/m/d - H:i:s') . " - Identifiant Sesssion = $c". EOL;
|
|
}
|
|
elseif ($nbAnnonces<=10)
|
|
// - de 10 annonces, pas de multipage
|
|
$c='...';
|
|
else {
|
|
print_r($page);
|
|
die('Erreur : Aucun numéro de session trouvé'.EOL);
|
|
}
|
|
|
|
$dateDb=WDate::DateT('Ymd','Y-m-d',$dateCour);
|
|
$AnnDb=$iDb->select('balo_ireg', 'count(*) AS nb', "docDate BETWEEN '$dateDb 00:00:00' AND '$dateDb 23:59:59'", false, MYSQL_ASSOC);
|
|
$nbAnnDb=$AnnDb[0]['nb'];
|
|
if ($nbAnnDb>=$nbAnnonces) {
|
|
echo date('Y/m/d - H:i:s') ." - Les $nbAnnonces annonces DJO infos financières du $dateDebut ($dateDb) sont en base ($nbAnnDb) !". EOL;
|
|
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
|
|
$dateCour=getNextDate($dateCour,1);
|
|
continue;
|
|
}
|
|
elseif ($nbAnnDb>0 && $nbAnnDb<$nbAnnonces) {
|
|
$message=date('Y/m/d - H:i:s') ." - ATTENTION : Il n'y a que $nbAnnDb annonce(s) DJO infos financières en base sur les $nbAnnonces annonces présentes au JO du $dateDebut !". EOL;
|
|
echo $message;
|
|
/*
|
|
mail('ylenaour@scores-decisions.com', 'JO Association', $message);
|
|
mail('lenaoury@gmail.com', 'JO Association', $message);
|
|
*/
|
|
echo date('Y/m/d - H:i:s') .' - Tentative de récupération des annonces...'. EOL;
|
|
}
|
|
else
|
|
echo date('Y/m/d - H:i:s') ." - Il y a $nbAnnDb annonce(s) DJO infos financières en base sur les $nbAnnonces annonces présentes au JO du $dateDebut !". EOL;
|
|
|
|
$tabAnnonces=explode('<div class="r_title">', $page['body']);
|
|
|
|
for ($j=1; $j<11 && isset($tabAnnonces[$j]); $j++)
|
|
$tabAnnBalo[($j-1)]=$tabAnnonces[$j];
|
|
|
|
if ($nbPages>=2)
|
|
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
|
|
|
|
/** Traitement des pages suivantes
|
|
**/
|
|
for ($i=2; $i<=$nbPages; $i++)
|
|
{
|
|
$url='http://www.info-financiere.fr/search.php?action=changepage&c='. $c .'&page='.$i;
|
|
$page=getUrl($url, $cookie, '', $referer);
|
|
$referer=$url;
|
|
|
|
$tabAnnonces=explode('<div class="r_title">', $page['body']);
|
|
|
|
for ($j=1; $j<11; $j++) {
|
|
$k=10*($i-1)+($j-1);
|
|
if ($k<$nbAnnonces)
|
|
$tabAnnBalo[$k]=$tabAnnonces[$j];
|
|
}
|
|
if ($i==2)
|
|
echo date('Y/m/d - H:i:s') ." - Page $i/$nbPages";
|
|
else
|
|
echo ", $i/$nbPages";
|
|
if ($i==$nbPages)
|
|
echo '.'.EOL;
|
|
else
|
|
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
|
|
}
|
|
|
|
/** On parse les annonces et on les stocks **/
|
|
for ($i=0; $i<$nbAnnonces; $i++){
|
|
$infoAnnBalo=getInfosAnnonce($tabAnnBalo[$i]);
|
|
$i2=$i+1;
|
|
|
|
$AnnDb=$iDb->select('balo_ireg', 'count(*) AS nb', "isin='".$infoAnnBalo['isin']."' AND docDate='".$infoAnnBalo['docDate']."' AND docLangue='".$infoAnnBalo['docLangue']."' AND pdfLink='".$infoAnnBalo['pdfLink']."'", false, MYSQL_ASSOC);
|
|
$nbAnnDb=$AnnDb[0]['nb'];
|
|
|
|
$tabPdf=getPdfInfo($repPdf.basename($infoAnnBalo['pdfLink']));
|
|
if (!$tabPdf) {
|
|
$page=getUrl($infoAnnBalo['pdfLink'], '', '', '', false);
|
|
@mkdir($repPdf);
|
|
$fp=@fopen($repPdf.basename($infoAnnBalo['pdfLink']), 'w');
|
|
if (!fwrite($fp, $page['body']) || !$fp) {
|
|
print_r($infoAnnBalo);
|
|
echo date('Y/m/d - H:i:s') .' - ERREUR : Problème de création du PDF '. basename($infoAnnBalo['pdfLink']) ." pour la parution du $dateAff, annonce n°$i2/$nbAnnonces, Isin = ". $infoAnnBalo['isin']." : \"". $infoAnnBalo['raisonSociale'] .'" !'.EOL;
|
|
}
|
|
@fclose($fp);
|
|
$tabPdf=getPdfInfo($repPdf.basename($infoAnnBalo['pdfLink']));
|
|
|
|
randsleep($tempsMinEntreRequetes, $tempsMaxEntreRequetes);
|
|
}
|
|
$infoAnnBalo['pdfSize'] = $tabPdf['pdfSize'];
|
|
$infoAnnBalo['pdfVer'] = $tabPdf['version'];
|
|
$infoAnnBalo['pdfPage'] = $tabPdf['nbPages'];
|
|
// Infos de debug
|
|
$infoAnnBalo['sitePage']= round($i2/10);
|
|
$infoAnnBalo['siteId'] = $i2;
|
|
if (strlen($infoAnnBalo['isin'])==12)
|
|
$infoAnnBalo['siren'] = @$iBourse->getCodeSiren($infoAnnBalo['isin']);
|
|
elseif (strlen($infoAnnBalo['isin'])==11) {
|
|
for($iIsin=0;$iIsin<10;$iIsin++) {
|
|
$siren=@$iBourse->getCodeSiren($infoAnnBalo['isin'].$iIsin);
|
|
if ($siren>0) {
|
|
$infoAnnBalo['siren'] = $siren;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$dateAff=WDate::dateT('Y-m-d H:i:s', 'd/m/Y', $infoAnnBalo['docDate']);
|
|
|
|
if ($nbAnnDb==1) {
|
|
echo date('Y/m/d - H:i:s') ." - Parution du $dateAff, annonce n°$i2/$nbAnnonces, ". $infoAnnBalo['isin']."/".$infoAnnBalo['siren']." : \"". $infoAnnBalo['raisonSociale'] .'" déjà en base ('.$infoAnnBalo['docLangue'].') !'.EOL;
|
|
// L'annonce est déjà en base !
|
|
continue;
|
|
} else
|
|
echo date('Y/m/d - H:i:s') ." - Parution du $dateAff, annonce n°$i2/$nbAnnonces, ". $infoAnnBalo['isin']."/".$infoAnnBalo['siren']." : \"". $infoAnnBalo['raisonSociale'] .'"... enregistrement ('.$infoAnnBalo['docLangue'].') !'.EOL;
|
|
|
|
if (!$iDb->insert('balo_ireg', $infoAnnBalo) && mysql_error()<>1062)
|
|
echo date ('Y/m/d - H:i:s') .' - ERREUR : MySql n°'. mysql_errno() .') : '. mysql_error() . EOL;
|
|
|
|
}
|
|
}
|
|
|
|
$dateCour=getNextDate($dateCour,1);
|
|
}
|
|
echo date('Y/m/d - H:i:s') .' - FIN du script'. EOL;
|
|
die();
|
|
|
|
|
|
/** Téléchargement du dernier balo complet en PDF
|
|
**/
|
|
$url = 'http://www.journal-officiel.gouv.fr/balo/'.sprintf("%03d", $numParution).'_monte_final.PDF';
|
|
if (!file_exists($repBaloComp.$anneeParution.'_'.sprintf("%03d", $numParution).'_monte_final.PDF')) {
|
|
randsleep();
|
|
$page=getUrl($url, '', '', 'http://www.journal-officiel.gouv.fr/balo/', false, 'www.journal-officiel.gouv.fr');
|
|
@mkdir($repBaloComp.$anneeParution);
|
|
$fp=@fopen($repBaloComp.$anneeParution.'/'.$anneeParution.'_'.sprintf("%03d", $numParution).'_monte_final.PDF', 'w');
|
|
if (!fwrite($fp, $page['body']) || !$fp)
|
|
echo date('Y/m/d - H:i:s') .' - ERREUR : Problème de création du PDF '. $anneeParution.'_'.sprintf("%03d", $numParution).'_monte_final.PDF' .' du balo complet !' . EOL;
|
|
@fclose($fp);
|
|
echo date("Y/m/d - H:i:s") . ' - BALO complet n° '.sprintf("%03d", $numParution).'_monte_final.PDF téléchargé.'.EOL;
|
|
} else
|
|
echo date("Y/m/d - H:i:s") . ' - BALO complet n° '.sprintf("%03d", $numParution).'_monte_final.PDF déjà téléchargé.'.EOL;
|
|
|
|
echo date('Y/m/d - H:i:s') .' - FIN du script'. EOL;
|
|
|
|
?>
|