Adfoxã«ã¯æ¢è£œã®ã¬ããŒããå€æ°ãããŸãããã¬ããŒãèŠä»¶ã®åçŽãªè€éãã§ãåé¡ãçºçããŸãã éåžžã®ã¬ããŒããèšå®ãããªãã·ã§ã³ããããŸãããã»ãšãã©ã®å Žåãã¢ããããŒãã®çµã¿åãããèªåã§èšå®ããå¿ èŠããããŸãã
ãã®èšäºã§ã¯ãã¢ã«ãŠã³ãã§äœ¿çšå¯èœãªãã¹ãŠã®ãããŒã®CTRãã¢ã³ããŒãããã¹ã¯ãªãããäœæããæ¹æ³ã瀺ããŸãïŒãããæåã§è¡ãã®ã¯æéçã«éçŸå®çã§ãïŒã ãããåçŽãªHTMLããŒãžãšããŠãã£ãŒãã«è¡šç€ºããæ¹æ³ãšåæ§ã«ã ã€ãŸãããã¹ãŠã®ãã£ã³ããŒã³ãšãã©ã€ããé 次確èªãããã¹ãŠã®ãããŒã®ã€ã³ãã¬ãã·ã§ã³ãšã¯ãªãã¯ãååŸããŠãCTRã®ã°ã©ããæç»ããŸãã åã®èšäºãšåæ§ã«ãAmazon Web Servicesã€ã³ã¹ã¿ã³ã¹ã§äœæ¥ããããããŠãããŒãµã«ã§æãéèŠãªããšã¯ç¡æã§ãã PHPã§ããŒã¿ãã¢ã³ããŒãããHighchartsã§ã°ã©ãã£ãã¯ãæç»ããŸãã ã³ãŒãã¯ãæ¹åãªãã§ããŒã¿ãã¢ããããŒãããã³åŠçããæãç°¡åãªæ¹æ³ãå®è£ ããŸãã ãã®çµæãæšæ¥ã®æ¯æ¥æŽæ°ãããæ¯æ¥ã®ããŒãžãååŸããŸãã
AWSã§ã¢ã«ãŠã³ããäœæããããšããå§ããŸãïŒãŸã ãªãå ŽåïŒã ãã®æé ã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ãdocs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-ug.pdf ïŒéå§åïŒã§èª¬æããŠããŸãã 次ã«ãããã¥ãŒããªã¢ã«ïŒAmazon Linuxã«LAMP WebãµãŒããŒãã€ã³ã¹ããŒã«ãããã®ç« ã®åãããã¥ã¡ã³ãã§èª¬æãããŠãã段éãå®è¡ããŸãïŒããŒã¿ãã¢ããããŒãããã³ä¿åããããã«å¿ èŠãªPHPãšMySQLãã€ã³ã¹ããŒã«ããŸãïŒå°æ¥ãMySQLã§ã®äœæ¥ã¯ããã¹ããã¡ã€ã«ãããåªããŠããŸãïŒã ãã¡ãããçµã¿èŸŒã¿ã®Pythonã䜿çšããŠãããè¡ããªããŠãå®è¡ã§ããŸãã Amazon Linuxã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸãïŒè©³çŽ°ã«ã€ããŠã¯ãUbuntu Serverã€ã³ã¹ã¿ã³ã¹ãéžæããååã®èšäºãåç §ããŠãã ããïŒã ããã§ã¯ãUbuntuã§ã¯ãªãLinuxãå¿ èŠã§ãã Ubuntuã§LAMP WebãµãŒããŒãå®è¡ããã«ã¯ãããã¥ã¡ã³ãhelp.ubuntu.com/community/ApacheMySQLPHPãåç §ããŠãã ããã ãã®ãããAmazon Linuxã€ã³ã¹ã¿ã³ã¹ãéžæããã»ãã¥ãªãã£ã°ã«ãŒãããã§ãã¯ããŠããã©ã€ããŒãããŒãããããšã確èªããŸãã æ°ååŸãã€ã³ã¹ã¿ã³ã¹ã®ãããªãã¯DNSãååŸããPuttyïŒWindowsã®å ŽåïŒãŸãã¯MACã®ã¿ãŒããã«ãä»ããŠã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããŸãã
LAMP WebãµãŒããŒãé 眮ããŸãã ææ°ã®æŽæ°ãããããšã確èªããã³ãã³ããå®è¡ããŸãã
$ sudo yum update -y
ç§ãã¡ã«é©ããPHPããŒãžã§ã³ãé 眮ããŸãã
$ sudo yum install -y httpd24 php56 mysql55-server php56-mysqlnd
Apache WebãµãŒããŒãèµ·åããŸãã
$ sudo service httpd start
ã·ã¹ãã ãèµ·åãããã³ã«Apache WebãµãŒããŒãèµ·åããããã«ããŸãã
$ sudo chkconfig httpd on
ãã¹ãŠãæåããããšããã¹ãããŸããã€ã³ã¹ã¿ã³ã¹ã®ãããªãã¯DNSãã©ãŠã¶ãŒã«ã³ããŒããŠè²Œãä»ãã次ã®ããŒãžãååŸããŸãã
ããã§ãã«ãŒããã£ã¬ã¯ããª/ var / www /ã¯ã«ãŒããŠãŒã¶ãŒã«ãã£ãŠãææããããŸãã ããã§ec2-userãŠãŒã¶ãŒã¢ã¯ã»ã¹ãäœæããŸãããã
ã°ã«ãŒããwwwããäœæããŸãã
$ sudo groupadd www
ãŠãŒã¶ãŒec2-userãwwwã°ã«ãŒãã«è¿œå ããŸãã
$ sudo usermod -a -G www ec2-user
å€æŽãæå¹ã«ããã«ã¯ãPuttyãŸãã¯TerminalïŒexitã³ãã³ãïŒãéããŠãã€ã³ã¹ã¿ã³ã¹ã«å床æ¥ç¶ããŸãã ãŠãŒã¶ãŒec2-userãwwwã°ã«ãŒãã«ç»é²ãããŠããããšã確èªããŸãã
$ã°ã«ãŒã
ec2-userãã€ãŒã«www
/ var / wwwãã©ã«ããŒã®ææè ãå€æŽããŸãã
$ sudo chown -R rootïŒwww / var / www
ãŠãŒã¶ãŒec2-userããã³wwwã°ã«ãŒãã®ãã®ä»ã®ãŠãŒã¶ãŒã«/ var / wwwãã©ã«ããŒãå€æŽããæ©èœãè¿œå ããŸãã
$ sudo chmod 2775 / var / www
$ find / var / www -type d -exec sudo chmod 2775 {} +
$ find / var / www -type f -exec sudo chmod 0664 {} +
/ var / wwwãã£ã¬ã¯ããªã«PHPãã¡ã€ã«ãäœæã§ããããšããã¹ãããŸãã ãããè¡ãã«ã¯ãphpinfo.phpãã¡ã€ã«ãäœæããŠ<ïŒPhp phpinfoïŒïŒãæžã蟌ã¿ãŸãã ïŒ>ïŒ
$ echo "<ïŒphp phpinfoïŒïŒ;ïŒ>"> /var/www/html/phpinfo.php
ããã§ãããã©ãŠã¶ã®ã¢ãã¬ã¹ããŒã«ã€ã³ã¹ã¿ã³ã¹ã®ãããªãã¯DNSãã³ããŒããã/ phpinfo.phpããè¿œå ããŸãã PHPã®èšå®ãå«ã次ã®ããŒãžãååŸããå¿ èŠããããŸãã
ã»ãã¥ãªãã£äžã®çç±ãããäœæããphpinfo.phpãã¡ã€ã«ãåé€ããŸãã
$ rm /var/www/html/phpinfo.php
çŽ æŽããããAdfoxããããŒã¿ãã¢ããããŒãããæºåãã§ããŸããïŒ
Adfoxã®çµ±èšæ å ±ãã¢ã³ããŒããã
Adfox APIã®ããã¥ã¡ã³ãã¯ã help.adfox.ru ïŒããŒãžã®äžéšã«ããããŠã³ããŒããªã³ã¯ïŒã«ãããŸãã äžè¬ã«ãããã¥ã¡ã³ãã¯ããŸãã³ã³ãã€ã«ãããŠããªããããäžè¬çãªå Žåã次ã®ã«ãŒã«ã䜿çšã§ããŸãïŒAPIã§ã¬ããŒãã®ãªã³ã¯ãååŸããå¿ èŠãããå Žåã¯ããã©ãŠã¶ãŒãããªã³ã¯ãã³ããŒãããŠãŒã¶ãŒåãšãã¹ã¯ãŒã+ 'ïŒisXML = 1'ã䜿çšããŠåœ¢åŒã®ããŒã¿ãåä¿¡ããŸãXML æ€çŽ¢æ©èœãŸãã¯ãã£ã³ããŒã³èšå®ãå¿ èŠãªå Žåã¯ãAPIããã¥ã¡ã³ãã確èªããå¿ èŠããããŸãã
äžè¬ã«ãAdfox APIãžã®ãªã¯ãšã¹ãã«ã¯ããã°ã€ã³æïŒãã°ã€ã³æïŒãšãã¹ã¯ãŒãããã®SHA-256ããã·ã¥ã䌎ããŸãã æ€çŽ¢ã¯ãšãªãsha-256 onlineãã«å¯ŸããŠãä»»æã®ãµã€ãã§ãã¹ã¯ãŒãããã·ã¥ãçæã§ããŸãã ããšãã°ããã¡ãïŒ www.xorbin.com/tools/sha256-hash-calculator
ãã¹ã¯ãŒããã12345ãã®å ŽåãAPIã«ã¢ã¯ã»ã¹ããã«ã¯ãã5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5ããšããå€ããã¹ã¯ãŒããšããŠäœ¿çšããŸãã
ã¢ã«ãŽãªãºã ã¯2ã€ã®ã¹ãããã§æ§æãããŸãã
ã¹ããã1 å©çšå¯èœãªãã¹ãŠã®ãã£ã³ããŒã³ã®ãªã¹ããååŸããŸãã
å©çšå¯èœãªãã£ã³ããŒã³ã®ãªã¹ããååŸããŸãã ãã£ã³ããŒã³ãå€æ°ããå Žåã¯ãããšãã°8æ1æ¥ããéå§ããããã£ã³ããŒã³ã«å¶éã§ããŸãã
login.adfox.ru/API.php?object=account&action=list&actionObject=superCampaign&dateAddedFrom=2015-08-01&loginAccount=login&loginPassword=password-sha-256&isXML=1
ãã©ãŠã¶ã§ã次ã®XMLãã¡ã€ã«ãååŸããŸãã
ã¹ããã2 åãã£ã³ããŒã³ã«ã¯ãååïŒã¿ã°ïŒãšIDïŒïŒããããŸãã åIDã«ã€ããŠããããŒã¬ããŒããååŸããŸãïŒããšãã°ãID = 55555ã®ãã£ã³ããŒã³ã®å ŽåïŒïŒ
login.adfox.ru/commonReportsOutputForm.php?period=&startDate=start-date&endDate=end-date&criteria=superCampaignBanner&isNewSearch=on&objectName=superCampaign&objectID=55&loginloginloginloginloginloginloginloginloginloginloginloginloginloginloginloginloginlogin
ãã®æé ãæ¯æ¥å®è¡ããããŒã¿ããã¡ã€ã«ã«æžã蟌ãã¹ã¯ãªãããäœæããŸãããã æãç°¡åãªæ¹æ³ã¯ã/ var / www / htmlãã©ã«ããŒã«ç§»åããããã«adfoxãã©ã«ããŒãäœæãã次ã®ã³ãŒãã§daily.phpãã¡ã€ã«ãäœæããããšã§ãã
AdfoxããŒã¿ã¢ããããŒãã³ãŒã
<?php // , : startDate endDate // Adfox .. date_default_timezone_set("Europe/Moscow"); //$startDate = '04.09.15'; //$endDate = '04.09.15'; // $startDate = date('dmy', strtotime('-1 day')); $endDate = $startDate; // getCampaigns // $campIDs ID // dateAddedFrom , function getCampaigns() { $ch = curl_init(); $options = array( CURLOPT_URL => 'https://login.adfox.ru/API.php?object=account&action=list&actionObject=superCampaign&dateAddedFrom=2015-08-01&loginAccount=&loginPassword=-sha-256&isXML=1', CURLOPT_HEADER => "Content-Type:application/xml", CURLOPT_HTTPAUTH => CURLAUTH_BASIC, CURLOPT_SSL_VERIFYPEER => FALSE, CURLOPT_RETURNTRANSFER => TRUE ); curl_setopt_array($ch, $options); $data = curl_exec($ch); curl_close($ch); // Adfox , // file_put_contents('request.txt', $data, FILE_APPEND); // Adfox XML vals $parser=xml_parser_create('UTF-8'); xml_parse_into_struct($parser, $data, $vals, $index); $campIDs = array(); $j = 0; // vals, ID campIDs for ($i = 0; $i < count($vals); ++$i) { if ($vals[$i]["tag"]=="ID") { $ID = $vals[$i]["value"]; } if ($vals[$i]["tag"]=="NAME") { $name = $vals[$i]["value"]; $campIDs[$j]['id'] = $ID; $campIDs[$j]['name'] = $name; $j += 1; } } return $campIDs; } // getBanners ID // campReport ID + - - - function getBanners($id, $startDate, $endDate) { $ch = curl_init(); $options = array( CURLOPT_URL => 'https://login.adfox.ru/commonReportsOutputForm.php?period=&startDate='.$startDate.'&endDate='.$endDate.'&criteria=superCampaignBanner&isNewSearch=on&objectName=superCampaign&objectID='.$id.'&ignoreStartDate=off&loginAccount=&loginPassword=-sha-256&isXML=1', CURLOPT_HEADER => "Content-Type:application/xml", CURLOPT_HTTPAUTH => CURLAUTH_BASIC, CURLOPT_SSL_VERIFYPEER => FALSE, CURLOPT_RETURNTRANSFER => TRUE ); curl_setopt_array($ch, $options); $data = curl_exec($ch); curl_close($ch); // Adfox , //file_put_contents('request.txt', $data, FILE_APPEND); $parser=xml_parser_create('UTF-8'); xml_parse_into_struct($parser, $data, $vals, $index); $campReport = array(); $j = 0; for ($i = 0; $i < count($vals); ++$i) { if ($vals[$i]["tag"]=="CRITERIA") { $bannername = $vals[$i]["value"]; } if ($vals[$i]["tag"]=="FLIGHTNAME") { $flightname = $vals[$i]["value"]; } if ($vals[$i]["tag"]=="IMPRESSIONS") { $impressions = $vals[$i]["value"]; } if ($vals[$i]["tag"]=="CLICKS") { $clicks = $vals[$i]["value"]; $campReport[$j]['campaign'] = $id; $campReport[$j]['flightname'] = $flightname; $campReport[$j]['bannername'] = $bannername; $campReport[$j]['impressions'] = $impressions; $campReport[$j]['clicks'] = $clicks; $j += 1; } } return $campReport; } // $campIDs = getCampaigns(); // for ($i = 0; $i < count($campIDs); ++$i) { $campReport = getBanners($campIDs[$i]['id'], $startDate, $endDate); // data.txt // data.txt Cron for ($j = 0; $j < count($campReport); ++$j) { file_put_contents('/var/www/html/adfox/data.txt', $startDate."\t".$campReport[$j]['campaign']."\t".$campReport[$j]['flightname']."\t".$campReport[$j]['bannername']."\t".$campReport[$j]['impressions']."\t".$campReport[$j]['clicks']."\n", FILE_APPEND); // () echo 'Record created - '.$startDate.' - '.$campReport[$j]['bannername']."\n"; } }
æ°æ¥ïŒããšãã°9æ1ã4æ¥ïŒã«ã³ãŒããå®è¡ããstartDateãšendDateã®æ¥ä»ã01.09.15ãã09.09.15ã«çœ®ãæããŸãã ãã®çµæã9æ1æ¥ãã4æ¥ãŸã§ã®æ¯æ¥ã®åãããŒã®çµ±èšã¯ãdata.txtãã¡ã€ã«ã«èç©ãããŸãã
ããŒã¿ãã°ã©ãã«è¡šç€ºããã¹ã¯ãªãããèªåçã«æŽæ°ããããã«æ®ããŸãã ã°ã©ããæç»ããã«ã¯ã www.highcharts.com / demo / line-basicã䜿çšããŸã ã ã©ã€ãã©ãªãã€ã³ã¹ã¿ã³ã¹ã«ããŠã³ããŒãããããHighcharts Webãµã€ãã®ã©ã€ãã©ãªã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®äŸã§ã¯ã2çªç®ã®ãªãã·ã§ã³ã䜿çšããŸãã ãã¹ãŠã®äŸã®ã³ãŒãã¯ãã°ã©ãã®äžã®[JSFIDDLEã§ç·šé]ãã¿ã³ãã¯ãªãã¯ããŠãwww.highcharts.com / demo / line-basicã§è¡šç€ºã§ããŸãã
ã©ã€ãã©ãªãæ£ããæ©èœããã«ã¯ã jQueryãå¿ èŠã§ãã ãµã€ãããããŸãã¯ã³ã³ãœãŒã«ã§çŽæ¥/ var / www / html / adfoxãã©ã«ããŒã«ããŠã³ããŒãããŸãã
$ wget code.jquery.com/jquery-1.11.3.js
report.htmlãã¡ã€ã«ã«ãã£ãŒãã³ãŒããè¿œå ããŸãã
ã¬ã³ããªã³ã°ä»ãã®HTMLããŒãžã³ãŒã
<html> <head> <script src="jquery-1.11.3.js"></script> <script src="http://code.highcharts.com/highcharts.js"></script> <script src="http://code.highcharts.com/modules/exporting.js"></script> </head> <body> <script> // , data.txt var banners = []; // , , data.txt // CTR ( ) var dates1 = []; var shows1 = []; var clicks1 = []; var ctr1 = []; var dates2 = []; var shows2 = []; var clicks2 = []; var ctr2 = []; var dates3 = []; var shows3 = []; var clicks3 = []; var ctr3 = []; // data.txt $.get("data.txt", function(data){ var lines = data.split("\n"); for (var i = 0, len = lines.length; i < len; i++) { // , //console.log(lines[i]); // 6 , data.txt elements = lines[i].split("\t"); // , elements // ( - 0, 1) banners.push(elements[2]); } // , //console.log(banners); // bannerNames 3 Array.prototype.unique = function() { var tmp = {}, out = []; for(var i = 0, n = this.length; i < n; ++i) { if(!tmp[this[i]]) { tmp[this[i]] = true; out.push(this[i]); } } return out; } bannersNames = banners.unique().slice(0, 3); // , 3 //console.log(bannersNames); // data.txt , bannerNames for (var i = 0, len = lines.length; i < len; i++) { elements = lines[i].split("\t"); // data.txt , , if (elements[2] == bannersNames[0]) { dates1.push(elements[0]); shows1.push(parseInt(elements[4])); clicks1.push(parseInt(elements[5])); // toFixed(3) - CTR if (parseInt(elements[4]) > 0) { ctr1.push(Number(parseFloat(elements[5] / elements[4] * 100).toFixed(3))); } else { ctr1.push(0); } } // if (elements[2] == bannersNames[1]) { dates2.push(elements[0]); shows2.push(parseInt(elements[4])); clicks2.push(parseInt(elements[5])); if (parseInt(elements[4]) > 0) { ctr2.push(Number(parseFloat(elements[5] / elements[4] * 100).toFixed(3))); } else { ctr2.push(0); } } // if (elements[2] == bannersNames[2]) { dates3.push(elements[0]); shows3.push(parseInt(elements[4])); clicks3.push(parseInt(elements[5])); if (parseInt(elements[4]) > 0) { ctr3.push(Number(parseFloat(elements[5] / elements[4] * 100).toFixed(3))); } else { ctr3.push(0); } } } // , CTR ( ) // : [0.22, 0.25, 0.30, 0.24] //console.log(ctr1); //console.log(ctr2); //console.log(ctr3); // CTR $(function () { // container <div id="container"... $('#container').highcharts({ // title: { text: 'Campaign banners CTR', x: -20 //center }, // subtitle: { text: 'Source: ADFOX', x: -20 }, // dates1 xAxis: { categories: dates1 }, // yAxis: { title: { text: 'CTR %' }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, // tooltip: { valueSuffix: '%' }, // legend: { layout: 'vertical', align: 'right', verticalAlign: 'middle', borderWidth: 0 }, // , : CTR series: [{ name: bannersNames[0], data: ctr1 }, { name: bannersNames[1], data: ctr2 }, { name: bannersNames[2], data: ctr3 }], credits: { enabled: false } }); }); }); </script> <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div> </body> </html>
ãã¡ã€ã«ãadfoxãã©ã«ããŒã«ããããšãå¿ããã«ãreport.htmlããŒãžããã©ãŠã¶ãŒã§éããŸãã
ã¹ã¯ãªãããæ¯æ¥æŽæ°ããããã«ããŸãïŒããšãã°ãã€ã³ã¹ã¿ã³ã¹ã®ã·ã¹ãã æéã«å¿ããŠ8:00ã«ãã³ã³ãœãŒã«ã®dateã³ãã³ãã§ç¢ºèªã§ããŸãïŒã ãããè¡ãã«ã¯ãã³ã³ãœãŒã«ã§ä»¥äžãå®è¡ããŸãã
$ crontab -e
ããã©ã«ãã§ã¯ãvimãšãã£ã¿ãŒãéããŸãã ãã¡ã€ã«ãç·šéããã«ã¯ããiãïŒç·šéã¢ãŒãïŒãæŒããŠæ¬¡ã®è¡ãè¿œå ããŸãïŒShift + Insã䜿çšããŠãšãã£ã¿ãŒã«è²Œãä»ããŸãïŒã
00 08 * * * / usr / bin / php /var/www/html/adfox/daily.php> / var / www / html / adfox / out
次ã«ãescïŒç·šéã¢ãŒããçµäºïŒãæŒããŠãïŒwqããšå ¥åããä¿åããŠçµäºããŸãã ã³ã³ãœãŒã«ã«æ¬¡ã®è¡ã衚瀺ãããŸãã
crontabïŒæ°ããcrontabã®ã€ã³ã¹ããŒã«
ã¹ã±ãžã¥ãŒã«èšå®ã確èªããã«ã¯ïŒ
$ crontab -l
00 08 * * * / usr / bin / php /var/www/html/adfox/daily.php> / var / www / html / adfox / out
outãã¡ã€ã«ã§ã¯ãcronã¿ã¹ã¯ã®çµæã远跡ã§ããŸãã ããšãã°ãã¹ã¯ãªããã®å®è¡äžã«ãšã©ãŒãçºçããå Žåã
AWSã§ã®Cronã®è©³çŽ°ïŒ docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-extend-cron.html
ãã¹ãŠæºåå®äºã§ãã åèšã§ãæšæ¥ã®æšæ¥ã®æšæ¥ã®å©çšå¯èœãªãã¹ãŠã®ãããŒã®ã€ã³ãã¬ãã·ã§ã³ãšã¯ãªãã¯ãæ¯ææŽæ°ããã¹ã¯ãªããããããŸãã ãŸããéå»æ°æ¥éã®CTRãããŒã®ãã€ããã¯ã¹ããã€ã§ã確èªã§ããHTMLããŒãžããããŸãã AWSã«ã¯ãå®å šãªããŒã¿ã¢ã¯ã»ã¹ãèšå®ããããã®å€ãã®ãªãã·ã§ã³ããããŸãã ãŸãããã®ã¢ãããŒããæ¹åããªãããMySQLããŒã¿ããŒã¹ã«ããŒã¿ãæžã蟌ãããšãã§ããŸããããã¯ãããã¹ããã¡ã€ã«ãããäœæ¥ãã¯ããã«ç°¡åã§ãã ãã®ã¢ãããŒãã«ãããAdfoxãå®æçã«äœ¿çšããªããæéãç¯çŽã§ããããšãé¡ã£ãŠããŸãã