Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Thursday, 26 November 2020

Facebook’s latest ad tool fail puts another dent in its reputation

Reset yer counters: Facebook has had to ‘fess up to yet another major ad reporting fail.

This one looks like it could be costly for the tech giant to put right — not least because it’s another dent in its reputation for self reporting. (For past Facebook ad metric errors check out our reports from 2016 here, here, here and here.)

AdExchanger reported on the code error last week with Facebook’s free ‘conversion lift’ tool which it said affected several thousand advertisers.

The discovery of the flaw has since led the tech giant to offer some advertisers millions of dollars in credits, per reports this week, to compensate for miscalculating the number of sales derived from ad impressions (which is, in turn, likely to have influenced how much advertisers spent on its digital snake oil).

According to an AdAge report yesterday, which quotes industry sources, the level of compensation Facebook is offering varies depending on the advertiser’s spend — but in some instances the mistake means advertisers are being given coupons worth tens of millions of dollars.

The issue with the tool went unfixed for as long as 12 months, with the problem persisting between August 2019 and August 2020, according to reports.

The Wall Street Journal says Facebook quietly told advertisers this month about the technical problem with its calculation of the efficacy of their ad campaigns, skewing data advertisers use to determine how much to spend on its platform.

One digital agency source told the WSJ the issue particularly affects certain categories such as retail where marketers have this year increased spending on Facebook and similar channels by up to 5% or 10% to try to recover business lost during the early stages of the pandemic.

Another of its industry sources pointed out the issue affects not just media advertisers but the tech giant’s competitors — since the tool could influence where marketers chose to spend budget, so whether they spend on Facebook’s platform or elsewhere.

Last week the tech giant told AdExchanger that the bug was fixed on September 1, saying then that it was “working with impacted advertisers”.

In a subsequent statement a company spokesperson told us: “While making improvements to our measurement products, we found a technical issue that impacted some conversion lift tests. We’ve fixed this and are working with advertisers that have impacted studies.”

Facebook did not respond to a request to confirm whether some impacted advertisers are being offered millions of dollars worth of ad vouchers to rectify its code error.

It did confirm it’s offering one-time credits to advertisers who have been ‘meaningfully’ impacted by the issue with the (non-billable) metric, adding that the impact is on a case by case basis, depending on how the tool was used.

Nor did it confirm how many advertisers had impacted studies as a result of the year long technical glitch — claiming it’s a small number.

While the tech giant can continue to run its own reporting systems for b2b customers free from external oversight for now, regulating the fairness and transparency of powerful Internet platforms which other businesses depend upon for market access and reach is a key aim of a major forthcoming digital services legislative overhaul in the European Union.

Under the Digital Services Act and Digital Markets Act plan, the European Commission has said tech giants will be required to open up their algorithms to public oversight bodies — and will also be subject to binding transparency rules. So the clock may be ticking for Facebook’s self-serving self-reporting.



from TechCrunch https://ift.tt/3laCRZd
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support