')));
// $tabInfo['dateDerAG']=htm2txt(@getTextInHtml($body, 'Date de la dernière assemblée générale', ' : ', ''));
//$tabInfo['nom3']=htm2txt(@getTextInHtml($body, '
', $tmp);
//die(print_r($tabTmp));
$tabTrim=array();
foreach ($tabTmp as $i=>$dir) {
$tmp=explode('
', $dir);
if ($i==0)
foreach ($tmp as $k=>$tmp2)
$tabA[$k]=htm2txt($tmp2);
else
foreach ($tmp as $k=>$tmp2)
if (isset($tabA[$k]) && trim($tabA[$k])<>'')
$tabTrim[$tabA[$k]][$i-1]=str_replace(' ','', htm2txt($tmp2));
}
/* 0. 1er Trimestre
1. 2è Trimestre
2. 3è Trimestre
3. 4è Trimestre
4. 1er Semestre
5. Annuel
*
$tabInfo['chiffresTrim']=$tabTrim;
*/
return $tabInfo;
}
$iDb=new WDB();
$iDb2=new WDB('sdv1');
//$iInsee=new MInsee();
$iBourse=new MBourse();
set_time_limit(0);
$allIsin=$dernierCour=$finSeance=$dateDebut=$dateFin=$dateF=$checkIsin=$isin=$dateCour=$easyBourse=$marcheNew=$marcheRad=$getIPO=$isinHisto=false;
$strMailInfo='';
$strInfoProg='Usage : '.basename($argv[0]). " [OPTION]
Recupère les informations boursières.
Sans aucun paramètre, récupère les dernières valeurs des cotations en cours.
Sinon:
-d:JJ/MM/AAAA Date de début de cotation
-f:JJ/MM/AAAA Date de fin de cotation
-l Récupère les dernières valeurs des cotations en cours (1)
-s Récupère les valeurs des cotations à la fin de la dernière séance
-n:X Intervalle MIN en secondes entre les requêtes (défaut=$tempsMinEntreRequetes)
-i:X \" MAX \" \" \" \" \" (défaut=$tempsMaxEntreRequetes)
-a Mise à jour de toutes les autres informations d'un code ISIN
-n(:XXXX) Mise à jour des nouvelles introductions des marchés (XXXX : année optionnelle)
-r Mise à jour des radiations des marchés
-c:FR0000031577 Mise à jour uniquement des informations du code ISIN donné
-v Vérifie que tous les codes ISIN côtés sont bien en base de référence (SIREN, dates, etc...)
-e Mise à jour des référentiels Cofisem via Easybourse
-p Récupère les IPO (Introductions en bourse) (2)
-h:FR0000031577 Récupère l'historique des cours pour un code ISIN donné
(1) Action par défaut
(2) Non fonctionnel
";
$argv=$_SERVER['argv'];
if ($_SERVER['argc']==1) $dernierCour=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); break;
case 'f': $dateFin=substr($argv[$i],3,10);
$dateF=WDate::dateT('d/m/Y', 'Ymd', $dateFin); 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 'n': $marcheNew=true; break;
case 'r': $marcheRad=true; break;
case 'l': $dernierCour=true; break;
case 's': $finSeance=true; break;
case 'v': $checkIsin=true; break;
case 'e': $easyBourse=true; break;
case 'c': $isin=trim(substr($argv[$i],3,12));
if (strlen($isin)<>12) die('Code ISIN "'.$isin.'" incorrect !'.EOL); break;
case 'a': $allIsin=true; break;
case 'p': $getIPO=true; break;
case 'h': $isinHisto=trim(substr($argv[$i],3,12));
if (strlen($isinHisto)==0) $isinHisto=true;
elseif (strlen($isinHisto)<>12) die('Code ISIN "'.$isinHisto.'" incorrect !'.EOL); break;
case '-': die($strInfoProg); break;
default: die('Option '. $argv[$i] . " inconnue !\n"); break;
}
}
}
}
if ($easyBourse) {
getEasyBourse();
die();
}
if($isin || $allIsin || $marcheRad || $marcheNew) {
$tabIsins=array();
//if ($allIsin) {
if ($marcheRad) {
/** Radiations de la Bourse **/
$url='http://www.abcbourse.com/marches/radiations.aspx';
$cookie=$referer='';
$page=getUrl($url, $cookie, ''/*$postData*/, $referer);
$referer=$url;
// randsleep(7,21);
/*
if (!preg_match('/ id="__VIEWSTATE" value="(.*)">/Uis', $page['body'], $matches))
die('Page inatendue !'.EOL);
$VIEWSTATE=$matches[1];
$tabRetr=array();
$postData=array('__EVENTTARGET'=>'',
'__EVENTARGUMENT'=>'',
'__LASTFOCUS'=>'',
'__VIEWSTATE'=>$VIEWSTATE);
$page=getUrl($url, $cookie, $postData, $referer);
*/
$tabRetr=array();
if (preg_match_all('/
(?:.*)
(.*)<\/td>(?:.*)
(.*)<\/td>(?:.*)
(.*)<\/td>(?:.*)<\/tr>/Uis', $page['body'], $matches)) {
foreach ($matches[1] as $i=>$date) {
if ($i==0) continue;
elseif ($i==1) $annee=substr($date,-4);
$nom=htm2txt(utf8_decode($matches[3][$i]));
$tabRetr[]=array( 'date'=>$date,
// 'isin'=>$isin,
// 'siren'=>$siren,
'nom'=>$nom,
'marche'=>htm2txt($matches[2][$i]),
'url'=>"http://www.google.fr/#hl=fr&source=hp&q=".urlencode('"'.$nom.'"')."+rcs+isin+FR&btnG=Recherche+Google&meta=&aq=f"
);
}
// print_r($tabRetr);
$strObjet="Radiations de la bourse $annee";
$strMailInfo.="Les entreprises suivantes seront/sont radiés sur les marchés au cours de l'année $annee.".EOL.
"Penser à mettre à jour les informations sur la base...".EOL.EOL;
$strMailInfo.="Date\tRaison Sociale\tMarché\tLien".EOL;
foreach ($tabRetr as $tabMarche)
$strMailInfo.= $tabMarche['date']."\t".
$tabMarche['nom']."\t".
$tabMarche['marche']."\t".
$tabMarche['url'].EOL;
$strMailInfo.= EOL.EOL.EOL."--------------------------------------------------------------------".EOL.
"La liste peut être consultée à l'adresse suivante :".EOL.$url;
} else {
$strObjet="Radiations de la bourse $annee (ERREUR)";
$strMailInfo.="Erreur lors de la lecture des radiations sur les marchés au cours de l'année $annee depuis la liste suivante :".EOL.$url;
}
sendMail('webmaster@scores-decisions.com', 'support@scores-decisions.com', $strObjet, $strMailInfo);
}
if ($marcheNew) {
/*
POST http://www.abcbourse.com/marches/intros.aspx?ctl00%24BodyABC%24ddYear=2005 Indicateurs chargement[LOAD_DOCUMENT_URI LOAD_INITIAL_DOCUMENT_URI ] Taille contenu[7217] Type Mime[text/html]
En-têtes requête:
Referer[http://www.abcbourse.com/marches/intros.aspx?ctl00%24BodyABC%24ddYear=2005]
Cookie[__utma=107798994.177609469.1286568099.1286786199.1286878712.4; __utmc=107798994; __utmz=107798994.1286568099.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=107798994.7.10.1286878712]*/
$eventValidation='';
$viewState='';
$postData=array(
'__EVENTTARGET'=>'ctl00%24BodyABC%24ddYear',
'__EVENTARGUMENT'=>'',
'__LASTFOCUS'=>'',
'__VIEWSTATE'=>$viewState,
'__EVENTVALIDATION'=>$eventValidation,
'ctl00%24txtAutoComplete'=>'Chercher+une+valeur',
'ctl00%24BodyABC%24ddYear'=>$annee);
/** Introductions en Bourse **/
$url='http://www.abcbourse.com/marches/intros.aspx';
$cookie=$referer='';
$page=getUrl($url, $cookie, ''/*$postData*/, $referer);
// randsleep(7,21);
$referer=$url;
$tabIntro=array();
if (preg_match_all('/
SousSecteur", '', '')),0,4)*1;
if ($codeIcb>0) $tabUpdate['code_icb']=$codeIcb;
$dateIntro=WDate::dateT('d Men Y','Ymd', htm2txt(@getTextInHtml($body, "Date d'introduction", '', '')));
if ($dateIntro>19000101) $tabUpdate['dateIntroduction']=$dateIntro;
$nbTitres=str_replace(',','',htm2txt(@getTextInHtml($body, "Nombre total de titres", '', '')))*1;
if ($nbTitres>0) $tabUpdate['nombreTitres']=$nbTitres;
$eligiblePea=$eligibleSrd=$libMarche2='-';
// PEA
if (preg_match('/Eligible to PEA<\/strong>/Uis', $body)) $eligiblePea='O';
if (preg_match('/Not eligible to PEA<\/strong>/Uis', $body)) $eligiblePea='N';
elseif (preg_match('/
Eligibilit\D{1,2} PEA<\/span>\s+-<\/strong>/Uis', $body)) $eligiblePea='';
// SRD
if (preg_match('/neither eligible for the SRD/Uis', $body)) $eligibleSrd='N';
elseif (preg_match('/Instrument eligible for the SRD/Uis', $body)) $eligibleSrd='O';
elseif (preg_match('/
Eligibilit\D{1,2} SRD<\/span>\s+-<\/strong>/Uis', $body)) $eligibleSrd='';
// Type de marché
if (preg_match('/Alternext private placement<\/span>/Uis', $body)) $libMarche2='Alternext private placement';
elseif (preg_match('/Alternext public offering<\/span>/Uis', $body)) $libMarche2='Alternext public offering';
elseif (preg_match('/Foreign compartment<\/span>/Uis', $body)) $libMarche2='Compartiment Etranger';
elseif (preg_match('/Compartment A \(Large Cap\)<\/strong>/Uis', $body)) $libMarche2='Eurolist compartiment A';
elseif (preg_match('/Compartment B \(Mid Cap\)<\/strong>/Uis', $body)) $libMarche2='Eurolist compartiment B';
elseif (preg_match('/Compartment C \(Small Cap\)<\/strong>/Uis', $body)) $libMarche2='Eurolist compartiment C';
elseif (preg_match('/Delisted from regulated markets<\/span>/Uis', $body)) $libMarche2='Eurolist compartiment C';
elseif (preg_match('/
-<\/span>\s+-<\/strong><\/div>\s+<(?:\/|)div>/Uis', $body)) $libMarche2='Valeurs Radiées de Marchés Réglementés';
if ($eligiblePea=='-' || $eligibleSrd=='-' || $libMarche2=='-')
die("$body [ $eligiblePea / $eligibleSrd / $libMarche2 ]".EOL);
if ($eligiblePea=='') $eligiblePea='-';
$tabUpdate['eligiblePEA']=$eligiblePea;
if ($eligibleSrd=='') $eligibleSrd='-';
$tabUpdate['eligibleSRD']=$eligibleSrd;
$tabUpdate['marche']=$libMarche2;
/*
1 Compartiment Professionnel
2 Compartiment spécial
125 Eurolist compartiment A
325 Eurolist compartiment C
18 Eurolist hors zone Euro
6 Eurolist zone Euro
5 Main Market
1 Main Standard
1 MAR LIBRE OTC
258 Marché libre
1 MR - Compartiment C
1 Prime Standard
*/
$iDb2->update('bourse_isin', $tabUpdate, "code_isin='$isin'", false);
echo "$isin\t$siren\t$siren2\t$nomAction\t$symbole\t$mic\t$libMarche\t".$ligne[9].EOL;
print_r($tabUpdate);
}
//randsleep(7,21);
}
$tabSrc=array('Cofisem'=>3000);
if (@$tabSociete['activiteDet']=='' || @$tabSociete['activiteDetDat']<=19800101) {
// Mise à jour via EURONEXT
$page=getUrl("https://europeanequities.nyx.com/fr/nyx-company-profile/ajax?instrument_id=$isin-$mic");
if ($page['code']==200) {
$nbAccesDetailSociete++;
$body=$page['body'];
echo $body.EOL;
$tabUpdate=array();
$activiteDet=@getTextInHtml($body, '
', '
', '
', 'Source:', '
');
$tabTmp=explode(' - Last Update: ', $tmpUpdate);
$activiteDetSrc=$tabTmp[0];
$activiteDetDat=WDate::dateT('d Men Y','Ymd', $tabTmp[1]);
$activiteDet=utf8_decode(htm2txt(preg_replace('/
.*/','',$activiteDet)));
//die($activiteDet.EOL.$tmpUpdate.EOL.$activiteDetSrc.EOL.$activiteDetDat.EOL);
if ($activiteDet<>'') $tabUpdate['activiteDet']=$activiteDet;
if ($activiteDetSrc<>'') $tabUpdate['activiteDetSrc']=@$tabSrc[$activiteDetSrc];
if ($activiteDetDat>19000101) $tabUpdate['activiteDetDat']=$activiteDetDat;
$iDb2->update('bourse_isin', $tabUpdate, "code_isin='$isin'", false);
echo "$isin\t$siren\t$siren2\t$nomAction\t$symbole\t$mic\t$libMarche\t".$ligne[9].EOL;
print_r($tabUpdate);
}
//randsleep(7,21);
}
if($siren<1000) //echo "\t$nomAction\t$mic\t$libMarche".EOL;
echo "$isin\t$siren\t$siren2\t$nomAction\t$symbole\t$mic\t$libMarche\t".$ligne[9]."\tPas de SIREN".EOL;
$ret=$iDb2->select('bourse_cours', 'count(*)', "isin='$isin' AND autre='' AND date='$dateYmd' AND heure=$heure AND
open=$open AND high=$high AND low=$low AND close=$close AND volume=$volume", false);
$deja=$ret[0][0];
if (!$deja) {
$traite++;
$tabInsert=array( 'isin'=>$isin,
'autre'=>'',
'date'=>$dateYmd,
'open'=>$open,
'high'=>$high,
'low'=>$low,
'close'=>$close,
'volume'=>$volume,
'heure'=>$heure,
'devise'=>$devise,
);
if (!$iDb2->insert('bourse_cours', $tabInsert))
if (mysql_errno()<>1062)
die(date ('Y/m/d - H:i:s') .' - ERREUR : MySql n°'. mysql_errno() .' : '. mysql_error() . EOL);
else $error++;
}
else $ntraite++;
}
}
echo date('Y/m/d - H:i:s') ." - $nbAccesDetailMarche/$iLigneOk accès NYX sur les données marché.".EOL;
echo date('Y/m/d - H:i:s') ." - $nbAccesDetailSociete/$iLigneOk accès NYX sur les données société.".EOL;
unlink(FILENAME_HISTO_NYX);
$nbLignes=$iLigne;
} else {
$mic='';
$isin=$isinHisto;
$dateFinUnix=gmmktime(0, 0, 0, date('m'), date('d')-1, date('Y')).'000';
$ret=$iDb2->select( 'bourse_isin',
'siren, raisonSociale, code_mnemo, code_isin, mic, code_icb, dateIntroduction, dateIntroduction*1 AS dateIntroYmd,
nombreTitres, eligibleSRD, eligiblePEA, marche, activiteDet, activiteDetSrc, activiteDetDat*1 AS activiteDetDat',
"code_isin='$isin'", false, MYSQL_ASSOC);
if (isset($ret[0]['code_isin'])) {
$tabSociete=$ret[0];
if (strlen($tabSociete['mic'])>3) $mic=substr($tabSociete['mic'],0,4); // On prend le 1er MIC
$dateDebUnix=gmmktime(0, 0, 0, 1, 1, 2009).'000';
//$dateDebUnix=gmmktime(0, 0, 0, 5, 1, 2013).'000';
die("isin=$isin, mic='$mic', dateIntro=$dateIntroYmd".EOL);
}
if ($mic=='') die("Pas de MIC pour $isin".EOL);
$url=URL_BOURSE_ISIN_H."&typedate=dmy&separator=point&mic=$mic&isin=$isin&namefile=Price_Data_Historical&from=$dateDebUnix&to=$dateFinUnix&adjusted=1&base=0"; // &name=ATARI
$page=getUrl($url);
$body=$page['body'];
file_put_contents("/tmp/getIsin-Histo-$isin.csv",$body);
$tabLignes=file("/tmp/getIsin-Histo-$isin.csv");
foreach ($tabLignes as $iLigne=>$ligne) {
//echo "$iLigne $ligne".EOL;
if ($iLigne==0 && trim($ligne)<>'"Historical price chart data"')
die(date ('Y/m/d - H:i:s') .' - ERREUR : Première ligne différente de "Historical price chart data"'.EOL);
elseif ($iLigne==1 && substr($ligne,0,7)<>'"Date: ')
die(date ('Y/m/d - H:i:s') .' - ERREUR : Deuxième ligne différente de "Date: ..."'.EOL);
elseif ($iLigne==2 && trim($ligne)<>'""')
die(date ('Y/m/d - H:i:s') .' - ERREUR : 3ème ligne différente de ""'.EOL);
elseif ($iLigne==3 && trim($ligne)<>'"ISIN","MIC","Date","Open","High","Low","Close","Number of Shares","Number of Trades","Turnover","Currency"')
die(date ('Y/m/d - H:i:s') .' - ERREUR : 4ème ligne, libellés CSV différents de ceux attendus '.EOL);
elseif ($iLigne>3) {
$ligne=explode(',', str_replace('"','',$ligne));
$dateYmd=WDate::dateT('d/m/Y','Y-m-d', $ligne[2]);
$open=$ligne[3]/100;
$high=$ligne[4]/100;
$low=$ligne[5]/100;
$close=$ligne[6]/100;
$volume=str_replace('.','',$ligne[7]);
$devise=$ligne[10];
$ret=$iDb2->select('bourse_cours', 'count(*)', "isin='$isin' AND autre='' AND date='$dateYmd' AND heure=$heure AND
open=$open AND high=$high AND low=$low AND close=$close AND volume=$volume", false);
$deja=$ret[0][0];
if (!$deja) {
$traite++;
$tabInsert=array( 'isin'=>$isin,
'autre'=>'',
'date'=>$dateYmd,
'open'=>$open,
'high'=>$high,
'low'=>$low,
'close'=>$close,
'volume'=>$volume,
'heure'=>$heure,
'devise'=>$devise,
);
if (!$iDb2->insert('bourse_cours', $tabInsert))
if (mysql_errno()<>1062)
die(date ('Y/m/d - H:i:s') .' - ERREUR : MySql n°'. mysql_errno() .' : '. mysql_error() . EOL);
else $error++;
}
else $ntraite++;
}
}
$nbLignes=$iLigne-3;
}
/*
"Historical price chart data"
"Date: 01/01/2000 - 20/05/2013"
""//Date, Ouvert, Haut, Bas, Fermer, Nombre de titres, Capitaux
"ISIN","MIC","Date","Open","High","Low","Close","Number of Shares","Number of Trades","Turnover","Currency"
"FR0010478248","NYSE Euronext Paris","03/01/2000","84065077","86208643","81548717","81548717","19.419","3.403","16.426.84397","EUR"
*/
echo date('Y/m/d - H:i:s') .' - '. ($ntraite+$error) .' cotations déjà en base dont '.$error.' erreur(s) !'.EOL;
$strMailInfo.=date('Y/m/d - H:i:s') .' - '. ($ntraite+$error) .' cotations déjà en base dont '.$error.' erreur(s) !'.EOL;
echo date('Y/m/d - H:i:s') .' - '. $traite.' / '. ($nbLignes-2) .' cours téléchargés.'. EOL;
}
echo date('Y/m/d - H:i:s') .' - FIN du script.'. EOL;
?>