首页 > 解决方案 > 如何将 PHP cURL 连接拆分为文件?

问题描述

我构建了一个简单的 PHP 脚本来登录网页并在第二页上接收一些数据。现在,我使用了一个 php 文件和两个使用相同 cookie 的单独 curl 连接。第一个 curl 连接进行登录,第二个接收数据。

现在我想将这两个部分拆分为两个单独的 php 文件,以通过 Ajax 独立调用每个部分。

登录成功但检索数据不起作用,似乎是由于缺少 cookie。

我不太确定是否有可能让它以这种方式工作,以及实现我正在尝试的最佳实践是什么,也许有人可以照亮我的想法。

        // SET CONSTANTS
        define('COOKIE_NAME', 'c.txt');
        define('url_login', 'https://website.com/login.cgi');
        $postString = 'user='.$user.'&passwd='.$passwd.'&otp='.$otp;

        // CREATE CURL CONNECTION FOR LOGIN
        $curl_connection = curl_init(url_login);

        curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl_connection, CURLOPT_USERAGENT, 
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);

        curl_setopt($curl_connection, CURLOPT_HEADER, false);
        curl_setopt($curl_connection, CURLOPT_COOKIEJAR, COOKIE_NAME);
        curl_setopt($curl_connection, CURLOPT_COOKIEFILE, COOKIE_NAME);

        curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $postString);
        $loginpage = curl_exec($curl_connection);



        // CREATE CURL CONNECTION TO GET DATA

        $data_url = 'https://website.com/getData.cgi';

        $curl_connection = curl_init($data_url);

        curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($curl_connection, CURLOPT_USERAGENT, 
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);

        curl_setopt($curl_connection, CURLOPT_HEADER, false);
        curl_setopt($curl_connection, CURLOPT_COOKIEJAR, COOKIE_NAME);
        curl_setopt($curl_connection, CURLOPT_COOKIEFILE, COOKIE_NAME);


        $data = curl_exec($curl_connection);

这就是它的工作方式......

一旦我将 curl 连接拆分为单独的 php 文件,第二部分就无法提供以下输出:

HTTP/1.1 200 OK 服务器:nginx 日期:2020 年 3 月 20 日星期五 12:49:12 GMT 内容类型:文本/html 内容长度:85 连接:关闭缓存控制:无缓存,无存储,必须- revalidate Pragma: no-cache Expires: 0 Set-Cookie: ws-sid-10-147-g1e32=deleted; 路径=/; max-age=0 严格传输安全性:max-age=63072000;包括子域;预加载 X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: 1; 模式=阻止未找到 cookie

标签: phpcurl

解决方案


我想我找到了解决方案,至少它有效。

在第一个 cURL 连接中,我从 Header 中读出了 Cookie,在第二个中,我使用 CURLOPT_COOKIE 选项手动添加了 Cookie:

第一个 PHP 文件和 cUrl 连接:

curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT, 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($curl_connection, CURLOPT_HEADER, true);
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, COOKIE_NAME);
curl_setopt($curl_connection, CURLOPT_COOKIEFILE, COOKIE_NAME);

curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $postString);
$page = curl_exec($curl_connection);

preg_match("/Set-Cookie: (.{18,20})\=(.{32});/", $page, $cookie);

$cookie = $cookie[2];

在第二个文件和 cURL 连接中:

$curl_connection = curl_init($url);

curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT, 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($curl_connection, CURLOPT_HEADER, true);

curl_setopt($curl_connection, CURLOPT_COOKIE, $cookie);

推荐阅读