仅在登录网站后才能访问的 url 中的 file_get_contents
Posted
技术标签:
【中文标题】仅在登录网站后才能访问的 url 中的 file_get_contents【英文标题】:file_get_contents from url that is only accessible after log-in to website 【发布时间】:2010-11-08 02:42:28 【问题描述】:我想制作一个可以从网站捕获页面的 php 脚本。想想 file_get_contents($url)。
但是,本网站要求您在访问任何页面之前填写用户名/密码登录表单。我想一旦登录,该网站会向您的浏览器发送一个身份验证 cookie,并且在随后的每个浏览器请求中,会话信息都会传回网站以验证访问权限。
我想知道如何使用 php 脚本模拟浏览器的这种行为,以便从该网站获得访问权限并捕获页面。
更具体地说,我的问题是:
-
如何发送请求
包含我的登录详细信息,以便
网站回复会话
信息/cookie
如何阅读会话
信息/cookie
如何回传此会话
随之而来的信息
请求 (file_get_contents, curl)
网站。
谢谢。
【问题讨论】:
【参考方案1】:Curl 非常适合这样做。除了设置CURLOPT_COOKIEJAR
和CURLOPT_COOKIEFILE
选项之外,您不需要做任何特别的事情。一旦您通过从站点传递表单字段登录,cookie 将被保存,Curl 将自动使用相同的 cookie 进行后续请求,如下例所示。
请注意,下面的函数会将 cookie 保存到 cookies/cookie.txt
,因此请确保该目录/文件存在并且可以写入。
$loginUrl = 'http://example.com/login'; //action from the login form
$loginFields = array('username'=>'user', 'password'=>'pass'); //login form field names and values
$remotePageUrl = 'http://example.com/remotepage.html'; //url of the page you want to save
$login = getUrl($loginUrl, 'post', $loginFields); //login to the site
$remotePage = getUrl($remotePageUrl); //get the remote page
function getUrl($url, $method='', $vars='')
$ch = curl_init();
if ($method == 'post')
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies/cookies.txt');
$buffer = curl_exec($ch);
curl_close($ch);
return $buffer;
【讨论】:
这对我来说仍然很有效。如果它不适合您,请检查 a) 您是否提供了所有必需的表单字段,并且 b) 您的 cookies.txt 文件是可写的。 提示:仔细查看表单是否包含需要登录的隐藏字段。 此方法不再有效。 1)当他们检测到您正在尝试使用此方法登录时,他们现在需要一个验证码字段。 2) 表单名称和详细信息已更改。【参考方案2】:http pecl extension 可以做到,PEAR::HTTP_Client、Snoopy 和许多其他库/类也可以。
如果您(无论出于何种原因)想使用file_get_contents
实现此目的,您可以使用stream context options for the http wrapper 设置POST 和cookie 参数,并使用stream_get_meta_data 读取包括cookie 在内的响应标头。
【讨论】:
以上是关于仅在登录网站后才能访问的 url 中的 file_get_contents的主要内容,如果未能解决你的问题,请参考以下文章