<?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;
}
/********其余代码省略...仅供参考********/
}
PHP CURL模拟登陆并提交数据,及PHP CURL文件上传/图片下载等(仅作调试,未完善)
最新推荐文章于 2024-07-03 09:25:41 发布