Posts Tagged ‘投放’

广告投放问题剖析

March 7th, 2010

本文英文原文地址:http://www.openxtips.com/2009/06/tip-14-troubleshooting-banner-delivery/

对于新的OpenX用户来说,对于广告投放出现的各种问题会很头大。即使是对于有经验的OpenX用户,也时不时会在广告投放上遇到一些困难。

您也知道,OpenX广告没有投放出来的原因有很多,很难有一个简单的方案能解决这个问题。幸运的是确认问题在哪的过程不是太难,下面我们一起来看下如何找到广告投放问题的Check List:

#1.0: 是否有广告在投放?

OpenX服务器是否可以投放广告(即使这些广告不是您想要的),或者说完全没有广告在投放?如果有广告可以投放,前往#2.0,如果确认没有广告在投放,前往#1.1。

#1.1: 您正在使用的是直接选择么?

如果您正尝试使用OpenX的直接选择方式投放广告,而非使用广告代码,那么请先尝试通过广告位投放广告。直接选择投放方式是一个非常复杂的过程,主要是针对OpenX的高级用户。如果您的广告不能正常投放,有可能只是因为您还不是一个高级的用户。所以,请先尝试使用广告代码进行投放。

#1.2: 您试过重新生成广告代码么?

有时候,广告不能投放的原因是一个简单的复制粘贴错误。尝试重新生成广告代码,并且复制粘贴到您的网站,看看有没有用。

如果还是不行,尝试将广告代码放到一个简单的无内容HTML页面。有可能是您页面的内容和广告代码之间有冲突。将广告代码放到一个简单的HTML页面可以保证不是页面内容与代码冲突的问题。

#1.3: 您尝试过使用别的广告代码么?

有可能是您选择的广告代码本身有问题,或者只是因为您所选择的广告代码不适合投放对应的广告类型,举个例子来说,图片广告代码只能显示图片广告,而HTML广告是不能在此类图片广告代码上线时的。

尝试别的广告代码类型,看看是不是有用。一般来说,Javascript代码适用于任何广告类型。

#1.4: 您确认广告位上有对应展示概率高于0%的有效广告么?

检查广告位显示概率界面,确认广告位有对应展示概率高于0%的有效广告。如果没有这种广告,您需要链接一些有效广告到广告位上,就可以看到广告了。

另外,如果您使用广告位链来投放另外一个广告位上的广告,尝试重新生成另外的广告位的广告代码并直接使用,看看是否有用。可能您的广告位链并没有设置好。

#1.5: 确认广告位上有可用的广告投放么?

根据实际经验,广告位上不显示广告,实际上是由于广告已经投放完了。举例来说,广告位上连接的所有广告都设置了一天显示一次,然后所有的广告都被显示过,于是乎对应的广告位就没有广告可以显示了。

由于有很多可能的投放限制或者频次限制导致广告无法显示,确认在广告位上有对应至少一个肯定可以投放的广告,来确认这个广告是否可以显示,而其他广告都不行。

#1.6: 您运行了广告屏蔽工具么?

广告屏蔽工具(类似Adblock Plus)会阻止广告展现。如果您正在运行此类工具,尝试禁止功能看看是不是可以看到广告。

#1.7: 确认广告代码服务器调用问题

如果上面所有步骤都试过后都没有用,那很有可能是广告代码在服务器调用的时候出了问题。为了找到问题在哪,您需要一步步的查看服务器调用过程。

举一个简单的例子,用一个简单的HTML页面,页面里没有任何内容,只有一个简单的OpenX Javascript代码,运行这个页面:假设OpenX服务器运行在”www.example.com”域名下。

<html>
<head>
  <title>Text OpenX Page</title>
</head>
<body>

<!--/* OpenX Javascript Tag v2.8.0 */-->
<script type='text/javascript'><!--//<![CDATA[
  var m3_u = (location.protocol=='https:'?'https://www.example.com/openx/www/delivery/ajs.php':'http://www.example.com/openx/www/delivery/ajs.php');
  var m3_r = Math.floor(Math.random()*99999999999);
  if (!document.MAX_used) document.MAX_used = ',';
  document.write ("<scr"+"ipt type='text/javascript' src='"+m3_u);
  document.write ("?zoneid=1");
  document.write ('&amp;cb=' + m3_r);
  if (document.MAX_used != ',') document.write ("&amp;exclude=" + document.MAX_used);
  document.write (document.charset ? '&amp;charset='+document.charset : (document.characterSet ? '&amp;charset='+document.characterSet : ''));
  document.write ("&amp;loc=" + escape(window.location));
  if (document.referrer) document.write ("&amp;referer=" + escape(document.referrer));
  if (document.context) document.write ("&context=" + escape(document.context));
  if (document.mmm_fo) document.write ("&amp;mmm_fo=1");
  document.write ("'><\/scr"+"ipt>");
//]]>--></script>

</body>
</html>

当用户浏览器运行这个页面代码时,会从您的OpenX服务器上调用多个不同的URL。您可以通过工具(类似IE下的iehttpheaders或者Firefox下的LiveHTTPHeaders)看到这些URL调用。下面是当页面运行时被调用的URL:

  • http://www.example.com/openx/www/delivery/ajs.php?zoneid=1&cb=15028591281&charset=UTF-8&loc=http%3A//www.example.com/test.html
  • http://www.example.com/openx/www/delivery/ai.php?filename=468×60.gif&contenttype=gif
  • http://www.example.com/openx/www/delivery/lg.php?bannerid=2&campaignid=1&zoneid=1&loc=http%3A%2F%2Fwww.example.com%2Ftest.html&cb=0c9f6849c2

您可以看到,第一个URL是用来获取显示广告的代码,第二个URL用来获取实际的广告图片,第三个URL用来调用1×1 .gif图片以记录广告展现PV。为了找到为什么广告显示不出来,第一个URL是最重要的,因为它是用来调用显示广告的代码。

将第一个URL通过浏览器打开,将会返回下面的结果:

var OX_cacd23fb = '';
OX_cacd23fb += "<"+"a href=\'http://www.example.com/openx/www/delivery/ck.php?oaparams=2__bannerid=2__zoneid=1__cb=b5fcef6ca8__oadest=http%3A%2F%2Fwww.openxtips.com%2F\' target=\'_blank\'><"+"img src=\'http://www.example.com/openx/www/delivery/ai.php?filename=468x60.gif&contenttype=gif\' width=\'468\' height=\'60\' alt=\'\' title=\'\' border=\'0\' /><"+"/a><"+"div id=\'beacon_b5fcef6ca8\' style=\'position: absolute; left: 0px; top: 0px; visibility: hidden;\'><"+"img src=\'http://www.example.com/openx/www/delivery/lg.php?bannerid=2&amp;campaignid=1&amp;zoneid=1&amp;loc=http%3A%2F%2Fwww.example.com%2Ftest.html&amp;cb=b5fcef6ca8\' width=\'0\' height=\'0\' alt=\'\' style=\'width: 0px; height: 0px;\' /><"+"/div>\n";
document.write(OX_cacd23fb);

这个是用来显示广告HTML内容的Javascript代码。

很显然,上面的示例和您的实际情况是不一样的,因为您不会使用“www.example.com”域名,可能您会将OpenX安装到不同的路径,也可能您用的不是Javascript代码。无论如何,基础的过程都是一样的,在包含广告代码的页面运行时,您看到的第一个URL调用应该就是用来产生广告内容的。

如果您发现本次调用并没有任何广告内容出现,那么很有可能是您的广告服务器安装出了些问题导致广告不能正常显示。可以通过下面的步骤来定位问题。

#1.7.1: 检查Web服务器日志

查看您的Web服务器日志,尝试找到用来返回广告内容的URL地址。如果这些URL被调用时出现了错误,将会在错误日志里有所记录。通过日志可以帮您找到为什么调用出错。最常见的调用错误原因是:

  • 文件或者目录的权限问题,没有权限调用OpenX下“var/cache”目录下的Cache文件或者没有权限运行OpenX下的某些代码。
  • 数据服务器出错导致无法读取必须的广告信息(举例来说,数据库服务器没有运行,数据库有错误数据或错误表,数据库的用户名密码或者权限被修改过等等)

#1.7.2: 打开调试状态

如果上面的Web服务器日志仍然不能帮助您找到为什么广告内容无法返回,您需要尝试打开系统调试状态以帮助您找到更多的信息。无论如何,在做这件事情前一定要小心,因为所有的错误信息都会在生产系统上时时显示。所以,这个是最后一招。

要想打开系统调试状态,编辑OpenX配置文件,按下面的说明修改:

[debug]
production=1

将production值设为0(或者”false”)。

同时,您可能需要修改PHP设置以显示错误信息。

上面这些操作只能让您看到一些错误信息,这些可能会帮助您找到错误并修改错误。如果实在没有办法修复,可以给OpenX的开发团队提交Bug

#2.0: 有广告显示,但不是想要的广告

有时候,广告可以显示,但是显示的不是应该出现的广告。举例来说,可能会出现下面几种状况:

  • 所有您看到的广告都不是您认为应该看到的;
  • 有些广告您认为应该看到的,但是从来都没有看到;
  • 广告显示的次数和您的期望不一样。

上面说的集中情况,下面这些步骤可能可以帮助您。

#2.1: 您使用的是正确的广告代码么?

一般来说,您看到的广告都不对的话都是因为使用的广告代码错了,经常都是在复制粘贴过程中弄错了。

尝试重新直接生成广告代码,并重新放到网站需要的位置。

#2.2: 您希望看到的广告看不到,确认其已经生效或者连接到广告位上了么?

重新确认下在广告位显示概率界面上,您期望显示的广告是有效的并且已经连接到您看到的广告位上了。另外重新确认下该广告的显示概率大于0!

#2.3: 您希望看到的广告看不到,是新加的广告或者最近刚刚修改过的么?

OpenX广告服务器使用缓存系统来保证广告投放的效率。因此,对广告的任何修改,包括连接新的广告到广告位上,将不会马上在投放中生效,除非广告缓存时间到了。

如果您希望看到的广告看不到,并且广告是新加的,或者是刚刚连接到广告位上,亦或是修改过,在缓存时间到了后在确认广告是否能够正常显示。

#2.4: 您希望看到的广告看不到,确认该广告设置了目标用户或者频次?

有时候,广告实际上是被投放了,但只是您看不到,可能是因为您设置了广告投放的目标用户或者频次,导致这些广告只能被其他特定用户看到。

使用广告位显示概率界面快速的查看下广告是否设置了目标用户或者频次,如果设置了,看下这些设置是否正确。您也可以查看下报表确认您看不到的广告是否被投放了。

#2.5: 您运行的是第三方的广告联盟广告么?

有时候,您可能在您的网站上看到了不应该出现的广告。常见的原因是因为您正在展示第三方的广告联盟广告,而第三方广告提供了新的广告主,亦或是提供了以前没有使用过的新广告格式。

尝试使用工具(类似IE下的iehttpheaders或者Firefox下的LiveHTTPHeaders)查看广告点击时的URL调用。这些可以帮您确认是哪个广告联盟在显示这些不期望展示的广告。

#2.6: 您在运行OpenX的Market么?

在OpenX 2.8版本,OpenX Market为网站主提供了为广告项目设置基础价格的功能,当某个OpenX Market里面的广告主希望付高于这个价格的钱来买这个广告展示的时候,OpenX Market将会代替原有广告项目的广告而显示这个广告主的广告。

虽然这个对于使用OpenX的发布商是一个好的消息,因为这是一种无风险的提升收入的方式。但同时也意味着任何时候,只要有OpenX Market的广告主愿意付更多的钱购买当前的广告展示,那所谓的“意外”广告就会被显示。

如果您发现当前显示的“意外”广告不是来自于第三方广告联盟,检查下广告项目,确认您是否打开了OpenX Market。这些可能是为什么您看到了“意外”广告的原因(令人高兴的赚钱广告!)。

理解OpenX的广告投放逻辑

March 1st, 2010

英文原文地址:http://www.openxtips.com/2009/04/tip-8-understand-the-banner-delivery-process/

广告调用过程中到底发生了什么?为什么我需要知道?这个问题很简单,虽然描述这个过程显得有些技术化,但是理解广告投放逻过程对于抓住广告投放逻辑至关重要,而且这个问题是理解其他OpenX主题的基础。

虽然下面描述的步骤主要针对OpenX2.8版本,但其步骤和早期版本差不多,只是以前的版本效率低一些而已。无论如何,基本的理念是一致的。

广告投放步骤

无论您使用何种广告代码,广告投放步骤都是一样的。经过一些环境初始化后,广告服务器使用下面的步骤来决定投放哪一个广告。

  1. 找到所有连接到该广告位的有效广告1
  2. 是否有Contract(Exclusive)项目下的有效广告?如果有,则进入下面的步骤:
    1. 是否有Contract(Exclusive)项目下的广告超过了投放限制2?如果有,抛弃掉这些广告。
    2. 是否有Contract(Exclusive)项目下的广告和当前广告代码不相容3?如果有,抛弃掉这些广告。
    3. 还有广告剩下么?如果有,进入下面的步骤:
      1. 通过项目权重/广告权重步骤选择一个广告。(下面有详细说明
      2. 使用所选广告ID和广告位ID记录一次请求。
      3. 显示广告。Display the banner.
      4. 使用所选广告ID和广告位ID记录一个PV日志。
  3. 如果当前点达到后,就不会有Contract(Exclusive)项目下的广告展现。
  4. 是否有Contract项目下的有效广告?如果有,进入下面的步骤:
    1. 是否有Contract项目下的广告超过了投放限制?如果有,抛弃掉这些广告。
    2. 是否有Contract项目下的广告和当前代码不相容?如果有,抛弃掉这些广告。
    3. 还有广告剩下么?如果有,进入下面的步骤:
      1. 随机Possibly 通过Contract项目广告投放步骤在这些广告中选择一个广告。(查看详情).
      2. 如果If 有广告被选择了:
        1. 使用所选广告ID和广告位ID记录一次请求。
        2. 显示广告。
        3. 使用所选广告ID和广告位ID记录一个PV日志。
  5. 如果当前点达到,就不会有Contract(Exclusive)项目下的广告可以展示,并且Contract项目下的广告也不会被展示。
  6. 是否有抄底项目下的有效广告?如果有,进入下面的步骤:
    1. 是否有抄底项目下的广告超过了投放限制?如果有,抛弃掉这些广告。
    2. 是否有抄底项目下的广告和当前代码不相容?如果有,抛弃掉这些广告。
    3. 还有广告剩下么?如果有,进入下面的步骤:
      1. 通过项目权重/广告权重步骤选择一个广告。(下面有详细说明
      2. 使用所选广告ID和广告位ID记录一次请求。
      3. 显示广告。
      4. 使用所选广告ID和广告位ID记录一个PV日志。
  7. 如果当前点达到,则不会有Contract(Exclusive)项目下的广告可以展示,并且Contract项目下的广告也不会被展示,另外抄底项目下的广告也不会被展示。
  8. 当前广告为是否通过广告位链连接到其他广告位?如果是,则按照第一步以新广告位重新执行。
  9. 如果当前点达到,则不会有Contract(Exclusive)项目下的广告可以展示,并且Contract项目下的广告也不会被展示,另外抄底项目下的广告也不会被展示,而且该广告为没有通过广告位链连接到其他广告为。
  10. 是否设置了默认广告?如果有,进入下面的步骤:
    1. 使用所选广告ID和广告位ID记录一次请求。
    2. 显示广告。
    3. 使用所选广告ID和广告位ID记录一个PV日志。
  11. 如果当前点达到,则没有广告可以展现。
  12. 展示一个1×1的空白广告。

项目权重/广告权重处理步骤

在上述步骤中,当测试Contract(Exclusive)项目下的有效广告或者测试抄底项目下的有效广告时,如果有超过一个广告可以投放,则按照以下步骤来决定投放哪一个广告,不同的版本步骤会稍有不同:

OpenX 2.8.1以后版本

  1. 在广告位对应的所有广告里,找到其所属项目。
  2. 加和所有项目的权重。
  3. 在0和所有项目加和权重区间生成一个随机数,通过这个随机数来选择一个项目。
  4. 针对所选项目下所有适合的广告,加和所有广告的权重。
  5. 在0和所有广告加和权重区间生成一个随机数,通过这个随机数来选择一个广告。

OpenX 2.8.0以前版本

  1. 针对所有广告位对应的广告,把每个广告的权重权重乘以对应的项目权重,获得一个总体广告/项目权重值。
  2. 加和所有广告的总体权重值。
  3. 将每个广告的总体权重值除以所有广告的总体权重值。(此步骤保证每个总体权重值加和后值为1)
  4. 在0和1之间生成一个随机数,通过这个随机数来选择一个广告,所以广告是基于项目/广告权重来进行分配投放的。

Contract项目广告选择步骤

在上述步骤中,在测试Contract项目下的广告投放时,如果有超过一个广告可以被投放,可以通过下面的步骤来决定投放哪一个广告:

  1. 在有效广告中查找优先级为10的Contract项目(如果有):
    1. 针对每个广告,选择预先计算的优先级值乘以一个预先计算的优先级参数值4得到总体优先级参数值。
    2. 加和所有广告的总体优先级参数值。
    3. 将每个广告的总体优先级参数值除以所有广告的总体优先级参数加和值。(此步骤保证新的总体优先级参数值加和后不大于1.5
    4. 在0和1之间生成一个随机值,通过这个随机数来选择一个广告,也有可能选择不了。
  2. 如果没有广告被选择,则针对Contract项目优先级为9,8,然后7的所有广告重复上面的步骤。直到对应的Contract项目优先级为1。

PV日志记录顺序

特殊广告代码(图片,无Cookie图片,XML-RPC)在展示广告后不记录PV日志,而对应的在记录请求的时候就被记录的PV日志。这就意味着,在展示广告之前,就已经记录了PV日志。这是因为这些广告代码,不适合投放PV日志记录的标记。6

  1. 一个有效的广告是指所属项目正在运行,而且该广告没有被禁止使用。[]
  2. 这个意味着,该广告实际上试图被投放出来,但是可能由于所设置的投放限制或者投放策略问题而没有被显示。 []
  3. 举个例子,HTML广告在使用图片或者无Cookie图片广告代码时就不能显示出来。因为那些广告代码只能投放图片广告。 []
  4. 这些值来自于Maintenance Prioritization Engine. []
  5. 如果Maintenance Prioritization Engine决定Contract项目不用使用所有可用流量来满足项目需求的时候,则可能加和的新优先级参数值小于1。[]
  6. 日志记录标记其实是一个单独投放的1×1 .gif像素图片,当然如果一个广告没有真正的投放的用户看到的网页上,则对应的广告PV不会记录。[]

单页面多广告投放加载速度提升应用

October 10th, 2009

英文原文地址:http://www.openx.org/en/docs/tutorials/single+page+call

单页面广告代码是一种可以帮助降低服务器负载并能提升广告加载速度的代码。单页面广告代码使用一个JS代码的方式实现通过一次HTTP请求就可以展示无数的广告创意,而不用每次显示广告时都向服务器发送一次请求,这样会降低页面加载速度。下面这个说明将告诉您如何使用单页面广告代码(SPC)并且使页面加载速度更快。

快速使用指南

该代码可以在OpenX用户界面里的网站设置一级拿到。

  • 选择Inventory,选择网站,进入所选网站,选择Invocation Code,即可看到以下界面:

spctab

  • 选择相应的代码设置
  • 点击“Generate(生成)”按钮
  • 将打开一个新的窗口详细说明头代码和广告代码,头代码需要放到所选网站的页面头部。复制并粘贴广告代码到您需要展示广告的地方。

注意:如果您需要在一个页面上重复显示同一个广告,需要保证在广告位列表部分的广告位索引是唯一的并且保证不会存在无广告可展现的情况。

通过单页面代码实现显示多个不同广告

下一步,看下如何使用单页面代码实现在同一页面上显示多个不同广告。下面说的这种方式是最有效的方式,可以实现只需要向服务器发送一次HTTP请求,从而提升页面加载速度。

分为两步:

  • 创建一个自命名的广告组,可以使用任何你愿意的名字。比如“zone_[zone_id]”
  • 需要显示广告的时候,使用上面的自命名名称即可。

1、创建一个自命名广告组

在头代码中创建一个广告位数组并放置到网站顶部。

如下:

<script type=’text/javascript’><!–// <![CDATA[
var OA_zones = {
'zone_4235_1' : 4235,
'zone_4235_2' : 4235,
'zone_4235_3' : 4235,
'zone_3906' : 3906,
'zone_1251' : 1251,
'zone_9632' : 9632
}
// ]]> –></script>
<script type=’text/javascript’ src=’http://example.com/delivery/spcjs.php’></script>

注意:上面例子中的“zone_3906”是广告位的名称(任何名称都可以使用,但必须是字母或数字。不用和Openx里面的名字匹配。必填项)。并且保证名字是在引号里面。在这个案例里面“3906”是广告位ID,将这个ID替换成相应的广告位ID即可使用。

注意:最后一个广告位记录不需要加“,”

注意:如果你希望在一个页面上多次显示同一个广告位,你需要为所对应的广告位ID定义多个名称,比如:’zone_4235_1′,’zone_4235_2′。

2、在调用广告时使用广告位名称

在网站代码的<body>部分,通过给OA_show()函数传递您在上面数组中定义的广告位名称来实现。如:

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_4235_1');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_4235_2');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_4235_3');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_3906');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_1251');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_9632');
// ]]> –></script>

注意:在使用自命名的广告位时,只有上面定义过的广告位名称才可以传给OA_show()函数。

3、实际应用

下面的案例将标明如何在页面代码中添加相关代码。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>
<head>
<meta http-equiv=”content-type” content=”text/html; charset=UTF-8″ />
<title>Example usage of Single Page Call tags/title>

<script type=’text/javascript’><!–// <![CDATA[
var OA_zones = {
'zone_4235_1' : 4235,
'zone_4235_2' : 4235,
'zone_4235_3' : 4235,
'zone_3906' : 3906,
'zone_1251' : 1251,
'zone_9632' : 9632
}
// ]]> –></script>

<script type=’text/javascript’ src=’http://example.com/delivery/spcjs.php’></script>

</head>

<body>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_4235_1');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_4235_2');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_4235_3');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_3906');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_1251');
// ]]> –></script>

<script type=’text/javascript’><!–// <![CDATA[
OA_show('zone_9632');
// ]]> –></script>

</body>
</html>

点击此链接将进入一个帖子说明如何在单页面代码中传递参数