仅在登录网站后才能访问的 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_COOKIEJARCURLOPT_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的主要内容,如果未能解决你的问题,请参考以下文章

我可以在youtube上上传视频并限制它仅在我的网站上查看吗?

仅将 S3 对象 URL 限制为网站上的登录用户

如何做到用户只有在登录时才能访问某些路由?

CodeIgniter:动态登录后重定向?

C# winform webbrowser 自动登录网站?

php中如何使用session 来实现在一个页面登陆后才能访问另外一个页面