【问题标题】:How to split a PHP cURL connection over to files?如何将 PHP cURL 连接拆分为文件?
【发布时间】:2020-03-20 13:27:13
【问题描述】:

我构建了一个简单的 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 内容类型:文本/html 内容长度:85 连接:关闭缓存控制:无缓存,无存储, must-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; mode=block 没有找到 cookie

【问题讨论】:

  • 请添加您的代码并说明您的尝试
  • 另外,请解释您的代码如何“不起作用”。您是否收到特定的错误消息?代码是否在不拆分文件的情况下退出?它会合并文件吗?
  • 已编辑帖子,希望现在清楚

标签: php curl


【解决方案1】:

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

在第一个 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);

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2019-09-05
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多