【问题标题】:Using cURL to get google chart images through a proxy使用 cURL 通过代理获取谷歌图表图像
【发布时间】:2012-01-01 13:48:27
【问题描述】:

我需要从 Google Chart 获取图片,但我使用了代理。

使用下面的代码(更改 $url)我可以从其他网站获取图片,但不能从谷歌获取:

$url = 'http://chart.apis.google.com/chart?chs=450x270&chd=t:'.$values_list.'&cht=p&chl='.$labels_list.'&chco=80AF1B,FFFF8C&chf=bg,s,F8F8F8';

$img = '../uploads/tx_oriindicadores/triglo.png'; 

file_put_contents($img, t3lib_div::getURL($url));

getURL() 方法的代码使用 cURL 函数来连接和检索数据。

此时我只得到一个空文件。

为了从谷歌获取图像,我是否需要一些参数或配置?

谢谢。


getURL() 方法是 TYPO3 的原生方法,您可以在此页面中查看代码: http://doc-typo3.ameos.com/4.1.0/class_8t3lib__div_8php-source.html2342行

我通过网站后端传递参数。

【问题讨论】:

  • @AurimasL 我用更多信息更新了这个问题。
  • 你能不能在 getURL() 中的第一个 if() 分支之前 var_dump() 将 $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlUse'] 的值粘贴到这里(省略任何密码和其他敏感信息)。
  • @elazar var_dump 输出是 'string(1) "1"' 所以代码会通过方法的第一个 'if'。

标签: php curl proxy google-visualization


【解决方案1】:

尝试 var_dump()-ing 函数的结果。如果它是 FALSE,那么你可以通过添加一个 echo curl_error($ch); 就在 curl_close($ch); 之前在 getUrl() 函数中并发布错误消息。

【讨论】:

  • 同意。您也可以尝试添加curl_setopt($ch, CURLOPT_VERBOSE, 1);
  • 谢谢。我得到 bool(false) 和 echo curl_error($ch); 带来消息 The requested URL returned error: 400
  • 使用下面的代码我可以在不触及核心代码的情况下使用方法的错误检查:$report = array(); file_put_contents($img, t3lib_div::getURL($url,0,FALSE,$report)); echo $report['message'];
  • 好的,代理似乎不喜欢这个请求。尝试向该请求添加用户代理。尝试将 array('User-Agent: PHP-curl') 作为 getURL 请求的第三个参数。如果这不能解决问题,请使用真实浏览器的用户代理字符串尝试。
  • 它不起作用,但我不认为代理存在用户代理问题,因为我使用其他 Url 没有问题。问题只出在谷歌图表上。可能是因为是带参数的 URL。
【解决方案2】:

尝试将 url 与例如wget --save-headers 看看结果是什么。

然后更改 url/agent/cookie 设置,直到你让它工作。

然后回到 PHP。

【讨论】:

  • 使用 wget --save-headers 我得到了 ERROR 400 Bad Request。我以前从未使用过标头,您能建议我测试哪个吗?
  • 你可以使用这个网址:http://chart.apis.google.com/chart?chs=450x270&chd=t:25,25,50&cht=p&chl=A|B|C&chco=80AF1B,FFFF8C&chf=bg,s,F8F8F8
  • 它使用带引号的 url 与 wget 一起工作:wget "http://chart.apis.google.com/chart?chs=450x270&chd=t:25,25,50&cht=p&chl=A|B|C&c‌​hco=80AF1B,FFFF8C&chf=bg,s,F8F8F8"。现在我将使用 cURL 进行测试。
  • 经过不同的测试后,我发现问题出在标签中使用了空格,因此我将它们替换为 %20。没有必要更改任何其他内容。而且似乎使用 cURL 和 wget 的处理方式不同,但感谢您的提示。
【解决方案3】:

getURL 函数似乎可以抑制错误。删除错误抑制 (@),可能会出现一两个警告。

【讨论】:

  • 谢谢,虽然我这样做了,但没有任何警告。
  • 是的,但只能看到与我的代码无关的通知和严格标准消息。
【解决方案4】:

上面的函数是对的,问题是变量$labels_list中有空格。所以用%20替换空格解决了这个问题。

直接 URL 请求中的空格不是问题,但在 cURL 中有。

所以作为一般规则,在使用 cURL 时不要使用空格,而是使用 %20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2011-09-03
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多