控制不同网站上横幅的存在和外观

时间:2013-11-08 09:11:50

标签: php banner

我们有一面旗帜。此横幅位于不同的网站 - 合作伙伴。我们没有这些网站的管理员权限。横幅必须在每个网站上。但是如何控制呢? 它可以手动完成,但如果有方法自动完成它会很棒(特别是当网站列表很大时)。 横幅必须可见。这意味着只检查每个站点上的HTML代码是不够的。必须考虑JavaScript和CSS,因为可以使用这些工具轻松隐藏横幅。 我认为这是一项常见的任务,但我在网上找不到任何东西。任何想法和链接将不胜感激。

1 个答案:

答案 0 :(得分:1)

简而言之:没有办法。这意味着 - 您无法确定合作伙伴网站的每位访问者都会100%显示横幅广告。

为什么不可能?

  • 首先,AdBlock这样的事情 - 是的,即使一切顺利,大多数人都不希望看广告,所以他们可以自由使用任何工具来禁用广告。 重要提示:AdBlock会在发送请求之前检查请求URI &从服务器检索内容,因此它的工作方案是'加载前阻止',而不是'加载&然后隐藏'。这意味着 - 如果您的横幅广告将被添加到黑名单中 - 将不会向客户提出任何请求。
  • 好的,我们假设我们已经将所有客户端内容单独留下并仅与合作伙伴的网站打交道。即从那里我们假设客户没有“邪恶”的东西阻止你的横幅出现:

我们可以做些什么?

乍一看,使用PHP HTTP_REFERER环境变量中的$_SERVER字段。使用它,您可以检查哪个网站请求您的横幅。让它成为一张图片,这样您就可以轻松执行检查:

function checkReferer($referer)
{
   //this could also be retrieved from config or DB:
   $clients = [
      //client name with available referrers:
      'Lorem Ipsum' => ['page1_address.php', 'page2_address.php']
   ];
   //get client:
   $client = key(array_filter($clients, function($referrers) use ($referer)
   {
      return in_array($referer, $referrers);
   }));
   //perform some DB updates, which set state of $client
}

//some stuff
checkReferer($_SERVER['HTTP_REFERER']);

//sending image:
$image = '/path/to/image.png';
header('Content-Type: image/png');
readfile($image);
exit();

它是如何工作的?它将检索从中请求banner.php脚本的网页地址。并非所有客户端都会发送此标头(我的意思是HTTP_REFERER - 它是非强制性的),但在大多数情况下它将包含有效地址。在这种情况下,您可能会依赖于此,因为您的合作伙伴兴趣是正确的(因为您正在检查它们)。因此:当访问者打开您的合作伙伴的网站时,将要求您提供脚本。例如:

<!-- somewhere on partner's side in HTML: -->
<img src='http://your-site.com/banner.php'/>

替代:您可能希望拥有更加稳固的条件。然后,您需要为每个合作伙伴分配一些唯一的代码,并告诉它该代码。您的图片将如下所示:

<img src='http://your-site.com/banner.php?code=codeOfThisPartner'/>

- 在PHP中,您只需在合作伙伴及其代码之间建立1:1关系:

function checkPartner($code)
{
   //this could also be retrieved from config or DB:
   $clients = [
      'codeOfThisPartner' => 'Lorem Ipsum',
      //...
   ];
   //get client:
   $client = $clients[$code];
   //perform some DB updates, which set state of $client
}
//the rest is the same, code will be in $_GET['code'], obviously

这有什么问题?

如果我们假设客户的浏览器没有停用广告,那么上述方法仅适用于合作伙伴的网站未隐藏横幅的情况。正如你所提到的,可能有javascript隐藏你的横幅。例如,他们可以执行脚本调用,然后将其隐藏在隐藏块中。所以 - 这是一种过滤只有好伙伴的方法。

还可以提出其他哪些方法?

例如,您可以尝试使用cURL请求您的合作伙伴的网页。由于您已经提到过您的横幅广告中有很多合作伙伴的网页,因此您最好使用curl_multi_*来提高查询速度。算法将是:

  • 请求合作伙伴的网站
  • 检查您的横幅是否存在于HTML代码中。例如,您可以向合作伙伴询问放置横幅的严格表格(甚至可能是横幅链接中的某个合作伙伴代码)

JavaScript怎么样?

常见答案:没有。有数百种方法可以破坏你的横幅。还有百万种隐藏这一事实的方法,即html / javascript中的某些东西会破坏你的横幅(javascript中的.eval(),是的)。除非你用javascript引擎编写完整的浏览器仿真,否则你无法自动检查。 html渲染器(甚至在那里很难回答'将该横幅出现在屏幕的正确位置')。如果您不信任您的合作伙伴,那么,不幸的是,您必须手动检查该网站 - 即您只能通过亲眼检查来100%确定

旁注

您还应该记住,不同的Web浏览器会以不同的方式处理标记。所以在某些情况下,它可能不是“邪恶的伙伴,隐藏你的横幅”的情况,而是一个“不支持功能”X“或功能”Y“e t.c.”的愚蠢浏览器。也许它可能也被视为你伙伴方面的问题,但要明确这一点 - 你应该告诉他,哪些浏览器必须正确显示横幅。

那么,该怎么办?

不可能进行全自动检查并不意味着您不应该做任何事情。您可以执行某些类型的检查,例如上面的建议 - 我认为。这会将你的伴侣分成两部分:那些通过你支票的人和那些失败的人。所以,至少你不必手动检查第一部分 - 因此,这是一种节省时间的方法。第二部分只能手动检查100%确定 - 每个特定的情况应该单独处理,这样你就可以确定你的伴侣是100%的错误。