ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルで POST 送信データをシミュレートする 2 つの方法

PHP_PHP チュートリアルで POST 送信データをシミュレートする 2 つの方法

WBOY
リリース: 2016-07-20 11:11:17
オリジナル
1078 人が閲覧しました

以下に、ユーザーのログインやデータの投稿を模倣できる 2 つの実装方法をまとめます。困っている人はぜひ参考にしてください。

curl 関数を使用して
PHP の CURL 関数ライブラリ (クライアント URL ライブラリ関数)

curl_close — Curl セッションを閉じる
curl_copy_handle — Curl 接続リソースのすべての内容とパラメータをコピーする
curl_errno — 現在の接続リソースのエラー情報を含む数値を返すセッション番号
curl_error — 現在のセッションのエラー情報を含む文字列を返します
curl_exec — Curl セッションを実行します
curl_getinfo — Curl 接続リソース ハンドルに関する情報を取得します
curl_init — Curl セッションを初期化します
curl_multi_add_handle — 単一の Curl セッションをCurl バッチ セッション Curl ハンドル リソース
curl_multi_close — バッチ ハンドル リソースを閉じる
curl_multi_exec — Curl バッチ ハンドルを解析する
curl_multi_getcontent — 取得した出力のテキスト ストリームを返す
curl_multi_info_read — 現在解析されている Curl の関連する送信情報を取得する
curl_multi_init — Curl バッチ ハンドル リソースを初期化します
curl_multi_remove_handle — Curl バッチ ハンドル リソース内のハンドル リソースを削除します
curl_multi_select — cURL 拡張子に関連付けられているすべてのソケットを取得し、「選択」できます
curl_setopt_array — 配列形式の Curlセッションパラメータを設定する
curl_setopt — Curl のセッションパラメータを設定する
curl_version — Curl 関連のバージョン情報を取得する

curl_init() 関数の役割は、curl セッションを初期化することです。curl_init() 関数の唯一のパラメータはオプションです。 URLアドレスを表します。
curl_exec() 関数は、curl セッションを実行するために使用されます。唯一のパラメーターは、curl_init() 関数によって返されるハンドルです。
curl_close() 関数は、curl セッションを閉じるために使用されます。唯一のパラメータは、curl_init() 関数によって返されるハンドルです。

コードは次のとおりです コードをコピー

$post_data = array();
$post_data['clientname'] = "test08";
$post_data['clientpasswd'] = "test08" ;
$post_data['submit'] = "送信";
$url='http://xxx.xxx.xxx.xx/xx/xxx/top.php';
$o="";
foreach ( $post_data as $k=>$v)
{
$o.= "$k=".urlencode($v)."&";
}
$post_data=substr($o,0, -1) ;
$ch =curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL,$url);
//In Cookie をサポートするため
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$result =curl_exec($ch);

模仿用户登录
模拟登录到sina

我们要抓取数据,可能是登录以后的内容,这个时候我们就要用到curl的模拟登录功能了。

 

 代码如下 复制代码

<?php

function checklogin( $user, $password )
 {
 if ( empty( $user ) || empty( $password ) )
 {
 return 0;
 }
 $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 0;
 }else{
 return 1;
 }
 }

define( "USERAGENT", $_SERVER['HTTP_USER_AGENT'] );
 define( "COOKIEJAR", tempnam( "/tmp", "cookie" ) );
 define( "TIMEOUT", 500 );

echo checklogin("zhangying215","xtaj227");
 ?>

2.通过fsockopen


.PHP fsockopen函数说明:

Open Internet or Unix domain socket connection(打开套接字链接)

Initiates a socket connection to the resource specified by target .

fsockopen() returns a file pointer which may be used together with the other file functions (such as fgets() , fgetss() , fwrite() , fclose() , and feof() ).就是返回一个文件句柄

开启PHP fsockopen这个函数

PHP fsockopen需要 PHP.ini 中 allow_url_fopen 选项开启。

 代码如下 复制代码


$URL=‘http://xxx.xxx.xxx.xx/xx/xxx/top.php';
$post_data['clientname'] = "test08";
$post_data['clientpasswd'] = "test08";
$post_data['submit'] = "ログイン";
$referrer="";
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="") // if not given use this script as referrer
$referrer=$_SERVER["SCRIPT_URI"];
 
// making string from $data
foreach($post_data as $key=>$value)
$values[]="$key=".urlencode($value);
 
$data_string=implode("&",$values);
// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1n";
$request.="Host: ".$URL_Info["host"]."n";
$request.="Referer: $referrern";
$request.="Content-type: application/x-www-form-urlencodedn";
$request.="Content-length: ".strlen($data_string)."n";
$request.="Connection: closen";
$request.="n";
$request.=$data_string."n";
$fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp, $request);
while(!feof($fp)) {
    $result .= fgets($fp, 128);
}
fclose($fp);

警告: D:…cos-html-cachecos-html-cache.php の 35 行目で fsockopen() がセキュリティ上の理由で無効になっている場合
cos-html-cache の別のバージョンに変更しましたが、依然として無効です働かないよ。その後、次の方法を見つけました。 (機能が無効になっているため、結果は機能しません。)
皆さんも試してみてください。私のような状況はほとんどありません。他の代替機能を使用してください。
1. fsockopen() を無効にする方法
以下は、fsockopen を無効にするためによく使用される 2 つの方法です。
1. php.ini を変更し、disable_functions = の後に fsockopen を追加します
2. php.ini を変更し、allow_url_fopen = On をallow_url_fopen = Off に変更します
2. fsockopen 関数が無効になっている場合の解決方法
1. pfsockopen を同時に無効にしないでください。その後、fsockopen 関数を pfsockopen に直接置き換えます。
具体的な操作: プログラム内で文字列 fsockopen( を検索し、それを pfsockopen( に置き換えます。例は次のとおりです。
変更前:
$fp = fsockopen($host, 80, $errno, $errstr, 30);
変更後:
$fp = pfsockopen($host, 80, $errno, $errstr, 30);


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/444664.html技術記事以下に、ユーザーのログインやデータの投稿を模倣できる 2 つの実装方法をまとめます。困っている人はぜひ参考にしてください。 PHPのcurl関数を通して...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート