PHP CURL模拟登陆并提交数据,及PHP CURL文件上传/图片下载等(仅作调试,未完善)
<?php error_reporting(255);
set_time_limit(120);
/**
* 发送报头信息
*
* @return void(0) || string;
*/
if(!function_exists("httpHeader")){
function httpHeader(){
if(!headers_sent($file,$line)){
header("Content-Type:text/html;charset=utf-8");
header("Cache-Control: public");//强制浏览器缓存
header("Pragma: cache");
return ;
}else{
return "Headers sent in <b>{$file}</b> on line <u>{$line}</u>";
}
}
}
/**
* 随机IP
*
* @return string;
*/
function randIp(){
$ip2id= round(rand(600000, 2550000) / 10000); //第一种方法,直接生成
$ip3id= round(rand(600000, 2550000) / 10000);
$ip4id= round(rand(600000, 2550000) / 10000);
//下面是第二种方法,在以下数据中随机抽取
$arr_1 = array("218","218","66","66","218","218","60","60","202","204","66","66","66","59","61","60","222","221","66","59","60","60","66","218","218","62","63","64","66","66","122","211");
$randarr= mt_rand(0,count($arr_1)-1);
$ip1id = $arr_1[$randarr];
return $ip1id.".".$ip2id.".".$ip3id.".".$ip4id;
}
/**
* 模拟移动端头信息
*
* @return string;
*/
function randIphone(){
$arr=array("LBEParents/1.2.1 (iPhone; iOS 10.3.1; Scale/2.00)",
"MicroMessenger/6.5.7.1041 NetType/WIFI Language/zh_CN",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 MicroMessenger/6.5.4 NetType/WIFI Language/zh_CN",
"Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 MicroMessenger/6.5.7 NetType/WIFI Language/en"
);
$rand_num=rand(0,count($arr)-1);
return $arr[$rand_num];
}
function isMobile(){
//weixin
if(isWeixin()) return true;
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
if(isset ($_SERVER["HTTP_X_WAP_PROFILE"])){
return true;
}
// 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
if(isset ($_SERVER["HTTP_VIA"])){
// 找不到为flase,否则为true
return stristr($_SERVER["HTTP_VIA"], "wap") ? true : false;
}
// 脑残法,判断手机发送的客户端标志,兼容性有待提高
if(isset ($_SERVER["HTTP_USER_AGENT"])){
$clientkeywords = array(
"nokia",
"sony",
"ericsson",
"mot",
"samsung",
"htc",
"sgh",
"lg",
"sharp",
"sie-",
"philips",
"panasonic",
"alcatel",
"lenovo",
"iphone",
"ipod",
"blackberry",
"meizu",
"android",
"netfront",
"symbian",
"ucweb",
"windowsce",
"palm",
"operamini",
"operamobi",
"openwave",
"nexusone",
"cldc",
"midp",
"wap",
"mobile",
"windows phone"
);
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if(preg_match("/(".implode("|", $clientkeywords).")/i", strtolower($_SERVER["HTTP_USER_AGENT"]))){
return true;
}
}
// 协议法,因为有可能不准确,放到最后判断
if(isset ($_SERVER["HTTP_ACCEPT"])){
// 如果只支持wml并且不支持html那一定是移动设备
// 如果支持wml和html但是wml在html之前则是移动设备
if((strpos($_SERVER["HTTP_ACCEPT"], "vnd.wap.wml") !== false) && (strpos($_SERVER["HTTP_ACCEPT"], "text/html") === false || (strpos($_SERVER["HTTP_ACCEPT"], "vnd.wap.wml") < strpos($_SERVER["HTTP_ACCEPT"], "text/html")))){
return true;
}
}
return false;
}
function isWeixin(){
if (isset ($_SERVER["HTTP_USER_AGENT"])&&strpos(strtolower($_SERVER["HTTP_USER_AGENT"]),"micromessenger") !== false ) {
return true;
}
return false;
}
/**
* 含报头输出字符串
*
* @param string $str;
* @return string;
*/
if(!function_exists("e")){
function e($str){
httpHeader();
echo "服务器返回信息:".$str;
}
}
class curl{
private $login_url = "http://xx.com/apple3/member/login?_debug=1"; //要测试的api地址
private $doOrder_url = "http://xx.com/apple3/order/doOrder?_debug=1";
private $addCart_url = "http://xx.com/apple3/member/addCart?_debug=1";
private $username = "username"; //用户登陆所需的测试账户密码
private $password = "password";
private $cache_dir = "/home/www/pic/logs/";
private $up_dir = "/home/www/pic/upload/";
private $cookie_file;
public function __construct(){
if(strstr(PHP_OS,"WIN"));
$this->cache_dir = dirname(dirname(dirname(__FILE__)))."/cache/";
if(!is_writable($this->cache_dir))
exit(e("日志跟踪文件目录({$this->cache_dir})没有可写权限/该目录下需要可写权限!"));
$this->cookie_file = $this->cache_dir."pic.cookie";
}
/**
* 模拟登陆用
*
* @return string;
*/
public function curlLogin(){
$curl = curl_init();
$cookie_jar = $this->cookie_file;//cookie文件地址必须可写
curl_setopt($curl, CURLOPT_URL,$this->login_url);//这里写上处理登录的界面
curl_setopt($curl, CURLOPT_POST, 1);
$request = "username={$this->username}&password={$this->password}";
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);//传 递数据
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);// 把返回来的cookie信息保存在$cookie_jar文件中
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设定返回 的数据是否自动显示
curl_setopt($curl, CURLOPT_HEADER, false);//设定是否显示头信 息
curl_setopt($curl, CURLOPT_NOBODY, false);//设定是否输出页面 内容
$data = curl_exec($curl);//返回结果
curl_close($curl); //关闭
return $data;
}
/**
* 模拟登陆后提交数据用(摘取天上星 test数据)
*
* @param string $post k1=v1&k2=v2;
* @return string;
*/
public function curlPost($post,$is_cart=false){
$ch = curl_init();
if($is_cart){
$url = $this->addCart_url;
}else{
$url = $this->doOrder_url;
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_file);
$request=curl_exec($ch);
curl_close($ch);
return $request;
}
/**
* 发送CURL文件上传
*
* @return string
*/
public function up($file_path,$up_url){
//httpHeader();//调试打印用
//$cookie_file = $this->cookie_file; //非登陆验证页面无需此项根据情况开启即可
$ch = curl_init();
//$data = array("img"=>"@F:/hof2/QQ20160513141328.jpg"); //加@符号curl就会把它当成是文件上传处理
$data = array("img"=>"@".$file_path); //加@符号curl就会把它当成是文件上传处理
curl_setopt($ch,CURLOPT_URL,$up_url); //设置要上传的URL目的地址
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data); //传输数据
curl_setopt($ch,CURLOPT_HEADER, false);//不输出HEADER头信息
//curl_setopt($ch,CURLOPT_COOKIEFILE, $cookie_file); //登陆后保存的cookie文件地址 //非验证页面无需此项根据情况开启即可
$result = curl_exec($ch);
//print_r($result); //调试用
if(curl_errno($ch)){
$err = curl_error($ch);
//var_dump($err); //调试用
}
$r = curl_getinfo($ch);
//var_dump($r); //调试用
curl_close($ch);
return json_decode($result);
}
/**
* 接收CURL上传请求(接收自up动作上传过来的文件)仅测试用
* @return void(0)
*
public function handleUpload(){
if(isset($_FILES) && !empty($_FILES["img"]["name"])){
$filename = time().$_FILES["img"]["name"];
$tmpname = $_FILES["img"]["tmp_name"];
if(move_uploaded_file($tmpname,$this->up_dir.$filename)){
echo json_encode("上传成功");
}else{
$data = json_encode($_FILES);
echo $data;
}
}else{
echo json_encode("上传失败");
}
}
*/
/**
* CURL抓取远程图片并转64编码(用于图片采集下载)
* @param string $url
* @return array
*/
public function curlDown($url,$type=0){
$msg = ["code"=>2100,"status"=>"error","msg"=>"未知错误!"];
$imgs= ["image/jpeg"=>"jpeg",
"image/jpg"=>"jpg",
"image/gif"=>"gif",
"image/png"=>"png",
"text/html"=>"html",
"text/plain"=>"txt",
"image/pjpeg"=>"jpg",
"image/x-png"=>"png",
"image/x-icon"=>"ico"
];
if(!stristr($url,"http")){
$msg["code"]= 2101;
$msg["msg"] = "url地址不正确!";
return $msg;
}
$dir= pathinfo($url);
$host = $dir["dirname"];
$refer= $host."/";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_REFERER, $refer); //伪造来源地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-FORWARDED-FOR:".randIp(), "CLIENT-IP:".randIp()));//模拟随机IP
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 ); //解决重定向问题
$data = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
$httpCode = intval($info["http_code"]);
$httpContentType = $info["content_type"];
$httpSizeDownload= intval($info["size_download"]);
if($httpCode!="200"){
$msg["code"]= 2102;
$msg["msg"] = "url返回内容不正确!";
return $msg;
}
if($type>0 && !isset($imgs[$httpContentType])){
$msg["code"]= 2103;
$msg["msg"] = "url资源类型未知!";
return $msg;
}
if($httpSizeDownload<1){
$msg["code"]= 2104;
$msg["msg"] = "内容大小不正确!";
return $msg;
}
$msg["code"] = 200;
$msg["status"]="success";
$msg["msg"] = "资源获取成功";
if($type==0 or $httpContentType=="text/html") $msg["data"] = $data;
$base_64 = base64_encode($data);
if($type==1) $msg["data"] = $base_64;
elseif($type==2) $msg["data"] = "data:{$httpContentType};base64,{$base_64}";
elseif($type==3) $msg["data"] = "<img src="data:{$httpContentType};base64,{$base_64}" />";
else $msg["msg"] = "未知返回需求!";
unset($info,$data,$base_64);
return $msg;
}
/**
* 模拟移动端请求
*
* @param string $url;
* @return string;
*/
function curlMobile($url){
$dir= pathinfo($url);
$host = $dir["dirname"];
$refer= $host."/";
$ch2 = curl_init();
//$user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";//模拟windows用户正常访问
//模拟手机用户
$user_agent = randIphone();
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch2, CURLOPT_TIMEOUT, 10);
curl_setopt($ch2, CURLOPT_HTTPHEADER, array("X-FORWARDED-FOR:".randIp(), "CLIENT-IP:".randIp()));//追踪返回302状态码,继续抓取
curl_setopt($ch2, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch2, CURLOPT_NOBODY, false);
curl_setopt($ch2, CURLOPT_REFERER,$refer);//模拟来路
curl_setopt($ch2, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch2, CURLOPT_POST, 1); //设置为POST方式
curl_setopt($ch2, CURLOPT_POSTFIELDS, array("class_id"=>769)); //数据传输
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, 1 ); //解决重定向问题
$temp = curl_exec($ch2);
curl_close($ch2);
return $temp;
}
/********其余代码省略...仅供参考********/
}声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
