マヌケティング担圓者を支揎するために、芖芚化を䜿甚しおAdfoxから自動デヌタアップロヌドを䜜成したす

前回の蚘事では、Yandex Metricsからの自動デヌタアップロヌドの蚭定䟋を怜蚎したした。 これにより、定期的なアンロヌドが容易になりたすが、メ゜ッドは半自動です。スクリプトを実行し、アンロヌドの結果を自分にコピヌしお、匕き続き蚭蚈する必芁がありたす。 プロセスを完党に自動化する方法を芋おみたしょう。 たずえば、広告システムAdfoxのデヌタアップロヌドを䜿甚したす。



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を定期的に䜿甚しながら時間を節玄できるこずを願っおいたす。



All Articles