如何在访问另一个站点之前开始与一个站点的会话?

时间:2018-12-20 22:18:42

标签: php

我想从一个网站提取XML数据。但是,在被授权读取此类数据之前,我必须先与另一个建立连接。

我知道这个问题很模糊,我会尽力回答任何问题。

我必须从站点中提取XML数据(我们称其为site2)。但是,为了查看此数据,我必须首先访问链接中具有用户ID的site1。我完全不确定这是如何工作的,但是当我只是先访问site1,然后在浏览器中访问site2时,它是如何工作的。但是,由于我对正在发生的事情缺乏了解,我不知道如何在PHP中实现它。

我加入了一些注释行,因为这是我尝试过的方法,但最终没有任何内容打印到屏幕上。照原样,我提取了很少的数据,而无需先访问site1。

libxml_use_internal_errors(true);
#header('Content-Type: text/html');
#header("Location: site1");

$url = "site1.php?user_id=guest1";
$response = file_get_contents($url);

$url = "site2.php";
$response = file_get_contents($url);


print ($response);
$data = simplexml_load_string($response);
//print_r($data);
echo '<br>';

预期结果:大约100行XML数据

实际结果:只有一个。

2 个答案:

答案 0 :(得分:1)

是的,这是一个模糊的问题,但是,如果site2正在从site1(可能是子域?)中寻找cookie,那么使用PHP curl的cookiejar可能会有所帮助。

将您的请求从file_get_contents($url)更改为使用curl请求。

在curl请求中,确保您链接到服务器上的空.txt文件(这样可以存储Cookie)。

当您向site2发送请求时,它将发送您从site1收到的cookie。

示例:

$cookiejar = 'cookiejar.txt';
// Delete the old cookies from the last request:
if (file_exists($cookiejar)) unlink($cookiejar);

$ch = curl_init();

// Set our curl options:
$url = "site1.php?user_id=guest1";
curl_setopt_array($ch, array(
  CURLOPT_URL            => $url,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_CUSTOMREQUEST  => "GET",
  CURLOPT_FOLLOWLOCATION => false,
  CURLOPT_HEADER         => true,
  CURLOPT_COOKIEJAR      => $cookiejar, // Cookies saved
  CURLOPT_COOKIEFILE     => $cookiejar, // Cookies saved
));

// Execute curl and return results:
$result = curl_exec($ch);

/* DO WHATEVER YOU NEED TO DO HERE */

// Your new url:
$url = "site2.php";
curl_setopt_array($ch, array(
  CURLOPT_URL            => $url,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_CUSTOMREQUEST  => "GET",
  CURLOPT_COOKIEJAR      => $cookiejar, // Cookies loaded
  CURLOPT_COOKIEFILE     => $cookiejar, // Cookies loaded
));

// Execute curl and return results:
$response = curl_exec($ch);
// Close curl:
curl_close($ch);

您显然可以将这些curl请求自定义为所需的内容。

答案 1 :(得分:0)

所以,我知道了。

使用HTTPHeaderLive,我看到site1正在存储cookie。每次重新加载页面时,cookie都是相同的,因此我将其作为标头硬编码到我的PHP脚本中,并通过我的file_get_contents()调用将其发送,并且可以正常工作!

cookie在会话中过期,因此,我将在脚本中找到一种自动执行此操作的方法。但是我们现在很好。