Guzzle
Guzzle是一個PHP的HTTP客戶端,用來輕而易舉地傳送請求,並整合到我們的WEB服務上。
-
介面簡單:構建查詢語句、POST請求、分流上傳下載大檔案、使用HTTP cookies、上傳JSON資料等等 。
-
傳送同步或非同步的請求均使用相同的介面。
-
使用PSR-7介面來請求、響應、分流,允許你使用其他相容的PSR-7類庫與Guzzle共同開發。
-
抽象了底層的HTTP傳輸,允許你改變環境以及其他的程式碼,如:對cURL與PHP的流或socket並非重度依賴,非阻塞事件迴圈。
-
中介軟體系統允許你建立構成客戶端行為。
所需包
"require": {
"guzzlehttp/guzzle": "6.2.*"
}
原始碼
<?php
include_once dirname(__FILE__).`/vendor/autoload.php`;
use GuzzleHttpClient;
use GuzzleHttpCookieCookieJar;
use GuzzleHttpExceptionRequestException;
/**
* 豆瓣租房刷留言
*/
class DouBanBrush{
public $jar;
public $clock = 10;
const SLEEP = 1200; // 睡20 分鐘
/**
* [__autoload 初始化]
* @author Shaowei Pu <542684913@qq.com>
* @CreateTime 2017-04-12T10:39:28+0800
* @param [type] $account [description]
* @param [type] $password [description]
* @return [type] [description]
*/
public function __construct( $account, $password ){
$this->jar = new CookieJar;
try{
if( $this->login( $account, $password ) == `200`){
echo "----------【 START 】----------
";
$this->send();
echo "----------【 END 】----------
";
}else{
echo "登入失敗~!";
}
}catch (RequestException $e) {
var_dump( $e->getRequest());
if ($e->hasResponse()) {
var_dump( $e->getResponse());
}
}
}
/**
* [login 登入]
* @author Shaowei Pu <542684913>
* @CreateTime 2017-04-12T10:42:16+0800
* @return [type] [description]
*/
public function login( $account , $password ){
// 清楚空間內cookie
// $this->jar->clear();
return ( new Client([ `cookies` => true ]) )->request(
`POST`,
`https://accounts.douban.com/j/popup/login/basic`,
[
`version` => 1.1 ,
`cookies` => $this->jar,
`headers` => [
`Accept` => `application/json`,
`Referer` => `登入來源頁`
],
`form_params` => [
`source` => `group`,
`referer` => `提交介面`,
`name` => $account,
`password` => $password,
`captcha_id` => ``,
`captcha_solution` => ``
]
])->getStatusCode();
}
/**
* [send 傳送內容]
* @author Shaowei Pu <542684913@qq.com>
* @CreateTime 2017-04-12T10:43:17+0800
* @return [type] [description]
*/
public function send() {
// 獲得 ck
$this->reload();
$ck = `ntxB`;
array_map(function( $val ) use (& $ck ){ $val[`Name`] == `ck` && $ck = $val[`Value`]; }, $this->jar->toArray());
// 計時器
while ( $this->clock > 0 ) {
$send_content = ( new Client([ `cookies` => true ]) )->request(
`POST`,
`提交介面`,
[
`version` => 1.1,
`cookies` => $this->jar,
`headers` => [
`Accept` => `application/json`,
`Referer` => `來源頁`
],
`form_params` => [
`ck` => $ck,
`rv_comment` => `自己頂一下~!`,
`start` => 0,
`submit_btn` =>`加上去`
]
])->getBody()->getContents();
echo date(`Y-m-d H:i:s`).` `.$this->clock."
";
sleep( self::SLEEP );
--$this->clock;
}
}
/**
* [reload 重新整理頁面]
* @author Shaowei Pu <542684913@qq.com>
* @CreateTime 2017-04-12T13:35:58+0800
* @return [type] [description]
*/
public function reload(){
(new Client([ `cookies` => true ])) ->request(`GET`, `訪問頁`,[
`cookies` => $this->jar,
`headers` => [
`Accept` => `application/json`,
`Referer` => `來源頁`
]]);
}
}
new DouBanBrush(`賬號`,`密碼`);
還沒做的事
-
驗證碼識別
-
優化效率
致敬
像 @娃娃脾氣 大佬致敬