标签:
浏览器发送 POST 请求:
表单 form.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="a.php" method="post">
username: <input type="text" name="username">
password: <input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
a.php 接收数据
<?php print_r($_POST);
HTTP POST 的请求和响应



telnet 模拟 POST 请求:


POST /php/http/a.php HTTP/1.1
Host: 127.0.0.17
Content-type: application/x-www-form-urlencoded
Content-length: 28
username=dee&password=123456HTTP/1.1 200 OK
Date: Sat, 11 Jul 2015 17:05:31 GMT
Server: Apache/2.2.21 (Win32) PHP/5.3.10
X-Powered-By: PHP/5.3.10
Content-Length: 57
Content-Type: text/html
Array
(
[username] => dee
[password] => 123456
)
http 发送类 http.calss.php 补全 POST 请求:
测试打印拼接的 POST 请求的请求行、头信息、主体信息,代码:
<?php
/*
PHP + socket 编程
@发送 HTTP 请求
@模拟下载
@实现注册、登录、批量发帖
*/
//http 请求类的接口
interface Proto{
//连接 url
function conn($url);
//发送 GET 请求
function get();
//发送 POST 请求
function post();
//关闭连接
function close();
}
class Http implements Proto{
//换行符
const CRLF = "\r\n";
//fsocket 的错误号与错误描述
protected $errno = -1;
protected $errstr = ‘‘;
//响应内容
protected $response = ‘‘;
protected $url = null;
protected $version = ‘HTTP/1.1‘;
protected $fh = null;
protected $line = array();
protected $header = array();
protected $body = array();
public function __construct($url){
$this->conn($url);
$this->setHeader(‘Host:‘ . $this->url[‘host‘]);
}
//写请求行
protected function setLine($method){
$this->line[0] = $method . ‘ ‘ . $this->url[‘path‘] . ‘ ‘ . $this->version;
}
//写头信息
protected function setHeader($headerline){
$this->header[] = $headerline;
}
//写主体信息
protected function setBody($body){
//构造 body 的字符串
$this->body[] = http_build_query($body);
}
//连接 url
public function conn($url){
$this->url = parse_url($url);
//判断端口
if(!isset($this->url[‘port‘])){
$this->url[‘port‘] = 80;
}
$this->fh = fsockopen($this->url[‘host‘], $this->url[‘port‘], $this->errno, $this->errstr, 3);
}
//构造 GET 请求的数据
public function get(){
$this->setLine(‘GET‘);
//发送请求
$this->request();
return $this->response;
}
//构造 POST 请求的数据
public function post($body = array()){
//构造请求行
$this->setLine(‘POST‘);
//设置 Content-type 和 Content-length
$this->setHeader(‘Content-type: application/x-www-form-urlencoded‘);
//构造主体信息, 和 GET 请求不一样的地方
$this->setBody($body);
$this->setHeader(‘Content-length: ‘ . strlen($this->body[0]));
//发送请求
$this->request();
return $this->response;
}
//发送请求
public function request(){
//把请求行、头信息、主体信息拼接起来
$req = array_merge($this->line, $this->header, array(‘‘), $this->body, array(‘‘));
$req = implode(self::CRLF, $req);
echo $req;exit;
fwrite($this->fh, $req);
while(!feof($this->fh)){
$this->response .= fread($this->fh, 1024);
}
//关闭连接
$this->close();
}
//关闭连接
public function close(){
fclose($this->fh);
}
}
set_time_limit(0);
//$url = ‘http://book.douban.com/subject/26376603/‘;
$url = ‘http://127.0.0.17/php/http/a.php‘;
$http = new Http($url);
//echo $http->get();
//打乱
$str = str_shuffle(‘abcdefghijklmnopqrstuvwxyz0123456789‘);
$username = substr($str, 0, 5);
$password = substr($str, 6, 12);
$body = array(
‘username‘=>$username,
‘password‘=>$password
);
$http->post($body);
echo $username,‘--‘,$password;
输出:
然后发送请求,同时配合 for 循环就可以进行(不注册且没有验证码的)批量注册(把 username 换成 title,password 换成 content,可以使用 php 的命令行工具 ,在 cmd 中执行 php.exe 文件路径)。
使用命令行如下所示:

完整代码:
<?php
/*
PHP + socket 编程
@发送 HTTP 请求
@模拟下载
@实现注册、登录、批量发帖
*/
//http 请求类的接口
interface Proto{
//连接 url
function conn($url);
//发送 GET 请求
function get();
//发送 POST 请求
function post();
//关闭连接
function close();
}
class Http implements Proto{
//换行符
const CRLF = "\r\n";
//fsocket 的错误号与错误描述
protected $errno = -1;
protected $errstr = ‘‘;
//响应内容
protected $response = ‘‘;
protected $url = null;
protected $version = ‘HTTP/1.1‘;
protected $fh = null;
protected $line = array();
protected $header = array();
protected $body = array();
public function __construct($url){
$this->conn($url);
$this->setHeader(‘Host:‘ . $this->url[‘host‘]);
}
//写请求行
protected function setLine($method){
$this->line[0] = $method . ‘ ‘ . $this->url[‘path‘] . ‘ ‘ . $this->version;
}
//写头信息
protected function setHeader($headerline){
$this->header[] = $headerline;
}
//写主体信息
protected function setBody($body){
//构造 body 的字符串
$this->body[] = http_build_query($body);
}
//连接 url
public function conn($url){
$this->url = parse_url($url);
//判断端口
if(!isset($this->url[‘port‘])){
$this->url[‘port‘] = 80;
}
$this->fh = fsockopen($this->url[‘host‘], $this->url[‘port‘], $this->errno, $this->errstr, 3);
}
//构造 GET 请求的数据
public function get(){
$this->setLine(‘GET‘);
//发送请求
$this->request();
return $this->response;
}
//构造 POST 请求的数据
public function post($body = array()){
//构造请求行
$this->setLine(‘POST‘);
//设置 Content-type 和 Content-length
$this->setHeader(‘Content-type: application/x-www-form-urlencoded‘);
//构造主体信息, 和 GET 请求不一样的地方
$this->setBody($body);
$this->setHeader(‘Content-length: ‘ . strlen($this->body[0]));
//发送请求
$this->request();
return $this->response;
}
//发送请求
public function request(){
//把请求行、头信息、主体信息拼接起来
$req = array_merge($this->line, $this->header, array(‘‘), $this->body, array(‘‘));
$req = implode(self::CRLF, $req);
//echo $req;exit;
fwrite($this->fh, $req);
while(!feof($this->fh)){
$this->response .= fread($this->fh, 1024);
}
//关闭连接
$this->close();
}
//关闭连接
public function close(){
fclose($this->fh);
}
}
set_time_limit(0);
//$url = ‘http://book.douban.com/subject/26376603/‘;
$url = ‘http://127.0.0.17/php/http/a.php‘;
$http = new Http($url);
//echo $http->get();
//批量
for($i = 1; $i < 100; $i++){
//打乱
$str = str_shuffle(‘abcdefghijklmnopqrstuvwxyz0123456789‘);
$username = substr($str, 0, 5);
$password = substr($str, 6, 12);
$body = array(
‘username‘=>$username,
‘password‘=>$password
);
$http->post($body);
echo $username,‘--‘,$password;
usleep(2000);
}
标签:
原文地址:http://www.cnblogs.com/dee0912/p/4639388.html