利用Guzzle刷豆瓣熱評引發的聯想

無敵小籠包發表於2019-02-16

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(`賬號`,`密碼`);

還沒做的事

  • 驗證碼識別

  • 優化效率

致敬

像 @娃娃脾氣 大佬致敬

相關文章