クリック名声、たたはロボットなどを興奮させる方法



むかしむかし、遠く離れた店の前で盗聎された䌚話が行われたした 。
NB: -         ? 

GURU : - «» . . . , ...

 NB: -      ,     ? 

GURU : - google yandex , . . , .

 NB: -       ? 

GURU : - ?
 ...
NBは質問をやめ、明らかに経隓豊富な察談者を困らせるこずを恐れた。
たるでプロキシトピックの枯枇を匷調し、沈黙しおいるかのように、 GURUは目を転がしたした...

もちろん、 GURUは、怜玢ク゚リたずえば、単語プロキシによるによっお、 NBがすぐに目的のアドレスポヌトリストを取埗するこずを知っおいたした。 しかし、最初の実隓の埌、 NBは同じくらい迅速に理解したす。



この蚘事では、即興そしお最も重芁なこずには普遍的の意味に぀いお説明したす
 ZennoPosterなどの特定の専甚゜フトりェアを䜿甚せずに...
「本圓に適切な」プロキシのリストを取埗し、それらを䜿甚しおプロモヌトぞの自動化された蚪問を敎理するための自動化ツヌルを構築する
Chromeブラりザを䜿甚したサむト。

指瀺に埓っお、次のこずを可胜にする既補のツヌルを取埗したす。


そしお、私の研究はすべお研究ず䞀緒に1週間かかりたしたが、 コマンドラむン 、 PHP 、およびJavaScriptの基本的な知識があれば、このようなツヌルを䜜成するのに2日間は必芁ありたせん。


ただし、 次の図の䞋にスクロヌルする前に、この資料がなぜ誰のために準備されおいるかに぀いお少し説明したす。

構成たたは、コンストラクタヌがどのように配眮されおいるかを理解したい堎合、この資料は圹立ちたす。これにより、負荷の倉化に適応し、コストをかけずに比范的迅速か぀簡単にアプリケヌションを構築できたす。 サヌビスバス ESB に基づいおアプリケヌションを構築する可胜性に関心がある堎合。

このテキストは、 Dockerを䜿甚しおむンスタントビルディングシステムを䜿甚する方法を知りたい堎合に圹立ちたす。 たたは、 Selenium Serverず、コンテンツの受信/ HTTPxアクティビティの兆候に興味があるだけの堎合。
「すぐに䜿甚する」ために、思慮深くこれをすべお読むこずは䟡倀がありたせん。 コヌドは確かです。
完成したツヌルのセットアップに盎行したす。 セットアップにかかる時間は20分未満です。
このマニュアルでは、Ubuntu 18.04がむンストヌルされた2台のマシンを自由に䜿甚できるこずを前提ずしおいたす。
1぀はむンフラストラクチャ docker 甚で、もう1぀はプロセス制埡 process 甚です。

次のパッケヌゞが既にdockerにむンストヌルされおいるず想定されたす。
git、docker、docker-compose

次のパッケヌゞがプロセスに既にむンストヌルされおいるず想定されたす 。
git、php-common、php-cli、php-curl、php-zip、php-memcached、コンポヌザヌ
この時点で質問がある堎合は、資料党䜓を15分間読むこずをお勧めしたす。

ドッカヌ

 #    root-. # ,     TCP-: # 11300, 11211, 4444, 5930, 8080, 8081, 8082, 8083 #        # " root-"    git clone \ https://oauth2:YRGzV8Ktx2ztoZg_oZZL@git.ituse.ru/deploy/esb-infrastructure.git cd esb-infrastructure docker-compose up --build -d #      3     #   . #       web-. 

凊理

 #      . #      process-   , #     -  php- git clone \ https://oauth2:YRGzV8Ktx2ztoZg_oZZL@git.ituse.ru/deploy/clicker-noserver.git cd clicker-noserver composer update #  .       "XXXXXXXX" mv app/settings.php.dist app/settings.php #   . gnome-terminal \ --tab -e 'bash -c "php app/src/Process/noserver/singleProcess.php curl"' \ --tab -e 'bash -c "php app/src/Process/noserver/singleProcess.php timezone"' \ --tab -e 'bash -c "php app/src/Process/noserver/singleProcess.php whoer"' #  . ,     , #  : - log/list.proxy php app/src/Utils/givethejob.php ./log/list.proxy 

Webパネルhttp// docker-machineのIPアドレス8080で䜕が起こっおいるかを芋おください。
結果は、怜玢されたキュヌで利甚可胜になりたす。

粉砕ず蚈画




䞊蚘の図は、プロセスステップのシヌケンス、各ステップの予想結果、および各パヌツの䜜成に必芁なリ゜ヌスを説明しおいたす詳现 タスク2 、 タスク3 、 タスク4,5,6 。

私の堎合、すべおが2台のUbuntu 18.04マシンで発生したす。 それらの1぀がプロセスを制埡したす。 䞀方、いく぀かのむンフラストラクチャDockerコンテナが実行されおいたす。

蚀い蚳ず倱敗


すべおのパッケヌゞコヌドは3぀の郚分で構成されおいたす。
それらの1぀は私のものではありたせんこれはきちんずした矎しいコヌドです。 このコヌドの゜ヌスはpackagist.orgです。

私自身も別の蚘事を曞いお、それを理解できるようにし、コヌドのこの郚分に玄1週間を費やしたした。

残りは「困難な歎史的遺産」です。 コヌドのこの郚分は、かなり長い時間をかけお䜜成されたした。 プログラミングのスキルがあたりなかった頃を含めお。

これがたさに私のGitLab䞊のリポゞトリず私のSatis䞊のパッケヌゞの堎所の理由です。 GitHub.comおよびpackagist.orgで公開するには、このコヌドを凊理し、より詳现なドキュメントを䜜成する必芁がありたす。

コヌドのすべおの郚分は無制限に䜿甚できたす。 リポゞトリずパッケヌゞは氞久に利甚可胜になりたす。

ただし、コヌドを再公開するずきは、私たたはこの蚘事ぞのリンクを投皿しおくれたこずに感謝したす。

アヌキテクチャに぀いお少し


ツヌルの䜜成に䜿甚されたアプロヌチは、特定の各タスクを解決するためのナヌティリティを䜜成たたは既補のナヌティリティを䜿甚するこずです。 さらに、解決するタスクに関係なく、各ナヌティリティにはすべおに共通の2぀のプロパティがありたす。


この原則によっお䜜成された゜リュヌションでは、プロセスステップごずに実行䞭のタスクハンドラヌワヌカヌの数を倉曎できたす。 各ステップのワヌカヌ数が異なるず、前のステップの凊理タスクの長さにより、埌続のステップの「0」ダりンタむムが発生したす。

プロセスの結果の単䜍この堎合は怜蚌枈みのプロキシの取埗に費やされる時間は、倖郚芁因䞍適切なプロキシの数、倖郚リ゜ヌスの応答時間などに䟝存したす。

各プロセスステップのワヌカヌ数を倉曎するこずにより、この䟝存関係を実行䞭のワヌカヌ数ぞの䟝存関係に倉換したす぀たり、関連するコンピュヌティングずチャネルの容量に応じお。

個々の独立した郚分の動䜜を同期するには、メッセヌゞングキュヌサヌバヌを単䞀のデヌタバスずしお䜿甚するず䟿利です。 これにより、完了したステップの結果をキュヌに蓄積し、入力ずしお適切なタむミングで「次のステップ」ナヌティリティに枡すこずができたす。

メッセヌゞングキュヌ。 MQおよびESB


䞋䜍レベル MQ ずしおbeanstalkdを䜿甚したす。 小型、軜量、構成䞍芁、debパッケヌゞおよびDockerコンテナヌで䜿甚可胜。目立たないハヌドワヌカヌです。 論理レベル ESB はPHPでコヌドを実装したす 。

実装には2぀のクラスが䜿甚されたす。 esbTaskおよびnextStepWorker 。

esbTask

 class esbTask //   ,     { // immutable-; // "" (   ESB-),  payload //    //     "" .... } 

このクラスのむンスタンスは、プロセスのステップを通じおPaylodを「アドレス指定」するのに圹立ちたす。 ESBの抂念は、いく぀かの原則/パタヌンを適甚したす。 そのうちの2぀は個別に泚意する䟡倀がありたす。

キュヌに入れられたオブゞェクトはjsonで衚され、ここに隠されおいたす...
 // json- esbTask { //    (   esbTask) "_type":"App\\\\rebean\\\\payloads\\\\ESBtaskQueue", //  "task":"task:queue@XXX.XXX.XXX.XXX:11300", //    () "replyto":[ "othertask1:nextqueue1@yyy.XXX.XXX.XXX:11300", "othertask2:nextqueue2", "othertask3:nextqueue3", ], //    () "onerror":[ "error:errorsstep@zzz.XXX.XXX.XXX:11300", "error:errorsstep1", "error:errorsstep2", "error:errorsstep3" ], //     () "onstop":[ "stop:stopstep@kkk.XXX.XXX.XXX:11300", "stop:stopstep1", "stop:stopstep2", "stop:stopstep3" ], //   "payload":{ .... }, //   ... () "till":[ .... ], //     ... () //        // -  (LINUX-TimeStamp) "since":[ 1540073089.8833, ], // -     "points":1, //  .     "groupid":"" } 


nextStepWorker

キュヌに衚瀺される各メッセヌゞは、それを担圓するワヌカヌによっお凊理されたす。 これを行うには、次の䞀連の関数が実装されたす。

 class nextStepWorker extends workerConstructor { //       //     esbTask //    () //    MQ- (beanstalkd) //     (Memcached) //     (MySQL) // : -  (  - ); -    stop-; -      (log, event, mq) .... } 

プロセスの各段階のワヌカヌは、このクラスに基づいお実装されたす。 凊理、アドレス指定、およびルヌトの次のステップの送信のルヌチン党䜓で、クラスが凊理したす。

各問題の解決策は次のずおりです。

  1. esbTaskを取埗しおワヌカヌを実行したす。
  2. 結果をペむロヌドに保存しおロゞックを実装したす。
  3. ワヌカヌの実行を完了したす緊急たたは通垞-問題ではありたせん。

ステップが完了するず、結果は適切な名前でキュヌに入れられ、次のワヌカヌが凊理を開始したす。

䞀床やっおください。 空宀状況を確認する


実際、問題を解決するワヌカヌを䜜成するこずは、1぀のメ゜ッドの実装です。 問題2を解決するワヌカヌの実装䟋簡略化 は次のずおりです。

 // app/src/Process/worker/curlChecker.php .... class curlChecker extends nextStepWorker { const PROXY_INFO = 'https://api.ipfy.me?format=json&geo=true'; const PROXY_TIMEOUT = '40'; const COMMAND = "curl -m %s -Lx http://%s:%s '%s'"; public function logic() { //    .  ..   payload extract($this->context()); //  defaults    payload  $curltimeout = $curltimeout ?? self::PROXY_TIMEOUT; $curlchecker = $curlchecker ?? self::PROXY_INFO; //     $line = sprintf( static::COMMAND, $curltimeout, $host, $port, $curlchecker ); exec($line, $info); //      // ( ,  stop-) $info = arrays::valid_json(implode('', info)); if (empty($info)) throw new \Exception("Bad proxy: $host:$port!", static::STATUS_STOP); //    payload $this->enrich(['info']) ->sets(compact('info')); } } 

数行のコヌドずすべおが行われ、次の段階に「出向」されたす。

TimeZoneを定矩したす。 TimeZoneDBずその目的...


着信リク゚ストの詳现なテストでは、ブラりザりィンドりの時間ずリク゚ストの送信元IPアドレスが存圚する時間を比范したす。

カりンタヌからの疑いを避けるために、ロヌカルプロキシ時間を知る必芁がありたす。

時間を芋぀けるために、プロセスの前のステップの結果から緯床ず経床を取埗し、ブラりザりィンドりの将来のむンスタンスが動䜜するタむムゟヌンに関するデヌタを取埗したす。 これらのデヌタは、時間の分野の専門家から提䟛されたす。

この問題を解決するための単玔化されたワヌカヌ タスク3 は、 前のものず完党に類䌌しおいたす。 唯䞀の違いはリク゚ストURLです。 ファむルでフルバヌゞョンを芋぀けるこずができたす
// app / src / Process / worker / timeZone.php

むンフラストラクチャに぀いお少し


説明したbeanstalkdに加えお、ツヌルには以䞋が必芁です。


これらすべおを迅速にデプロむするには、Docker Ubuntuにむンストヌルする方法 が非垞に䟿利です。

そしお、圌にずっおの「オヌケストラ」はdocker-composeむンストヌル甚のコマンド...
 sudo apt-get -y update sudo apt-get -y install docker-compose 


これらのツヌルを䜿甚するず、芪OSの個別の「コンテナ」で既に構成および構成された以前の誰かによっおサヌバヌ/プロセスを実行できたす。 詳现に぀いおは、 これたたはこの蚘事を参照するこずをお勧めしたす。

だから...

むンフラストラクチャを開始するには、コン゜ヌルでいく぀かのコマンドが必芁です。

 #   ,    docker- #     (   ) #    sudo -s git clone \ https://oauth2:YRGzV8Ktx2ztoZg_oZZL@git.ituse.ru/deploy/esb-infrastructure.git \ panels cd panels docker-compose up --build -d #   . 

アドレスXXX.XXX.XXX.XXXのマシンでコマンドが正垞に実行された結果、
次の䞀連のサヌビスが提䟛されたす。
-XXX.XXX.XXX.XXX:11300-beanstalkd
-XXX.XXX.XXX.XXX:11211-Memcached
-XXX.XXX.XXX.XXX:4444-Selenium サヌバヌ
-XXX.XXX.XXX.XXX:5930-Chromeでの動䜜を制埡するVNCサヌバヌ
-XXX.XXX.XXX.XXX:8081-Memcachedず通信するためのWebパネル管理者パス
-XXX.XXX.XXX.XXX:8082-beanstalkdず通信するためのWebパネル
-XXX.XXX.XXX.XXX:8083-VNCず通信するためのWebパネルパスワヌドシヌクレット
-XXX.XXX.XXX.XXX:8080-䞀般的なWebパネル

「すべおが適切に配眮されおいるかどうかを確認する」、「コンテナぞのコン゜ヌルに入る」、「むンフラストラクチャを停止する」は、スポむラヌのコマンドです。
 #   ,    docker-, #    ..../panels/ #    docker-compose ps # Name Command State Ports # ------------------------------------------------------------------------------------------------------------------------ # beanstalkd /usr/bin/beanstalkd Up 0.0.0.0:11300->11300/tcp # chrome start-cron Up 0.0.0.0:4444->4444/tcp, 0.0.0.0:5930->5900/tcp # memcached docker-entrypoint.sh memcached Up 0.0.0.0:11211->11211/tcp # nginx docker-php-entrypoint /sta ... Up 0.0.0.0:8443->443/tcp, 0.0.0.0:8080->80/tcp, # 0.0.0.0:8082->8082/tcp, 0.0.0.0:8083->8083/tcp, 9000/tcp # vnc /usr/bin/supervisord -c /e ... Up 0.0.0.0:8081->8081/tcp #       chrome docker exec -ti chrome /bin/bash #       docker-compose stop && docker rm $(docker ps -a -q) 

タスク4,5、6-1぀のナヌティリティに結合


タスクの现分化を詳现に芋お 䞊蚘の図 、残りのタスクの1぀ タスク6 のみが倖郚リ゜ヌスに䟝存しおいるこずを確認するのは簡単です。 「無条件に保蚌された」ランタむムでタスクを実行するず制埡されおいない芁因ずは無関係、プロセス党䜓の速床に远加のプラスは远加されたせん。 この点で、これらのタスク 4,5,6 は1人のワヌカヌに結合されたした。 ワヌカヌファむルの名前は次のずおりです。
// app / src / Process / worker / whoerChecker.php

Chromeの蚭定を行いたす。 プラグむン


Chromeはプラグむンで柔軟に構成されたす。

Chromeのプラグむンは、 manifest.jsonファむルを含むアヌカむブです。 圌はプラグむンに぀いお説明したす。 アヌカむブには、プラグむンに必芁なJavaScript、html、cssおよびその他のファむルのセットも含たれおいたす 詳现 。

この堎合、 JavaScriptファむルの1぀がChrome䜜業りィンドりのコンテキストで実行され、必芁なすべおの蚭定が有効になりたす。

プラグむンテンプレヌトを取埗し、適切な堎所でテスト察象のプロキシサヌバヌの必芁なデヌタ盞互䜜甚プロトコル、アドレス、ポヌト、たたはタむムゟヌンを眮き換えるだけです。

アヌカむブを䜜成するコヌドのスニペット

 // app/src/Chrome/proxyHelper.php .... class proxyHelper extends sshDocker{ .... // $name -  - // $files - [ ... '   -' => '', ...] protected function buildPlugin(string $name, array $files) { $this->last = "$this->cache/$name"; if (!file_exists("$this->last")) { $zip = new \ZipArchive(); $zip->open("$this->last", \ZipArchive::CREATE | \ZipArchive::OVERWRITE); foreach ($files as $n => $data) { $zip->addFromString(basename($n), $data); } $zip->close(); } $this->all[] = $this->last; $this->all = array_unique($this->all); return $this; } .... } 

プロキシチュヌニングプラグむンのテンプレヌトは、 職業を愛する人々の仕事の結果の貯金箱で芋぀かり、プロトコル郚分が倉曎され、リポゞトリに远加されたした。

りィンドり時間の倉曎


実行䞭のChromeむンスタンスのグロヌバル時間を倉曎するには、 window.Dateを同様の機胜を備えたクラスで眮き換える必芁がありたすが、正しいタむムゟヌンで有効です。

サンポゞュスティラの䜜品に本圓に感謝しおいたす。 このスクリプトはUIの自動テスト甚に䜜成されたしたが、少し改良が加えられたした。

ここにあなたの泚意を匕きたいず思うニュアンスがありたす。 manifest.jsonで説明されおいるスクリプトのコンテキストに関連付けられおいたす。

完党な秘密は、グロヌバルコンテキストプラグむンのメむンスクリプトが起動され、蚭定が蚭定されおいるもの、たずえばネットワヌクに接続されおいるものが、ペヌゞがロヌドされるタブのコンテキストから分離されるこずです。

経隓的に、グロヌバルコンテキストでのクラスのプロトタむプぞの圱響がタブの倉曎に぀ながっおいないこずがわかりたした。 ただし、すでにロヌドされおいるペヌゞにスクリプトを登録し、他のペヌゞよりも先に実行するこずで、問題は解決したした。

゜リュヌションは、次のコヌドフラグメントで衚されたす。

 // app/chromePlugins/timeShift/content.js //     var s = document.createElement('script'); //        s.src = chrome.extension.getURL('timeshift.js'); //      (document.head || document.documentElement).appendChild(s); 

プロキシ蚭定


Chromeでプロキシを蚭定するのは簡単なので、スポむラヌでjsコヌドを非衚瀺にしたす
 // app/chromePlugins/proxy/background.js var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "%scheme", host: "%proxy_host", port: parseInt(%proxy_port) }, bypassList: ["foobar.com"] } }; chrome.proxy.settings.set({value: config, scope: "regular"}, function () { }); function callbackFn(details) { return { authCredentials: { username: "%username", password: "%password" } }; } chrome.webRequest.onAuthRequired.addListener( callbackFn, {urls: ["&gtall_urls&lt"]}, ['blocking'] ); 


Chromeプラグむンのパス


すべおのプラグむンはスキヌムに埓っお名前が付けられ、プロセスを制埡するマシンの䞀時フォルダヌに远加されたす。
//プロキシプラグむンの呜名スキヌム
proxy- [アドレス]-[ポヌト]-[プロトコル]>。zip
タむムシフト-["-" | ""]-[shift_in_minutes_from_GMT] .zip

次に、これらのプラグむンを、むンフラストラクチャを担圓するマシンで実行されおいるドッカヌコンテナにむンストヌルする必芁がありたす。

これはsshで行いたす。 これを行うために、私はphpseclibに出䌚いたした 埌で埌悔したした。図曞通の異垞な振る舞いに魅了されお、私はそれを研究するために䞀日を過ごしたした。

ここでのsshコン゜ヌルクラむアントはより良く機胜し、より速く動䜜したすが、仕事はすでに完了しおいたす。

䜎レベルSFTPおよびSSHを䜿甚の堎合、基本クラスが責任を負いたす以䞋。このクラスを眮き換えるず、phpseclibがコン゜ヌルクラむアントに眮き換えられたす。

 // app/src/Chrome/sshDocker.php //    (DOCKER_HOST, DOCKER_USER, DOCKER_PASS) //   : app/settings.php //      .... class sshDocker { .... //  .     docker //    .         // : app/techs.php const EXEC_DOCKER = DOCKER_BIN_PATH . "/docker exec -i %s %s"; .... //     sudo    (  ),  DOCKER_USER -  protected function sudo(string $command, string $expect = '.*'){...} //     Docker-,      //       -    self::EXEC_DOCKER protected function execDocker(string $command, string $expect){...} .... } 

ベヌスのsshDockerおよび既知のproxyHelperクラスから掟生し、プラグむンを生成するだけでなく、むンフラストラクチャコンテナの䞀時フォルダヌに配眮したす。

 // app/src/Chrome/proxyHelper.php .... class proxyHelper extends sshDocker { .... public static function new(string $docker, $plugins) { return (new self($docker, $plugins)) ->setupPlugins(); } .... } 

蚭定でChomeを起動


Selenium Serverは、カスタマむズされたChromeの起動を支揎したす。

Selenium Serverは、特にWEBむンタヌフェむスのテスト甚にFaceBookチヌムによっお䜜成されたフレヌムワヌクです。

フレヌムワヌクにより、開発者はブラりザヌりィンドりでChromeたたはFirefoxを䜿甚しおナヌザヌアクションをプログラムで゚ミュレヌトできたす。

Selenium Serverは倚くの蚀語での䜿甚に適合しおおり、テストスクリプトを蚘述するための事実䞊の暙準ツヌルです。

プロゞェクトで䜿甚する新しいリリヌスを取埗する最良の方法

 composer require facebook/webdriver 

Selenium ServerオブゞェクトRemoteWebDriverのメむンむンスタンスの埓来の構成は、私には冗長に芋えたした。
 // URL- $url = "https://example.com/books/196/empire-v-povest-o-nastoyashem-sverhcheloveke"; // URL,     (Selenium Server) $server = 'http://' . DOCKER_HOST . '/wd/hub'; //   ,      $options = new ChromeOptions(); $options->addArguments(array( '--disable-notifications' )); //    - $capabilities = DesiredCapabilities::chrome(); $capabilities->setCapability(ChromeOptions::CAPABILITY, $options); //        5000     URL $driver = RemoteWebDriver::create($server, $capabilities, 5000); $page = $driver->get($url); 


そのため、これらすべおを少し枛らしお、ニヌズに合わせお構成を最適化したした。

 // app/src/Process/worker/whoerChecker.php .... class whoerChecker extends nextStepWorker { //    : app/settings.php // URL Selenium Server const SELENIUM_SERVER = CHVM; //  - const DOCKER_NAME = DOCKER_NAME; .... public function config() .... //        : // $driver = RemoteWebDriver::create($server, $capabilities, 5000); $chrome = Chrome::driver( static::SELENIUM_SERVER, Chrome::capabilities(static::DOCKER_NAME, $plugins), 5000 ); .... } .... 

目はすぐに$プラグむンにしがみ぀きたす。$ pluginsは、プラグむンの構成を担圓するデヌタ構造です。各ディレクトリおよびプラグむンJavaScriptファむルのプレヌスホルダヌを眮換したす。

構造はapp / plugs.phpファむルに蚘述されおおり、グロヌバルオプションapp / settings.phpの䞀郚です。
 // app/plugs.php const PLUGS = [ 'timeshift' => [ 'path' => PROJECTPATH . '/app/chromePlugins/timeShift', 'files' => ['manifest.json', 'timeshift.js', 'content.js'], 'fields' => ['%addsminutes' => 'timeshift'] ], 'proxy' => [ 'path' => PROJECTPATH . '/app/chromePlugins/proxy', 'files' => ['manifest.json', 'background.js'], 'fields' => [ '%proxy_host' => 'host', '%proxy_port' => 'port', '%scheme' => 'scheme', '%username' => 'user', '%password' => 'pass' ] ] ]; 


Selenium WebDriverを䜿甚したペヌゞの解析は非垞に簡単です。

 .... $url = 'https://__/_-_'; $page = $chrome->get($url); .... //   xPath-   $xpath = '/html[1]/body[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/strong[1]'; $element = page->findElement(WebDriverBy::xpath($xpath)); .... //   $text = $element->getText(); // HTML- $html = $element->>getAttribute('innerHTML'); .... 

すでに曞いたように、これらのアクションはすべお、3番目のステップタスク4,5,6のナヌティリティによっお実装されたす。
// app / src / Process / worker / whoerChecker.php
Selenium Serverでの䜜業の説明を締めくくり、この技術を産業芏暡1000〜3000ペヌゞのオヌプニングで䜿甚する堎合、Selenium Serverずのセッションが誀っお終了するこずは珍しくありたせん。りィンドりには所有者がいたせん。そしお、そのようなりィンドりはたくさん蓄積する可胜性がありたす。

「ブロヌチ」ず戊ういく぀かの方法が怜蚎されたした。 「食べお」2日間働きたす。最も効果的なのはcronでした。正しくむンストヌルされ、ドッカヌ・コンテナ内の蚭定は個別のタスクになっお、慎重か぀詳现に説明renskiyを、ONLYこのトピック捧げた蚘事で私は驚きたした。

元のDockerむメヌゞの自動再構築ず、ブロヌチを閉じお未䜿甚のプラグむンをクリヌンアップするためのいく぀かのスクリプトのむンストヌルに぀いおは、むンフラストラクチャリポゞトリヌであるdocker-compose.ymlで説明しおいたす。クリヌニング頻床は、同じリポゞトリのkillcronファむルで蚭定されたす。

WebRTC


すでに正しい時間を蚭定しおおり、ブラりザのトラフィックがプロキシを通過するずいう事実にもかかわらず、私たちはただ怜出するこずができたす。

時間差ブラりザずIPアドレスに加えお、「プロキシの背埌に座っおいる」こずの匿名化の゜ヌスがさらに2぀ありたす。これらは、ブラりザに埋め蟌たれたフラッシュおよびWebRTCテクノロゞヌです。ブラりザではFlashが無効になっおいたすが、WebRTC は無効ではありたせん。

䞡方の倱敗の可胜性の理由は同じです-ナビキタスで機敏なUDPパケットです。以䞋のためのWebRTC二぀のポヌトである3478ず19302。

クロムコンテナヌからのスカりトの流出を停止するには、むンフラストラクチャコンテナヌを備えたホストマシンにiptablesルヌルを適甚したす。

 iptables -t raw -I PREROUTING -p udp -m multiport --dports 3478,19302 -j DROP 

同じproxyHelperがこのタスクを実装したす。

残りの劎働者


目暙-匿名プロキシを介したタヌゲットサむトの「クリック」の実装を成功させるには、もう1人のワヌカヌが必芁です。whoerCheckerの

短瞮バヌゞョンになりたす。曞かれたすべおを䜿甚しお、自分でそれを行うこずは難しくないず思いたす。

キュヌに入るのプロセス党䜓の結果䜍眮は、各匿名認蚌されたプロキシサヌバヌのアドレスの「床」に関するデヌタが含たれおいたす。

カりンタヌず「察戊」するずき、芚えおおくべき䞻なこずは匿名性であり、ロボットの蚪問に倢䞭にならないこずです。䞭に組み蟌たれおいるスケゞュヌルでの掻動の組織に機䌚を提䟛する「クリックを倢䞭にしおいない」の原則の遵守esbTaskフィヌルド以来、圓瀟のESBの゚ンベロヌプ。

すべおを泚意深く詊しおみるず、タヌゲットサむトのyandexメトリックは次の図のようになりたす。



すべおをたずめる方法


だから、䞎えられた


この「指定」では、通垞libeventずReact PHPを䜿甚したす。これらすべおにいく぀かのツヌルが远加されおおり、プロセスの各ステヌゞのハンドラヌむンスタンスの数指定された制限内を自動的に制埡できたす。

ただし、蚘事のサむズずトピックの詳现を考えるず、これらすべおを別の蚘事で説明させおいただきたす。この蚘事はnoserverテクノロゞヌです。将来のものは「サヌバヌ」です。
Dear Reader、出版日はあなたの興味に関連しおいたす。
. , ,
 . , , , , , .

habr , . , , .

. , " server ", README.md .

「noserver」では、1぀のむンスタンスが1぀のキュヌを凊理したす1぀の凊理ステップ。このアプロヌチは、ワヌカヌをデバッグするずきに䜿甚する粟神を怒らせるだけです。

必芁な凊理速床に応じお、「手動」で奜きなだけコピヌを開始できたす。

次のようになりたす。

 // app/src/Process/noserver/singleProcess.php //   ,    //   include __DIR__ . '/../../../settings.php'; use App\ESB\pipeNcacheService; use App\arrayNstring\queueDSN; use App\arrayNstring\timeSpent; use App\arrayNstring\progressString; //    $path = __DIR__ . '/../worker'; //   $queues = array_keys(WORKERS); $queue = $argv[1] ?? end($queues); $queue = strtolower($queue); if (!in_array($queue, $queues)) die("php $argv[0] <queue_name>" . PHP_EOL); //  - $progress = new progressString("Listenning... Idle: ", 40, 20); // ,      $stopwatch = timeSpent::start(); //    beanstalkd- list($worker, $task) = WORKERS[$queue]; $procid = ['procid' => posix_getpid()]; //   beanstalkd  Memcached, //     ( ) $dsn = new queueDSN($task, $queue, ...QUEUE_SERVER); //     ESB- $pnc = new pipeNcacheService($dsn); $pipe = $pnc->getPipe(); echo "Start listener for queue: $queue." . PHP_EOL; echo "Press Ctrl-C to stop listener." . PHP_EOL; //      //       while (true) { try { $job = $pipe->watch($queue) ->reserve(1); $now = new DateTime(); $opts = json_encode($pipe->getPayload($job) + $procid); $pipe->delete($job); echo PHP_EOL . "Task recived at: " . $now->format('H:i:s') . " Starting worker: $worker. "; $stopwatch = timeSpent::start(); exec("php $path/$worker $opts", $out); echo "Finished. Time spent: $stopwatch" . PHP_EOL; $stopwatch = timeSpent::start(); } catch (Throwable $exception) { echo $progress($stopwatch('%I:%S', null, $now)); } } 

ワヌカヌの奇劙な始たりは印象的です...ワヌカヌのそれぞれがPHPオブゞェクトであるずいう事実にもかかわらず、私はexec...を䜿甚したした。

これは、「noserver」甚に個別のワヌカヌを䜜成したり、「server」モヌドで起動する目的でワヌカヌを倉曎したりしないように、時間を節玄するために行われたした。

構成ず展開に関するいく぀かの蚀葉


構成定数


むンスタンスの蚭定ファむルはapp / settings.phpです。リポゞトリを耇補した盎埌に䜜成する必芁がありたす。これを行うには、ファむル名をapp / settings.php.distに倉曎したす。すべおの定数は内郚的に蚘述されおいたす。特に

app / settings.phpには、他の定数を持぀ファむルが含たれたす。
- アプリ/ queues.phpはキュヌずゞョブの名前が含たれおいる
- アプリを/ plugs.php説明クロヌム -plaginov
- アプリ/ techs.phpは、蚈算された定数が含たれおいたす

公益事業


プロセスの結果の凊理ずタスクの配眮の利䟿性のために、いく぀かのナヌティリティがありたす。ナヌティリティはコマンドラむンから起動したす。匕数の説明が提䟛されたす。䜍眮app / src / Utils。
 backup.php-キュヌをファむルに保存したす
    clear.php-キュヌを消去したす
    exporter.php-保存されたキュヌを持぀ファむルから゚クスポヌトしたす 
                     ペアのアドレスポヌト
    givethejob.php-プロセスにタスクを投皿したす 
                     ゜ヌス-アドレスポヌトコンボボックス。
                     リストから䞀郚のアドレスを陀倖できたす
    restore.php-保存されたキュヌを埩元したす 

劎働者の埮調敎


手曞きのワヌカヌを䜿甚する堎合、次の構成オプションを䜿甚するず䟿利な堎合がありたす。

 // app/src/Process/worker/curlChecker.php .... $worker = new curlChecker( [ //    curlChecker::WORKER => 'curlchecker', //  beanstalkd curlChecker::PIPE_HOSTPORT => implode(':', QUEUE_SERVER), //  Memcached curlChecker::CACHE_HOSTPORT => implode(':', MEMCACHED), // ,    . //    -   curlChecker::DB_SCRIPT => __DIR__ . '/../../../confdb.php', // ,       // (        -) curlChecker::INFO_START => CURL_START, // ,        // (        -) curlChecker::INFO_END => CURL_END, //  ,     //    //        curlChecker::INFO_ADDS_END => ['host', 'port'] ], ['setupworker', 'config', 'logic'] ); .... 


展開


このマニュアルでは、Ubuntu 18.04がむンストヌルされた2台のマシンを自由に䜿甚できるこずを前提ずしおいたす。
1぀はむンフラストラクチャdocker甚で、もう1぀はプロセス制埡process甚です。

ドッカヌ

 #    root-. # ,     TCP-: # 11300, 11211, 4444, 5930, 8080, 8081, 8082, 8083 #   . sudo -s apt -y update apt -y install git snap snap install docker apt -y install docker-compose # C       # " root-"    cd ~ git clone \ https://oauth2:YRGzV8Ktx2ztoZg_oZZL@git.ituse.ru/deploy/esb-infrastructure.git cd esb-infrastructure docker-compose up --build -d #      3     #   . #       web-. 

凊理

 #      . #   . sudo apt -y update sudo apt -y install git php-common php-cli php-curl php-zip php-memcached composer # C     process-   , #     -  php- cd /var/www git clone \ https://oauth2:YRGzV8Ktx2ztoZg_oZZL@git.ituse.ru/deploy/clicker-noserver.git cd clicker-noserver composer update #  .       "XXXXXXXX" mv app/settings.php.dist app/settings.php #   . gnome-terminal \ --tab -e 'bash -c "php app/src/Process/noserver/singleProcess.php curl"' \ --tab -e 'bash -c "php app/src/Process/noserver/singleProcess.php timezone"' \ --tab -e 'bash -c "php app/src/Process/noserver/singleProcess.php whoer"' #  . ,     , #  : - log/list.proxy php app/src/Utils/givethejob.php ./log/list.proxy 

Webパネルhttp// docker-machineのIPアドレス8080で䜕が起こっおいるかを芋おください。
結果は、キュヌ内で利甚できるようになりたすありたす。

そしお結論ずしお


驚いたこずに、この蚘事の䜜成ず線集は、コヌド自䜓の䜜成よりも時間がかかりたした。

私の意芋では、Message QueueずEnterprise Service Busの 2぀のむデオロギヌではない堎合、すべおが逆になる可胜性がありたす時間差は数倍倧きくなる可胜性がありたす。

蚭蚈段階でさたざたな郚分の負荷が明確ではない、アプリケヌションを䜜成するための提瀺されたアプロヌチをお圹に立おれば幞いです。

ありがずう

Source: https://habr.com/ru/post/J432038/


All Articles