php - 如何将 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
解决方案
我想我找到了解决方案,至少它有效。
在第一个 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);
推荐阅读
- java - 从 TLS 获取证书链以使用 OCSP
- javascript - 无法为 React Native 应用设置 Twitter 身份验证。错误:未确认的回调
- android - 无法获取未知属性“sonatypeRepo”
- java - Bits.java 中的“0x0102030405060708L”是什么
- swift-mt - SWIFT MT 消息 SEME 唯一性
- c# - 根据消费页面中定义的值在布局中呈现 html 内容
- php - 错误:找不到类“PHPMailer”
- batch-file - 如何将可用内存设置为批处理文件中的字符串/变量?
- javers - Javers 片段没有 jv_global_id 记录
- c# - FieldInfo.GetValue() 可能会使您的程序崩溃;如何避免这种情况?