【问题标题】:PHP file_get_contents and VAST xmlPHP file_get_contents 和 VAST xml
【发布时间】:2013-05-01 15:19:04
【问题描述】:

这就是我想要做的:从 URL 下载 xml VAST 并在 PHP 中本地保存在 XML 文件中。为此,我使用了 file_get_contents 和 file_put_contents。这是我正在使用的脚本:

<?php
$tid=time();

$xml1 = file_get_contents('http://ad.afy11.net/ad?enc=4&asId=1000009566807&sf=0&ct=256');
file_put_contents("downloads/file1_$tid.xml", $xml1);
echo "<p>file 1 recorded</p>";
?>

有问题的 URL 是一个真实的 URL,它将提供一个 xml VAST 代码。我的问题是,当我保存 de 文件时,它会写一个空的 VAST 标记:

<?xml version="1.0" encoding="UTF-8"?> <VAST version="2.0"> </VAST>

但如果我在 Firefox 上运行,它实际上会提供一些代码:

<VAST version="2.0"><Ad id="Adify"><Wrapper><AdSystem>Eyeblaster</AdSystem><VASTAdTagURI>http://bs.serving-sys.com/BurstingPipe/adServer.bs?cn=is&c=23&pl=VAST&pli=6583370&PluID=0&pos=7070&ord=4288438534]&cim=1</VASTAdTagURI><Impression>http://ad.afy11.net/ad?ipc=NMUsqYdyBUCjh4-i2HwWfK1oILM2AAAAN6-rBkSy8JNMZcuzAlj1XlSySpo6Hi7xEYULS+UgOVN5D3UuhFUVSWbFHoLE-+3su0-QnGgZgMJyiTm-R6O+yQ==</Impression><Creatives/></Wrapper></Ad></VAST>

不是 100% 的时候,他们确实限制了请求的数量,但是当我尝试使用 PHP 脚本保存文件时,这种情况更常见。

这是一种让 PHP 脚本模仿浏览器的方法吗????我不知道这是否是正确的问题,但这是我唯一能想到的为什么我在使用 php 脚本时得到一个空的 VAST 标记,而在使用浏览器时得到一个完整的标记。

有什么想法吗???

谢谢:)

更新:在做了一些额外的研究后,我发现了一些关于 stream_context_create 函数的信息,但我无法复制浏览器的结果。

这是我的新代码:

<?php

$tid=time();

$opts = array('http' =>
    array(
        'method'  => 'GET',
        //'user_agent '  => "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100301 Ubuntu/9.10 (karmic) Firefox/3.6",
        'header' => array(
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*\/*;q=0.8
'
        ), 
    )
);
$context  = stream_context_create($opts);


$xml1 = file_get_contents('http://ad.afy11.net/ad?enc=4&asId=1000009566807&sf=0&ct=256');
file_put_contents("downloads/file1_$tid.xml", $xml1);
echo "<p>file 1 recorded</p>";
echo "<textarea rows='6' cols='80'> $xml1 </textarea> ";
echo "<br><iframe src='http://ad.afy11.net/ad?enc=4&asId=1000009566807&sf=0&ct=256' width='960' height='300'></iframe>";
?>

我还添加了一个 iframe 来比较浏览器何时获取正确的文件以及何时没有获取 php 函数。

【问题讨论】:

  • 请联系此服务的供应商以获取您的支持选项。
  • 这不是关于供应商,而是关于找出 file_get_contents 与 firefox 的不同之处。
  • 嗯,这很容易说:一无所有。总而言之,这个功能与firefox完全不同。什么都没有,因为即使我在浏览器中打开这个 URL,我也得到了 file_get_contents 得到的东西。这就是为什么最好联系这些 Web 服务的供应商以获得一级支持,以便了解需要如何执行请求、何时发生此类变化等等。
  • 再次感谢,但我仍然说供应商没有任何问题。正如我之前所说,我在这里测试了 url,当你在 firefox 上加载 url 时,它将加载 20 个中的 19 个,当我使用 file_get_contents 加载时,它将加载 100 个中的 0 个。url 是由服务器生成的,这可能是查看请求并忽略使用 file_get_contents 生成的请求。我你的情况可能是一样的,你在哪里???无论如何,我认为我需要的只是使 file_get_contents 的行为就像服务器上的 firefox 一样,我相信我会开始得到结果。
  • 显然,正如您的目击所显示的那样,两者之间存在差异(我没有忽略,我之前已经写过,firefox 和 filegetcontents 是完全不同的)。你联系供应商只是为了从他那里了解究竟需要匹配哪个规范才能获得这些文件。就您在我的发现中所关心的而言,我无法在 chrome(不是 firefox)中使用 100 个中有 0 个有问题的 URL,就像您的 filegetcontents 描述一样。因此,对于我来说,使用浏览器永远不会有 20 分中的 19 分。

标签: php xml vast


【解决方案1】:

经过一番研究,我找到了解决问题的方法,我想在这里分享以供将来参考。 使用 file_get_contents 传递一些 HTTP 标头的想法。我用这个来做到这一点:

$opts = array(
            'http'=>array(
                        'method'=>"GET",
                        'header'=>array("Accept-language: en", "Content-Type: multipart/form-data\r\n"),
                        'user_agent'=>    $_SERVER['HTTP_USER_AGENT']
                        )
            );

$context = stream_context_create($opts); 

$xml4 = file_get_contents($url1, true, $context);

就是这样,现在我可以像使用浏览器一样获得相同的xml了。

【讨论】:

  • 三年后,当你有同样的问题,你找到了自己的答案并且仍然有效时,这不是太棒了:)
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多