【问题标题】:passing credentials in PHP cURL help在 PHP cURL 帮助中传递凭据
【发布时间】:2011-09-10 22:54:54
【问题描述】:

我正在尝试将凭据传递给一个网站,以便我可以在其上使用 file_get_contents 来提取一些数据,但它不起作用,我得到一个空白页面,所以知道这里出了什么问题吗?

<?php


$username="munged@ring.gil.com";
$password="Koin";

$url="confluence.rogersdigitalmedia.com";


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

$str= file_get_contents("confluence.rogersdigitalmedia.com/display/prodsupport/Team+Calendar");
echo $str;
?>

这是新代码,当我获取内容时它仍然无法工作,卡在登录屏幕......

<?php
$username="munged@gil.ro.com";
$password="Koin";

$url="confluence.rogersdigitalmedia.com";


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


//Replaced due to special chars in url for username and pass
//curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_USERPWD, urlencode($username) . ':' . urlencode($password));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

echo file_get_contents('http://confluence.rogersdigitalmedia.com/exportword?pageId=1114407');
?>

新代码:我知道$url 是我必须登录的URL,但我在$data 中输入了什么?我知道这是我的登录信息,但我该如何输入(例如, space )?

<?php
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}

【问题讨论】:

  • HTTP 响应标头是什么样的?你从服务器返回什么状态?

标签: php curl libcurl


【解决方案1】:

您可能需要转义用户名中的@

curl_setopt($ch, CURLOPT_USERPWD, urlencode($username) . ':' . urlencode($password));

这是因为某些字符(例如 @:)在 URL 中具有特殊含义。您需要对它们进行转义,以便服务器将它们视为字符,而不是指示有关 HTTP 请求的内容。

放弃所有这些。您的编辑表明您对 HTTP 的工作原理存在根本性的误解。您不能使用 CURL 将 HTTP 登录凭据传递给希望填写 Web 表单然后希望能够使用 file_get_contents(这是完全独立的 API 的一部分)登录的站点。

就您实际执行此操作的方式而言...首先,确定该站点是否具有 API。如果没有,请查明他们是否真的希望您进行屏幕抓取。对不允许的网站进行屏幕抓取将是非常糟糕的形式。事实上,这很可能违反了版权法。

其次,编程到 API。这意味着以网站强制执行的方式登录。这将包含表单值(您可能需要在CURLOPT_POSTFIELDS 中发送)和cookie(您需要在每个请求中使用它,可能使用CURLOPT_COOKIEFILE)。

努力了解客户端-服务器关系的工作原理,研究 API,不要只是在问题上扔代码并期望它能够正常工作。

【讨论】:

  • 没有@,我无法登录,因为除非我在我的名字后输入整个@ring.gil.com,否则它不会让我登录,所以需要这些...我该怎么办?编辑:谢谢我试试看。
  • 您需要转义该值,以便服务器意识到@ 字符是用户名的一部分。如果不编码,服务器会认为用户名是okh,服务器是ring.gil.com:Koin@confluence.rogersdigitalmedia.com
  • 现在怎么样了?我按照你说的方式编辑了它(或者如果我弄错了,至少我认为我做了,请纠正我),我仍然得到相同的登录屏幕
  • 它没有版权法,该网站属于我所在的公司,但它是外部托管的,并且需要由公司认证的登录名,我所需要的只是从日历中读取数据,例如作为一个名字......我从 4 周开始就被困在这个问题上,我只想结束它......谢谢,是的,该网站有一个 api,但它对数据提取 api 没有用,称为 REST api。
  • 在这种情况下不会违反版权法。但是您需要确定登录到另一台服务器所需的数据。我帮不了你。据推测,设计另一个网站的人将能够做到。而且没有理由为 REST 原则设计的 API 不能进行数据提取......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2011-05-10
  • 2011-01-03
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多