最近项目需要,要远程登录别人的系统,并且在对方的系统中提交表单,所以写了一个类。

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表单相关推荐

  1. go gin提交form表单请求

    代码 package mainimport "github.com/gin-gonic/gin"type User struct {ID string `form:"id ...

  2. HttpURLConnection与HttpClient提交FORM表单参数请求工具类

    来吧,小宝贝!!!!!!一个小白在项目过程中遇到的问题,给你们分享一下哈!!!!! 先看下我们请求的方式与请求体: 不难看出哈,请求的参数体并没有什么难点,那我为什么还要做一下总结呢?真的可能因为我太 ...

  3. jQuery ajax 请求 和 Submit 提交 form 表单

    前台: <title>modify approver Password</title> <script type="text/javascript"& ...

  4. html页面ajax提交数据,ajax请求提交form表单

    AJAX表单提交以及数据接收 方式一 手工收集所有的用户输入,封装为大的"k1=v1&k2=v2-"键值对形式,使用$.post(url, data,fn)把数据提交给服务 ...

  5. ios 优化html表单提交,iOS 使用AFNetworking的form表单请求

    首先说明下form表单请求,是一种特殊的post请求,请求方式有application/x-www-form-urlencoded.multipart/form-data.application/js ...

  6. elementUI中登录页form表单重复跳转登陆页

    Vue项目中使用elementUI的表单组件开发登录框,如果登录button在form表单内会出现重复登录情况,具体情形如下: 原始登录地址如图,点击登录后会再次跳转至登陆页,之后地址变成如下图 多了 ...

  7. js使用form表单方式模拟post请求

    var openPostWindow =function (url, data1) {//url 为请求地址,data1为需要请求的数据var tempForm = document.createEl ...

  8. ajax 模拟表单提交,Ajax模拟Form表单提交,含多种数据上传

    ---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...

  9. curl模拟form表单提交

    curl模拟form表单提交 一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用–data(注意是–不是-)或者它的缩写-d即可. curl -d &q ...

最新文章

  1. mysql常用语句集锦
  2. sqlserver2000内存突破4g_酷比魔方iPlay30评测:10.5英寸大屏,支持4G全网通
  3. Java 中类的静态成员与类的实例对象回收
  4. 怎么把文件导入python_如何导入其他Python文件?
  5. MySQL调优系列基础篇
  6. Linux shell multifile content replace with sed
  7. ELF 动态链接 so的动态符号表(.dynsym)
  8. 安卓模拟器不能上网时可尝试更改成谷歌DNS
  9. GLSurfaceView基础学习笔记
  10. 利用 PIL模块实现生成动态验证码
  11. U890第二次开发的BOM表工具--自主知识产权
  12. Win7 下安装 Sketsa.SVG.Editor v7.0.1
  13. Modelsim下载、注册与添加仿真库(LATTICE DIAMOND)
  14. sd卡计算机无法读取数据,怎么强制格式化sd卡-内存卡突然无法读取、数据损坏……整个人都是崩溃的!...
  15. 沧小海基于xilinx srio核的学习笔记之第三章 xilinx srio核介绍(三)核配置
  16. 基于java的cad_基于JavaCAD架构的IP知识产权保护
  17. ClipCap: CLIP Prefix for Image Captioning
  18. GOF23设计模式之适配器模式
  19. 根据银行卡号判断所属银行(部分资源网上抄录)
  20. 记录自己学JDBC的第一天

热门文章

  1. 高级会计师资格考试成绩合格证在全国范围内几年有效
  2. ALV报表中处理双击行项目事件
  3. 上市近一年,良品铺子的“高端化”之路走通了吗?
  4. 那些不敢生孩子的女人,都在怕什么?
  5. 疫情之后,出行市场的春天还有多远?
  6. html里面onclick属性是什么,html中onclick事件属性定义与用法
  7. c语言如何输出斜杠星号,Excel 如何提取出最后一个斜杠开始的数字
  8. bsp模型适用于图计算_CODE V微信简报:光束合成传播算法(BSP)
  9. python querystring encode_Java UriUtils.encodeQueryParam方法代碼示例
  10. 四大基本反应类型的关系_初中化学7大反应类型总结,收藏