319 lines
14 KiB
PHP
319 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');
|
|
|
|
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 !!!
|
|
$strObjet="Mise à jour des informations financières";
|
|
|
|
function getInfosAnnonce($annonceHtml) {
|
|
$tabRet=array();
|
|
$tabRet['raisonSociale']=trim(str_replace(chr(160),' ',html_entity_decode(@getTextInHtml($annonceHtml,'<dt class="listingInfo">Société :</dt><dd class="listingInfo">', '<strong>', '</strong>'))));
|
|
$tabRet['isin']=strtoupper(trim(strtr(@getTextInHtml($annonceHtml, '<dt class="listingInfo">ISIN :</dt>', '<dd class="listingInfo">', '</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']=trim(utf8_decode(strip_tags(trim(str_replace(chr(160), ' ', html_entity_decode(@getTextInHtml($annonceHtml, '<dt class="listingInfo">Type d\'information :</dt>', '</dt>','</dd>')))).'</dd>')));
|
|
/*<dd class="listingInfo">
|
|
<!---Pour les types d'informations -->
|
|
<a href="search.php?c=eJxlzc1Og0AUBeD7KCxcuRmGpsayG9uQVKCNUrFdNXS4qC3Mv1j6ND6LT9aRhRtX5!TLSY4GLo2SpnJInEGMN1IFAVstgv9OWNfsM9lvBoVL0Ujy8z0uq8ahiSeU0JBEIQ1HPGAjDcahVzoqtIACBLA8AfUuBboPDl6x6yqflVJGnn2xUPtTsL9okQMFyzsQ2KOB!q*dfFnUgI*DZc7v!!KtXWfF!VXnx9VQfEbli3ZF9pxe7G3JZsup3p0UitP0YWvap8U20bsyrY!Hu3xdRiyZpUlu93AFpW1Ung__&cref=cAmf_LovTypeInfo/11326321999005412800&action=refine&descip=Uniquement les résultats de '002004'&tri=" title="Sélectionner uniquement 'Modalités de mise à disposition de l'information financière trimestrielle'">Communiqués de mise à disposition de documents / Modalités de mise à disposition de l'information financière trimestrielle</a>
|
|
</dd>*/
|
|
$tabRet['docTitre']=utf8_decode(strip_tags(trim(str_replace(chr(160),' ',html_entity_decode(@getTextInHtml($annonceHtml, '<dt class="listingInfo">Titre du document : </dt>', '</dt><dd class="listingInfo">', '</dd>'))))));
|
|
//<dt class="listingInfo">Titre du document : </dt><dd class="listingInfo"><a href="http://logc20.xiti.com/go.click?xts=397225&s2=4&p=BWR/2010/10/FCBWR062778_20101029.pdf&clic=T&type=click&url=http://www.info-financiere.fr/upload/BWR/2010/10/FCBWR062778_20101029.pdf" target="_blank" title="Télécharger le document 'Cliffs Natural Resources inc. enregistre un formulaire 10-Q' au format PDF - Nouvelle fenêtre">Cliffs Natural Resources inc. enregistre un formulaire 10-Q</a></dd>
|
|
$tabRet['docLangue']=trim(@getTextInHtml($annonceHtml, '<dt class="listingInfo">Langue :</dt>', '<dd class="listingInfo">', '</dd>'));
|
|
$tabRet['pdfLink']=str_replace('https://', 'http://', str_replace(chr(160), ' ', html_entity_decode(@getTextInHtml($annonceHtml, '&url=http://www.info-financiere.fr/', 'url=', '" target="'))));
|
|
|
|
//print_r($tabRet);
|
|
//die($annonceHtml);
|
|
|
|
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 Infos financières 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");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
echo date('Y/m/d - H:i:s') .' - DEBUT du script'. EOL;
|
|
|
|
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;
|
|
$tabSansSiren=array();
|
|
$nbDeja=$nbInsert=$nbErreur=0;
|
|
|
|
$message=date('Y/m/d - H:i:s') ." - Début de la récupération des informations financières du $dateDebut au $dateFin...".EOL;
|
|
$strMessage.=$message;
|
|
echo $message;
|
|
|
|
echo date('Y/m/d - H:i:s') ." - La durée maximum entre chaque requête est de $tempsMaxEntreRequetes secondes.". EOL;
|
|
|
|
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;
|
|
|
|
/** Cookie de session **/
|
|
$url='http://www.info-financiere.fr/search.php';
|
|
$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;
|
|
|
|
/** Première page de la recherche **/
|
|
$url="http://www.info-financiere.fr/search.php?action=search&by=avancee&type=&stype=%C2%A0&datefrom=$dateFrom&dateto=$dateTo&societe=&q=&x=0&y=0";
|
|
$page=getUrl($url, $cookie, '', $referer);
|
|
$body=$page['body'];
|
|
|
|
if (preg_match('/<div id="rappel"><p><strong>Nombre de résultats :<\/strong>(.*)<\/p>/Uim', $body, $matches))
|
|
$nbAnnonces=trim($matches[1]);
|
|
else {
|
|
print_r($page);
|
|
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) {
|
|
/* <a class="actif" href="search.php?action=changepage&c=eJxlz
|
|
c1ugkAUBeD7KCxcdTMMiU1lN5aQWEBTsagrg8OlrcL8S8Wn8Vl8slKTdtPVOflykqOBS6OkKR0SZxDDlVSex!aR998Ja!tdKrtVr3Amaklu1*uyrB2a0KeEUhL41L*jHmtpMPSDX4UGUIAAlsWgPqRA98lhUG
|
|
zbcshSKSPPQ7FQDadgf9AiBwqWtyCwQwPVXxt9WdSAL*3lmT91!XuzSPPzWmeHeZ!fguJNuzxdJhf7ULDJbKy3R4XiOJ5uTPMabWK9LZLqsH*MFkXA4kkSZ3YH36SRVJ0_&page=2"
|
|
*/
|
|
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) {
|
|
$message=date('Y/m/d - H:i:s') ." - Les $nbAnnonces annonces DJO infos financières du $dateDebut ($dateDb) sont en base ($nbAnnDb) !". EOL;
|
|
$strMessage.=$message;
|
|
echo $message;
|
|
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;
|
|
$strMessage.=$message;
|
|
echo $message;
|
|
echo date('Y/m/d - H:i:s') .' - Tentative de récupération des annonces...'. EOL;
|
|
}
|
|
else {
|
|
$message=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;
|
|
$strMessage.=$message;
|
|
echo $message;
|
|
}
|
|
$tabAnnonces=explode('<ul class="annonce">', $page['body']);
|
|
//print_r($tabAnnonces);
|
|
//die();
|
|
|
|
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('<ul class="annonce">', $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;
|
|
$isin=$infoAnnBalo['isin'];
|
|
if (strlen($isin)==12)
|
|
$infoAnnBalo['siren'] = @$iBourse->getCodeSiren($isin);
|
|
elseif (strlen($isin)==11) {
|
|
for($iIsin=0;$iIsin<10;$iIsin++) {
|
|
$siren=@$iBourse->getCodeSiren($isin.$iIsin);
|
|
if ($siren>0) {
|
|
$infoAnnBalo['siren'] = $siren;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (strtoupper(substr($isin,0,2))=='FR' && $infoAnnBalo['siren']==0)
|
|
$tabSansSiren[$isin]=array( 'isin'=>$isin,
|
|
'nom'=>$infoAnnBalo['raisonSociale'],
|
|
'pdf'=>$infoAnnBalo['pdfLink'],
|
|
'url'=>"http://www.google.fr/#hl=fr&source=hp&q=$isin+rcs&btnG=Recherche+Google&meta=&aq=f"
|
|
);
|
|
|
|
$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;
|
|
$nbDeja++;
|
|
// 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;
|
|
$nbInsert++;
|
|
}
|
|
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;
|
|
$nbErreur++;
|
|
}
|
|
}
|
|
}
|
|
|
|
$dateCour=getNextDate($dateCour,1);
|
|
}
|
|
|
|
$message=date('Y/m/d - H:i:s') ." - Fin de la récupération des informations financières : $nbInsert ajouts, $nbDeja déjà en base et $nbErreur erreurs.".EOL;
|
|
$strMessage.=$message;
|
|
echo $message;
|
|
|
|
// Ajout d'informations au mail de traitement et envoi !
|
|
if (count($tabSansSiren)>0) {
|
|
$strObjet.=" avec ISIN sans SIREN !!!";
|
|
$strMessage.=EOL.EOL."--------------------------------------------------------------------".EOL.EOL;
|
|
$strMessage.="Les entreprises suivantes n'ont pas de correspondance ISIN / SIREN dans la base Scores & Décisions.".EOL.
|
|
"Penser à mettre à jour les informations sur la base...".EOL.EOL;
|
|
$strMessage.="ISIN\tRaison Sociale\tLien\tPDF".EOL;
|
|
foreach ($tabSansSiren as $tabMarche)
|
|
$strMessage.= $tabMarche['isin']."\t".
|
|
$tabMarche['nom']."\t".
|
|
$tabMarche['url']."\t".
|
|
$tabMarche['pdf'].EOL;
|
|
}
|
|
|
|
sendMail('production@scores-decisions.com', 'jmartory@scores-decisions.com,ylenaour@scores-decisions.com', $strObjet, $strMessage);
|
|
|
|
die();
|
|
?>
|