1.通过curl请求url函数
/** * 通过curl请求url函数,本函数用于测试curl_getinfo()的使用 * * @param string $url 目标网址 * @return string 返回网页内容 */ function request($url) { $ch = curl_init(); //启动一个cURL会话 curl_setopt($ch, CURLOPT_URL, $url); //打开 URL 地址 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //设定返回的数据是否自动显示 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //忽略 ssl 验证 $output = curl_exec($ch); //执行操作 //通过curl_getinfo()函数,获取服务器返回信息,并通过第二个参数 CURLINFO_HTTP_CODE 获取指定的返回状态码 $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //获取状态码,如:404、301等 curl_close($ch); //关闭会话释放资源 if($response_code == '404') { echo '请求的页面不存在!'; return false; }else{ return $output; //返回获取的网页内容 } } echo request('http://test.cc/');
2.以POST方式请求的CURL功能函数
/** * 以POST方式请求的CURL功能函数 * * @param $url string 请求的目标服务器地址 * @param @data array 以 POST 方式传送到服务器的数组数据 * @param string 返回网页内容 */ function request_post($url, $data) { $ch = curl_init(); //启动一个cURL会话 curl_setopt($ch, CURLOPT_URL, $url); //要访问的地址 curl_setopt($ch, CURLOPT_POST, 1); //发送一个常规的 POST 请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //post 提交的数据包 $tmpInfo = curl_exec($ch); //执行操作 if(curl_errno($ch)) //判断是否有错误 { echo 'Errno:' . curl_error($ch); } curl_close($ch); //关闭会话释放资源 return $tmpInfo; //返回数据 } $source = array( 'userName' => '孙悟空', 'age' => '500' ); echo request_post('http://test.cc/', $source);
3.通过 curl 进行本地文件上传函数
/** * 通过 curl 进行本地文件上传函数 * * @param $url string 提交的服务器位置,需要字符串参数 * @param $srcFilePath string 本地需要上传的文件路径,需要字符串参数 * @param @postParam array 和上传文件一起提交给服务器的 POST 数据,需要数组参数 * @return array 服务器返回的信息,是一个数组,下标 errno 表示状态(0 失败,1 成功), * errmsg 为反馈消息,data 为服务器返回消息 */ function uploadFile($url, $srcFilePath, $postParam) { //如果php为5.5以上版本,使用 CURLFile if(version_compare(phpversion(), '5.5.0')) { $data = array( 'object_file' => new curlFile($srcFilePath) ); //部署环境是5.4(仅@语法),但开发环境是5.6(仅 CURLFile) }else{ //将需要上传的本地文件路径放入一个数组,下标相当于上传文件的表单名称,路径前一定要有“@”符号 $data = array( 'object_file' => '@'.$srcFilePath ); } //将上传的信息和POST提交的信息合并,这样可以一起传给服务器 $data = array_merge($postParam, $data); $ch = curl_init($url); //启动一个cURL会话 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //设置获取的内容但不输出 curl_setopt($ch, CURLOPT_POST, true); //发送一个常规的 POST 请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //post 提交的数据包 $response = curl_exec($ch); //执行操作 if(curl_errno($ch) != 0) //判断是否有错误 { return array('errno' => 0, 'errmsg' => "上传{$srcFilePath}失败:".curl_error($ch), 'data' => ''); } curl_close($ch); //关闭会话释放资源 if(!$response) //判断上传文件是否为空 { return array('errno' => 0, 'errmsg' => "上传{$srcFilePath}失败:response is empty", 'data' => ''); } return array('errno' => 1, 'errmsg' => "ok", 'data' => $response); } $srcFilePath = 'C:abc.jpg'; $postParam = array('username' => '孙悟空', 'age' => '500'); $arr = uploadFile('http://test.cc/post.php', $srcFilePath, $postParam); echo '<pre>'; print_r($arr); //显示信息
4.模拟用户登录并获取数据的函数
/** * 模拟用户登录函数 * @param $url string 登录提交的地址 * @param $cookie string 设置 cookie 信息保存的文件 * @param $post array 提交的 post 数据 */ function login_post($url, $cookie, $post) { $ch = curl_init(); //启动一个cURL会话 curl_setopt($ch, CURLOPT_URL, $url); //要访问的地址 curl_setopt($ch, CURLOPT_HEADER, 0); //设定是否显示头信息 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); //设定返回的数据是否自动显示 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); //设置 cookie 信息保存在指定的文件中 curl_setopt($ch, CURLOPT_POST, 1); //1️以 post 方式提交 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); //要提交的信息 curl_exec($ch); //执行 cURL curl_close($ch); //关闭 cURL 资源,并释放系统资源 } /** * 登录成功后获取数据 * @param $url string 需要获取的内容地址 * @param $cookie string 读取 cookie 信息保存的文件 * @return string 抓取页面内容 */ function get_content($url, $cookie) { $ch = curl_init(); //启动一个cURL会话 curl_setopt($ch, CURLOPT_URL, $url); //要访问的地址 curl_setopt($ch, CURLOPT_HEADER, 0); //设定是否显示头信息 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //设定返回的数据是否自动显示 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取 cookie $ret = curl_exec($ch); //执行 cURL curl_close($ch); //关闭 cURL 资源,并释放系统资源 return $ret; //返回内容 } $post = array( 'email' => 'admin@163.com', 'pwd' => '123456' ); $url = "http://test.cc/login/verify.php"; $cookie = __DIR__.'/cookie.txt'; $url2 = "http://test.cc/login/content.php"; login_post($url, $cookie, $post); $content = get_content($url2, $cookie); @unlink($cookie); $preg = "/<p>(.*)</p>/i"; preg_match_all($preg, $content, $arr); $str = ''; foreach($arr[1] as $val) { $str .= $val.PHP_EOL; } echo $str; file_put_contents('save.txt', $str);
本地测试站点的搭建
本示例不使用真实站点来模拟,而是用本地搭建的站点来模拟,因为真实站点随时会更新,使代码不能有效执行。这里使用的是 phpstudy(小皮面板)地址:https://www.xp.cn/
步骤,以图为例:
1.C盘下存放一张图片,用于上传时作为示例,文件名为:abc.jpg
2.目录结构:
根目录(D:phpstudy_proWWW est.cc):
└ uploads
index.php
post.php
login
└ index.php
login.php
verify.php
content.php
3.具体代码:
1)login/index.php 文件:
<?php header('location:login.php');
2)login/login.php 文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css"> <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script> <title>登录</title> </head> <body> <div class="container" style="height: 100vh"> <div style="height: 22%"></div> <div class="row" style="height: 50%"> <div class="col-sm-3 col-md-3 col-lg-4 col-xl-4"></div> <div class="col-sm-6 col-md-6 col-lg-4 col-xl-4" style="border: solid 1px #dcdcdc; padding: 20px; border-radius:10px"> <form action="verify.php" method="post"> <div class="form-group"> <label for="email">邮箱:</label> <input type="email" class="form-control" name="email"> </div> <div class="form-group"> <label for="pwd">密码:</label> <input type="password" class="form-control" name="pwd"> </div> <div class="form-check"> <label class="form-check-label"> <input class="form-check-input" type="checkbox" name="ckb"> 记住我 </label> </div> <div style="float:right"> <input type="submit" class="btn btn-primary" name="_submit" value="登录" /> </div> </form> </div> <div class="col-sm-3 col-md-3 col-lg-4 col-xl-4"></div> </div> </div> </body> </html>
3).login/verify.php 文件:
<?php if(filter_has_var(INPUT_POST, "email")) { $user = $_POST['email']; $pass = $_POST['pwd']; if(!empty($user) && !empty($pass)) { if($user === 'admin@163.com' && $pass === '123456') { session_start(); $_SESSION['verify'] = true; header('location: content.php'); } else { echo '<script>alert("登录错误!")</script>'; header('location: login.php'); } } }
4).login/content.php 文件:
<?php session_start(); if($_SESSION['verify'] !== true) die('没有登录'); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>内容</title> </head> <body> <div> <p>浪淘沙·极目楚天空</p> <p>幼卿 〔宋代〕</p> <p>极目楚天空,云雨无踪,漫留遗恨锁眉峰。自是荷花开较晚,孤负东风。</p> <p>客馆叹飘蓬,聚散匆匆,扬鞭那忍骤花骢。望断斜阳人不见,满袖啼红。</p> </div> </body> </html>
5)./index.php 文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=div, initial-scale=1.0"> <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css"> <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script> <title>测试网站</title> </head> <body> <h2 class="bg-info text-white" style="text-align: center; padding: 20px 0">测试网站</h2> <div class="container"> <div style="text-align: center"> <?php if($_POST): ?> <pre style="text-align: left"> <?php print_r($_POST) ?> </pre> <?php else: ?> <p>望海楼晚景五绝</p> <p>苏轼〔宋代〕</p> <p>海上涛头一线来,楼前指顾雪成堆。</p> <p>从今潮上君须上,更看银山二十回。</p> <p>横风吹雨入楼斜,壮观应须好句夸。</p> <p>雨过潮平江海碧,电光时掣紫金蛇。</p> <p>青山断处塔层层,隔岸人家唤欲应。</p> <P>江上秋风晚来急,为传钟鼓到西兴。</P> <P>楼下谁家烧夜香,玉笙哀怨弄初凉。</P> <P>临风有客吟秋扇,拜月无人见晚妆。</P> <P>沙河灯火照山红,歌鼓喧喧笑语中。</P> <P>为问少年心在否,角巾欹侧鬓如蓬。</P> <?php endif; ?> </div> </div> </body> </html>
6)./post.php 文件:
<?php print_r($_POST); print_r($_FILES); /** * 上传文件函数 * * @param string 上传文件的本地路径 * @return string 上传文件的服务器路径 */ function uploadFile($path) { if(!file_exists($path)) { if(!mkdir($path, 0777)) { die('目录没有创建成功!'); } } //文件类型判断,省略...... $hz = array_pop(explode('.', $_FILES['object_file']['name'])); $fileName = date('ymdHis').rand(100, 999).'.'.$hz; $filePath = $path.'/'.$fileName; if(is_uploaded_file($_FILES['object_file']['tmp_name'])) { if(!move_uploaded_file($_FILES['object_file']['tmp_name'], $filePath)) { die('问题:不能将文件移动到指定目录。'); } } else { die("问题:上传文件{$_FILES['object_file']['name']}不是一个合法文件。"); } $fileMsg = str_replace(array('./', '/'), array('\', '\'), $filePath); return __DIR__.$fileMsg; } echo uploadFile('./uploads');
4.把上面的 cURL 代码放在 http://localhost/ 站点下测试。
注:参见官方文档:https://www.php.net/curl_setopt