Php 如何在访问另一个站点之前启动与一个站点的会话?

Php 如何在访问另一个站点之前启动与一个站点的会话?,php,Php,我想从一个网站中提取XML数据。但是,我必须先与其他人建立连接,然后才能被授权读取此类数据 我知道这个问题很模糊,我会尽力回答任何我能回答的问题 我必须从站点(我们称之为site2)提取XML数据。但是,为了查看这些数据,我必须首先访问链接中有用户id的site1。我完全不知道这是如何工作的,但当我只是先访问site1,然后在浏览器中访问site2时,它就工作了。然而,我不知道如何在PHP中实现这一点,可能是因为我对所发生的事情缺乏了解 我包括了一些注释掉的行,因为这些都是我尝试过的东西,但最终

我想从一个网站中提取XML数据。但是,我必须先与其他人建立连接,然后才能被授权读取此类数据

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

我必须从站点(我们称之为site2)提取XML数据。但是,为了查看这些数据,我必须首先访问链接中有用户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>';
libxml\u使用\u内部错误(true);
#标题('Content-Type:text/html');
#标题(“位置:site1”);
$url=“site1.php?user\u id=guest1”;
$response=file\u get\u contents($url);
$url=“site2.php”;
$response=file\u get\u contents($url);
打印(答复);
$data=simplexml\u load\u字符串($response);
//打印(数据);
回声“
”;
预期结果:大约100行XML数据

实际结果:只有一个。

所以,我找到了答案

使用HTTPHeaderLive,我看到site1正在存储一个cookie。每次我重新加载页面时,cookie都是一样的,所以我把它硬编码到我的PHP脚本中作为标题,并将其与我的file_get_contents()调用一起发送,它成功了


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

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

将请求从
file\u get\u 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请求。

site1正在做一些事情,为Site2提供某种访问令牌。Cookie,http referer(安全性差,但它的工作原理就像一扇锁着的屏蔽门),如果不是直接类型的链接,可能会有不同的头。我认为你在试图劫持会话,这是不可能的。如果站点2需要来自站点1的cookie,则通过站点1完成。在访问站点2之前,您需要为站点1构建一个代理。如果站点1有一个API,该API为您提供了一个在站点2上使用的资源令牌,那么这就可以了。否则,你要的是抓取站点2,而不是会话劫持它,这意味着要创建代理和一个漫长的过程。我只是想发布一个答案,你可能会发现这个答案很有用。这个代码看起来比我现在拥有的代码要干净得多。谢谢大家!+我还想问一个问题。当我获取这个xml数据并尝试使用simpleXML解析它时,我会遇到错误。当我查看原始输出时,XML头被注释掉了。我试图预先准备一个合适的XML头,但它总是被自动注释掉。有什么想法吗?