Давно я хотел это вынести в паблик, но что-то не было времени. Сейчас появилось немножко времени.
Что представляет собой скрипт?!
- Работает только под виндой, где установлен IE
- Это «обертка» для управления браузером, с возможностью, смены прокси, юзерагента, очистки кук и кеша.
- Дает полный доступ к DOM страницы. AJAX не преграда.
- Подходит для быстрого написания регалок.
- Использование форфри как всегда, но от пару баксов на пиво не откажусь – Z260880410831.
Первым у нас идет базовый класс самого браузера с примером использования.
<?php define('READYSTATE_COMPLETE', 4); class IEEvents { public $dom = null; function DocumentComplete($dom, $url) { $this->dom = $dom; } } class browser { public $document; public $ie = null; private $useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6'; private $sink; function __construct() { $this->__initie(); $this->dom = new dom(); } function __destruct() { } function __initie($left = 0, $top = 0, $width = 800, $height = 700, $visible = 1) { $this->ie = new COM("InternetExplorer.Application", null, CP_UTF8); $this->sink = new IEEvents; com_event_sink($this->ie, $this->sink, 'DWebBrowserEvents2'); $this->ie->left = $left; $this->ie->top = $top; $this->ie->width = $width; $this->ie->height = $height; $this->ie->menubar = 0; $this->ie->toolbar = 0; $this->ie->statusbar = 0; $this->ie->visible = $visible; $this->ie->silent = true; } function navigate($url, $post = null) { $this->ie->navigate($url, null, $post, null, "User-Agent: " . $this->useragent . "\r\n"); $this->wait(); } function wait($sec = 0) { $this->sink->dom = null; while (!$this->sink->dom) { com_message_pump(4000); } while ($this->ie->Busy); while ($this->ie->ReadyState != READYSTATE_COMPLETE); sleep($sec); $this->document = $this->ie->document; $this->dom->setdocument( $this->document ); } function innertext() { return $this->ie->Document->body->innerTEXT; } function clearcache() { $oFileSys = new COM("Scripting.FileSystemObject"); $objShell = new COM("Shell.Application"); $objFolder = $objShell->Namespace(32); $oFileSys->DeleteFile($objFolder->Self->Path . '\*.*'); $sPath = $oFileSys->GetFolder($objFolder->Self->path) . "\\Content.IE5\\"; $oFolder = $oFileSys->GetFolder($sPath); $oFolders = $oFolder->SubFolders; foreach ($oFolders as $item) { $oFileSys->DeleteFolder($item); } unset($oFileSys); unset($objShell); } function clearcookies() { $objShell = new COM("Shell.Application"); $objFSO = new COM("Scripting.FileSystemObject"); $objFolder = $objShell->Namespace(33); $objFolderItem = $objFolder->Self; $strPath = $objFolderItem->Path; $oFolder = $objFSO->GetFolder($strPath); $oFiles = $oFolder->Files; if (count($oFiles) > 2) $objFSO->DeleteFile($strPath . '\*.txt'); unset($objFSO); unset($objShell); } } if (!defined('ROOT')) define('ROOT', dirname(__file__) . '/'); function __autoload($class_name) { require_once ROOT.$class_name . '.class.php'; } $yaru = new browser(); $yaru->navigate('http://ya.ru'); echo $yaru->innertext();
ну и чтобы это у вас заработало класс dom
<?php class dom { public $anchors; public $input; public $textarea; public $radiobutton; public $images; public $debug; private $document = null; function __construct() { $this->anchors = new anchors(); $this->input = new input(); $this->select = new select(); $this->textarea = new textarea(); $this->radiobutton = new radiobutton(); $this->images = new images(); $this->debug = new debug(); } function __destruct() { unset($this->anchors); unset($this->input); unset($this->select); unset($this->textarea); unset($this->radiobutton); unset($this->images); unset($this->debug); } function setdocument($document) { $class_vars = get_class_vars(get_class($this)); foreach ($class_vars as $name => $value) { $this->{$name}->document = $document; } } }
Ну и напоследок замечательный класс для дебага, который мне сразу генерил код для регалки
<?php class debug { public $document; function analyze($class) { $elements = $this->document->body->all; for ($i = 0; $i <= $elements->length; $i++) { $tag = $elements->item($i)->tagName; switch ($tag) { case 'INPUT': case 'SELECT': $type = $elements{$i}->getAttribute("type"); $name = $elements{$i}->getAttribute("name"); $classname = $elements{$i}->getAttribute("classname"); $value = $elements{$i}->value; $id = $elements{$i}->getAttribute("id"); if (($type == 'checkbox') or ($type == 'password') or ($type == 'text') or ($type == 'submit') or ($type == 'select-one')) { $div = $this->document->createElement('div'); $data = " type: $type"; if ($id != null) $data .= " id: $id"; if ($name != null) $data .= " name: $name"; if ($classname != null) $data .= " classname: $classname"; if ($value != null) $data .= " value: $value"; $div->innerHTML = $data; $div->style->backgroundColor = 'yellow'; $elements{$i}->parentNode->appendChild($div); switch ($type) { case 'text': case 'password': case 'submit': case 'textarea': if ($id != null) { echo '$'.$class.'->dom->input->set_by_id(\''.$id.'\', \'\', false);'.'<br>'; } elseif ($name!= null) { echo '$'.$class.'->dom->input->set_by_name(\''.$name.'\', \'\', false);'.'<br>'; } elseif ($classname!= null) { echo '$'.$class.'->dom->input->set_by_classname(\''.$classname.'\', \'\', false);'.'<br>'; } break; case 'checkbox' : if ($id != null) { echo '$'.$class.'->dom->input->set_by_id(\''.$id.'\', \'true\', false);'.'<br>'; } elseif ($name!= null) { echo '$'.$class.'->dom->input->set_by_name(\''.$name.'\', \'true\', false);'.'<br>'; } elseif ($classname!= null) { echo '$'.$class.'->dom->input->set_by_classname(\''.$classname.'\', \'true\', false);'.'<br>'; } break; case 'select-one' : if ($id != null) { echo '$'.$class.'->dom->input->set_by_id(\''.$id.'\', \'\', false);'.'<br>'; } elseif ($name!= null) { echo '$'.$class.'->dom->input->set_by_name(\''.$name.'\', \'\', false);'.'<br>'; } elseif ($classname!= null) { echo '$'.$class.'->dom->input->set_by_classname(\''.$classname.'\', \'\', false);'.'<br>'; } break; } } break; case 'IMG' : $type = $elements{$i}->getAttribute("type"); $name = $elements{$i}->getAttribute("name"); $classname = $elements{$i}->getAttribute("classname"); $width = $elements{$i}->getAttribute("width"); $height = $elements{$i}->getAttribute("height"); $id = $elements{$i}->getAttribute("id"); $src = $elements{$i}->getAttribute("src"); $div = $this->document->createElement('div'); $data = ''; if ($src != null) $data .= " src: $src"; if ($id != null) { $data .= " id: $id"; echo '$'.$class.'->dom->images->save_by_id(\''.$id.'\', \'\', false);'.'<br>'; } if ($name != null) $data .= " name: $name"; if ($classname != null) $data .= " classname: $classname"; if ($width != null) $data .= " w: $width"; if ($height != null) $data .= " h: $height"; $div->innerHTML = $data; $div->style->backgroundColor = 'yellow'; $elements{$i}->parentNode->appendChild($div); break; } } } }
