thinkphp5模拟post请求_Thinkphp5.1模拟登录并提交form表单
最近项目需要,要远程登录别人的系统,并且在对方的系统中提交表单,所以写了一个类。
namespace app\api\controller;
use think\Db;
use think\Controller;
use think\facade\Env;
use think\facade\Request;
class Offline extends Controller
{
//域名
public $baseUrl = 'http://localhost:8080';
//登录错误返回的链接
public $loginErrorUrl = '/login';
//登录验证
public $loginUrl = '/check';
//登录成功跳转
public $loginSuccessUrl = '/loginSuccess';
//提交表单
public $orderUrl = '/save';
//提交表单返回页面URL
public $formUrl = '/proposal';
//下载URL
public $downloadUrl = '/downloads';
//记录登录返回的cookie
public $cookieFile;
//日志
public $logFile;
protected function initialize()
{
parent::initialize();
$this->cookieFile = Env::get('root_path') .'runtime/success_cookie.txt';
$this->logFile = Env::get('root_path') .'runtime/offline_log.txt';
}
/**
* @function online
* @intro 模拟form提交表单
* @return string
*/
public function online()
{
$ch = curl_init($this->baseUrl.$this->formUrl);
curl_setopt($ch,CURLOPT_COOKIEFILE, $this->cookieFile); //同时发送Cookie
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
$headers = curl_getinfo($ch);
curl_close($ch);
//通过返回的header里的url来判断登录状态
if(strpos($this->loginErrorUrl, $headers['url'])){
return 'login_fail';
}
//跟进传过来的ID去查询订单内容
$orderId = input('id');
//订单信息
$order = db('order')->where(['id'=>$orderId])->find();
$form = [];
$form['name'] = $order['title'];
$form['type'] = 1;
//提交表单
$headersandcontent = $this->curlPostForm($this->baseUrl.$this->orderUrl, $this->cookieFile, $form);
$headers = $headersandcontent['header'];
$content = strip_tags($headersandcontent['content']);//过滤html标签
$content = preg_replace("/(.*?)/si","",$content);//过滤script标签
$content = preg_replace("/\s+/", " ", $content);//过滤回车
$content = str_replace(' ', '', $content);//过滤空格
$this->log(json_encode($headers));
$this->log($content);
//对返回的内容进行判断
if(strpos($headers['url'], $this->orderUrl)){
return 'success';
}else{
return 'fail';
}
}
//下载PDF
public function downloadpdf($no){
$url = $this->baseUrl.$this->downloadUrl.'?no='.$no;
$save_path = Env::get('root_path').'public/uploads/pdf/';
$filename = $no.'.pdf';
$content = $this->curlDownloadFile($url,$this->cookieFile);
// 保存文件到制定路径
$length = file_put_contents($save_path.$filename, $content);
if($length == 0){
unlink($save_path.$filename);
if(!empty($content)){
$fp2 = @fopen($save_path . $filename, 'a');
fwrite($fp2, $content);
fclose($fp2);
}
}
return true;
}
//模拟登录
public function login(){
$arr['username'] = '11111';
$arr['password'] = 'aaaa';
//模拟登录,抓取返回值里的URL
$headers = $this->curlPost($this->baseUrl.$this->loginUrl, $this->cookieFile, $arr);
//登录成功
if(strpos($headers['url'], $this->loginSuccessUrl)){
return 'success';
}else{
return 'fail';
}
}
//记录日志
public function log($str){
$fp = fopen($this->logFile, 'a+');
fwrite($fp, date("Y-m-d H:i:s").' '.$str." \r\n");
fclose($fp);
}
/**
* 模拟登录
* @param string $url 提交到的地址
* @param string $cookie 保存cookie的文件
* @param string $arr 提交时要post的参数
* @return string $headers 返回的内容
*/
public function curlPost($url, $cookie, $arr=''){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($arr)){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($arr)); //提交查询信息
}
//若给定url自动跳转到新的url,有了下面参数可自动获取新url内容:302跳转
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//设置cURL允许执行的最长秒数。
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); //把返回来的cookie信息保存在$cookie文件中
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
$content = curl_exec($ch);
//获取请求返回码,请求成功返回200
$code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
//获取一个cURL连接资源句柄的信息。
//$headers 中包含跳转的url路径
$headers = curl_getinfo($ch);
curl_close($ch);
return $headers;
}
/**
* 提交表单
* @param string $url 提交到的地址
* @param string $cookie 保存cookie的文件
* @param string $arr 提交时要post的参数
* @return string $headers 返回的内容
*/
public function curlPostForm($url, $cookie, $arr=''){
$headers = array('Content-Type: application/x-www-form-urlencoded');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //同时发送Cookie
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($arr)); //提交查询信息
//若给定url自动跳转到新的url,有了下面参数可自动获取新url内容:302跳转
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//设置cURL允许执行的最长秒数。
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$headers = curl_getinfo($ch);
$content = curl_exec($ch);
curl_close($ch);
return ['header'=>$headers,'content'=>$content];
}
/**
* 下载
* @param string $url 地址
* @param string $cookie 保存cookie的文件
* @return string $content 返回的内容
*/
public function curlDownloadFile($url, $cookie){
$headers = array('Content-Type: application/x-www-form-urlencoded');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //同时发送Cookie
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//设置cURL允许执行的最长秒数。
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}
}
这里的返回值基本都是html内容所以我这边是判断的返回值里的URL是不是匹配,可以根据需要调整。
thinkphp5模拟post请求_Thinkphp5.1模拟登录并提交form表单相关推荐
- go gin提交form表单请求
代码 package mainimport "github.com/gin-gonic/gin"type User struct {ID string `form:"id ...
- HttpURLConnection与HttpClient提交FORM表单参数请求工具类
来吧,小宝贝!!!!!!一个小白在项目过程中遇到的问题,给你们分享一下哈!!!!! 先看下我们请求的方式与请求体: 不难看出哈,请求的参数体并没有什么难点,那我为什么还要做一下总结呢?真的可能因为我太 ...
- jQuery ajax 请求 和 Submit 提交 form 表单
前台: <title>modify approver Password</title> <script type="text/javascript"& ...
- html页面ajax提交数据,ajax请求提交form表单
AJAX表单提交以及数据接收 方式一 手工收集所有的用户输入,封装为大的"k1=v1&k2=v2-"键值对形式,使用$.post(url, data,fn)把数据提交给服务 ...
- ios 优化html表单提交,iOS 使用AFNetworking的form表单请求
首先说明下form表单请求,是一种特殊的post请求,请求方式有application/x-www-form-urlencoded.multipart/form-data.application/js ...
- elementUI中登录页form表单重复跳转登陆页
Vue项目中使用elementUI的表单组件开发登录框,如果登录button在form表单内会出现重复登录情况,具体情形如下: 原始登录地址如图,点击登录后会再次跳转至登陆页,之后地址变成如下图 多了 ...
- js使用form表单方式模拟post请求
var openPostWindow =function (url, data1) {//url 为请求地址,data1为需要请求的数据var tempForm = document.createEl ...
- ajax 模拟表单提交,Ajax模拟Form表单提交,含多种数据上传
---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...
- curl模拟form表单提交
curl模拟form表单提交 一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用–data(注意是–不是-)或者它的缩写-d即可. curl -d &q ...
最新文章
- mysql常用语句集锦
- sqlserver2000内存突破4g_酷比魔方iPlay30评测:10.5英寸大屏,支持4G全网通
- Java 中类的静态成员与类的实例对象回收
- 怎么把文件导入python_如何导入其他Python文件?
- MySQL调优系列基础篇
- Linux shell multifile content replace with sed
- ELF 动态链接 so的动态符号表(.dynsym)
- 安卓模拟器不能上网时可尝试更改成谷歌DNS
- GLSurfaceView基础学习笔记
- 利用 PIL模块实现生成动态验证码
- U890第二次开发的BOM表工具--自主知识产权
- Win7 下安装 Sketsa.SVG.Editor v7.0.1
- Modelsim下载、注册与添加仿真库(LATTICE DIAMOND)
- sd卡计算机无法读取数据,怎么强制格式化sd卡-内存卡突然无法读取、数据损坏……整个人都是崩溃的!...
- 沧小海基于xilinx srio核的学习笔记之第三章 xilinx srio核介绍(三)核配置
- 基于java的cad_基于JavaCAD架构的IP知识产权保护
- ClipCap: CLIP Prefix for Image Captioning
- GOF23设计模式之适配器模式
- 根据银行卡号判断所属银行(部分资源网上抄录)
- 记录自己学JDBC的第一天
热门文章
- 高级会计师资格考试成绩合格证在全国范围内几年有效
- ALV报表中处理双击行项目事件
- 上市近一年,良品铺子的“高端化”之路走通了吗?
- 那些不敢生孩子的女人,都在怕什么?
- 疫情之后,出行市场的春天还有多远?
- html里面onclick属性是什么,html中onclick事件属性定义与用法
- c语言如何输出斜杠星号,Excel 如何提取出最后一个斜杠开始的数字
- bsp模型适用于图计算_CODE V微信简报:光束合成传播算法(BSP)
- python querystring encode_Java UriUtils.encodeQueryParam方法代碼示例
- 四大基本反应类型的关系_初中化学7大反应类型总结,收藏