PHP中使用CURL(一)
執行流程:
curl_init()初始化 -> curl_setopt()設置變量 -> curl_exec()獲取結果 -> curl_close()釋放句柄
Get:
1
2
3
4
5
6
7
|
$ch =
curl_init(); curl_setopt( $ch ,
curlOPT_URL, "http://www.baidu.com" ); curl_setopt( $ch ,
curlOPT_RETURNTRANSFER, 1); curl_setopt( $ch ,
curlOPT_HEADER, 0); $output =
curl_exec( $ch ); curl_close( $ch ); print_r( $output ); |
Post:
1
2
3
4
5
6
7
8
9
10
|
$url = "http://www.yudis.cn/callback.php" ; $data =
[ "username" => "uname" ]; $ch =
curl_init(); curl_setopt( $ch ,
curlOPT_URL, $url ); curl_setopt( $ch ,
curlOPT_RETURNTRANSFER, 1); curl_setopt( $ch ,
curlOPT_POST, 1); curl_setopt( $ch ,
curlOPT_POSTFIELDS, $data ); $output =
curl_exec( $ch ); curl_close( $ch ); print_r( $output ); |
PHP中使用CURL(二)
https不需要進行ca認證和證書中域名認證
1
2
|
curl_setopt( $ch ,CURLOPT_SSL_VERIFYHOST,false); curl_setopt( $ch ,CURLOPT_SSL_VERIFYPEER,false); |
例如:
1
2
3
4
5
6
7
|
$ch =curl_init(); $url = 'https://www.yudis.cn/callback.html' ; curl_setopt( $ch ,CURLOPT_URL, $url ); curl_setopt( $ch ,CURLOPT_RETURNTRANSFER,1); curl_setopt( $ch ,CURLOPT_SSL_VERIFYHOST,false); curl_setopt( $ch ,CURLOPT_SSL_VERIFYPEER,false); $ret =curl_exec( $ch ); |
https需要進行ca認證和證書中域名認證
1
2
3
4
|
curl_setopt( $ch ,CURLOPT_SSL_VERIFYPEER,true); //只信任CA頒佈的證書 $cacert = getcwd (). '/zhenshu.crt' ; //證書的位置 curl_setopt( $ch ,CURLOPT_CAINFO, $cacert ); //CA根證書 curl_setopt( $ch ,CURLOPT_SSL_VERIFYHOST,1); //檢查證書中是否設置域名 |
例如:
1
2
3
4
5
6
7
8
9
|
$ch =curl_init(); $url = 'https://www.yudis.cn/callback.html' ; curl_setopt( $ch ,CURLOPT_URL, $url ); curl_setopt( $ch ,CURLOPT_RETURNTRANSFER,1); curl_setopt( $ch ,CURLOPT_SSL_VERIFYPEER,true); //只信任CA頒佈的證書 $cacert = getcwd (). '/zhenshu.crt' ; //證書的位置 curl_setopt( $ch ,CURLOPT_CAINFO, $cacert ); //CA根證書 curl_setopt( $ch ,CURLOPT_SSL_VERIFYHOST,1); //檢查證書中是否設置域名 $ret =curl_exec( $ch ); |
PHP中使用CURL(三)
對 post 提交的數據進行 http_build_query處理,然後再send出去,能實現更好的兼容性,更小的請求數據包。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php /** *
PHP發送Post數據 *
@param string $url 請求url *
@param array/string $params 發送的參數 *
@return array */ function http_post_data( $url , $params = array ()) { if ( is_array ( $params )) { $params =
http_build_query( $params ,
null, '&' ); } $ch =
curl_init(); curl_setopt( $ch ,
CURLOPT_POST, 1); curl_setopt( $ch ,
CURLOPT_URL, $url ); curl_setopt( $ch ,
CURLOPT_POSTFIELDS, $params ); curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); $response =
curl_exec( $ch ); $httpCode =
curl_getinfo( $ch ,
CURLINFO_HTTP_CODE); curl_close( $ch ); return array ( $httpCode , $response ); } $url = "http://blog.snsgou.com" ; $data = array ( 'a' =>
1, 'b' =>
2, 'c' =>
2); list( $returnCode , $returnContent )
= http_post_data( $url , $data ); |
PHP中使用CURL(四)
爲了安全,我們的web服務主機往往不能上網。維護的時候,也是通過跳板機,ssh登錄後去操作。有時候我們的程序需要訪問外網。比如需要調用外網其他程序的某個接口。這時可以通過PHP的CURL函數的CURLOPT_HTTPHEADER來配置設置host訪問。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php $host = array ( "Host:
act.qzone.qq.com" ); $data = 'user=xxx&qq=xxx&id=xxx&post=xxx' ; $url = 'http://192.168.1.12/xxx/xxx/api/' ; var_dump( $this ->curl_post( $host , $data , $url )
); / *
提交請求 *
@param $host array 需要配置的域名 array ( "Host:
app.cloopen.com" ); *
@param $data string
需要提交的數據 'post=xxx' *
@param $url string
要提交的url 'https://app.cloopen.com:8883/2013-12-26/Accounts/' ; */ function curl_post( $host , $data , $url ) { $ch =
curl_init(); $res =
curl_setopt ( $ch ,
CURLOPT_URL, $url ); var_dump( $res ); curl_setopt( $ch ,
CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt( $ch ,
CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt
( $ch ,
CURLOPT_HEADER, 0); curl_setopt( $ch ,
CURLOPT_POST, 1); curl_setopt( $ch ,
CURLOPT_POSTFIELDS, $data ); curl_setopt
( $ch ,
CURLOPT_RETURNTRANSFER, 1); curl_setopt( $ch ,CURLOPT_HTTPHEADER, $host ); $result =
curl_exec ( $ch ); curl_close( $ch ); if ( $result ==
NULL) { return 0; } return $result ; } ?> |
PHP中使用CURL(五)
curl僞造IP和來源
client.php請求server.php
client.php
1
2
3
4
5
6
7
8
9
|
<?php $ch =
curl_init(); curl_setopt( $ch ,
CURLOPT_URL, "http://localhost/server.php" ); curl_setopt( $ch ,
CURLOPT_HTTPHEADER, array ( 'X-FORWARDED-FOR:8.8.8.8' , 'CLIENT-IP:8.8.8.8' )); //構造IP curl_setopt( $ch ,
CURLOPT_REFERER, "http://www.google.com/
" );
//構造來路 curl_setopt( $ch ,
CURLOPT_HEADER, 1); $out =
curl_exec( $ch ); curl_close( $ch ); ?> |
server.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php function getClientIp()
{ if (! empty ( $_SERVER [ "HTTP_CLIENT_IP" ])) $ip = $_SERVER [ "HTTP_CLIENT_IP" ]; else if (! empty ( $_SERVER [ "HTTP_X_FORWARDED_FOR" ])) $ip = $_SERVER [ "HTTP_X_FORWARDED_FOR" ]; else if (! empty ( $_SERVER [ "REMOTE_ADDR" ])) $ip = $_SERVER [ "REMOTE_ADDR" ]; else $ip = "err" ; return $ip ; } echo "IP:
" .
getClientIp() . "" ; //IP echo "referer:
" . $_SERVER [ "HTTP_REFERER" ]; //來源 ?> |
注:這個僞造建立在對方不對proxy ip還有remote_addr同時封禁的效果上。
PHP中使用CURL(六)
curl常用的幾個例子
1、抓取無訪問控制文件
1 <?php 2 $ch = curl_init(); 3 curl_setopt($ch, CURLOPT_URL, "http://localhost/mytest/phpinfo.php"); 4 curl_setopt($ch, CURLOPT_HEADER, false); 5 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把這行註釋掉的話,就會直接輸出 6 $result=curl_exec($ch); 7 curl_close($ch); 8 ?>
2、使用代理進行抓取
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://blog.snsgou.com"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE); curl_setopt($ch, CURLOPT_PROXY, 125.21.23.6:8080); //url_setopt($ch, CURLOPT_PROXYUSERPWD, 'user:password');如果要密碼的話,加上這個 $result=curl_exec($ch); curl_close($ch); ?>
3、post數據後,抓取數據
<?php $ch = curl_init(); $data = array('name' => 'test', 'sex' => 1);//array(1) curl_setopt($ch, CURLOPT_URL, 'http://localhost/mytest/curl/userinfo.php'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_exec($ch); ?>
4、抓取一些有頁面訪問控制的頁面
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://club-china"); curl_setopt($ch, CURLOPT_USERPWD, '[username]:[password]');//破解頁面訪問控制 curl_setopt($ch, CURLOPT_HTTPGET, 1); curl_setopt($ch, CURLOPT_REFERER, "http://club-china"); curl_setopt($ch, CURLOPT_HEADER, 0); $result = curl_exec($ch); curl_close($ch); ?>
5、模擬登錄
<?php function checkLogin($user, $password){ if (empty($user) || empty($password)){ return false; } $ch = curl_init(); curl_setopt($ch, CURLOPT_REFERER, "http://mail.sina.com.cn/index.html"); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, USERAGENT); curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR); curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT); curl_setopt($ch, CURLOPT_URL, "http://mail.sina.com.cn/cgi-bin/login.cgi"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, "&logintype=uid&u=" . urlencode($user) . "&psw=" . $password); $contents = curl_exec($ch); curl_close($ch); if (!preg_match("/Location: (.*)\\/cgi\\/index\\.php\\?check_time=(.*)\n/", $contents, $matches)){ return false; }else{ return true; } } define("USERAGENT", $_SERVER['HTTP_USER_AGENT']); define("COOKIEJAR", tempnam("c:\windwos\temp", "cookie")); define("TIMEOUT", 500); echo checkLogin("username", "password"); ?>
6、文件上傳
<?php /** * @param string $target_url 上傳目標地址 * @param string $filename 上傳文件路徑 * @param string $form_name 表單名稱 */ function curlUploadFile($target_url, $filename, $form_name) { $upload_file = new CURLFile($filename); $post_data = array( $form_name => $upload_file ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $target_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); } $target_url = 'http://www.codean.net/notFound/test.php'; $filename = realpath("C:/Users/HelloWorld/Desktop/Images/1.jpg"); $form_name = 'file'; // 接收端使用$_FILES接受 curlUploadFile($target_url, $filename, $form_name); ?>
7、文件流上傳
/* * 第三種寫法,使用PHP流發送 * @param string $target_url 上傳目標地址 */ function curlUploadFile($target_url) { $fh = fopen('php://temp', 'rw+'); $string = 'Hello World'; fwrite($fh, $string); rewind($fh); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $target_url); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($ch, CURLOPT_PUT, true); curl_setopt($ch, CURLOPT_INFILE, $fh); curl_setopt($ch, CURLOPT_INFILESIZE, strlen($string)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); } $target_url = 'http://www.codean.net/notFound/test.php'; curlUploadFile($target_url); // 接收端取出流文件並保存 $putdata = fopen('php://input', 'r'); $fp = fopen('test.txt', 'w'); while ($data = fread($putdata, 1024)) { fwrite($fp, $data); } fclose($fp); fclose($putdata);