передача учетных данных в справке PHP cURL - PullRequest
5 голосов
/ 08 июня 2011

Я пытаюсь передать учетные данные на веб-сайт, чтобы я мог использовать 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;
?>

Вот новый код, который все еще не работает, застрял на экране входа в систему, когда я получаю содержимое .... screenshot

<?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?Я знаю, что это мои данные для входа в систему, но как мне их выразить (например, пробел )?

<?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;
}

1 Ответ

4 голосов
/ 08 июня 2011

Возможно, вам нужно экранировать @ в имени пользователя:

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

Это потому, что некоторые символы (например, @ и :) имеют специальные значения в URL. Вам необходимо экранировать их, чтобы сервер обрабатывал их как символы, а не как указание чего-либо о HTTP-запросе.

Удали все это. Ваше редактирование показывает, что у вас есть фундаментальное неправильное представление о том, как работает HTTP. Вы не можете использовать CURL для передачи учетных данных HTTP-входа на сайт, который ожидает, что веб-форма будет заполнена, а затем вы сможете войти в систему с помощью file_get_contents (который является частью совершенно отдельного API).

С точки зрения того, как вы на самом деле это делаете ... Сначала выясните, есть ли у сайта API. Если это не так, выясните, действительно ли они хотят, чтобы вы снимали экран. Было бы очень плохой формой для скрининга веб-сайта, который не позволяет это. На самом деле это может быть нарушением закона об авторском праве.

Во-вторых, программа для API. Это означает, что нужно войти в систему так, как это делает сайт. Это будет со значениями формы (которые вам нужно будет отправить в CURLOPT_POSTFIELDS, вероятно) и файлами cookie (которые вам нужно будет использовать в каждом запросе, вероятно, используя CURLOPT_COOKIEFILE).

Работайте над пониманием того, как работают отношения клиент-сервер, изучайте API, а не просто проверяйте код проблемы и ожидайте, что она будет работать.

...