From the category archives:

Tools

Управление IE из php

by SeoCoder on Июль 29, 2009

Давно я хотел это вынести в паблик, но что-то не было времени. Сейчас появилось немножко времени.
Что представляет собой скрипт?!

  1. Работает только под виндой, где установлен IE
  2. Это «обертка» для управления браузером, с возможностью, смены прокси, юзерагента, очистки кук и кеша.
  3. Дает полный доступ к DOM страницы. AJAX не преграда. ;)
  4. Подходит для быстрого написания регалок.
  5. Использование форфри как всегда, но от пару баксов на пиво не откажусь – 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;
 
			}
 
		}
	}
 
}

{ 30 comments }

Обновление доргена

by SeoCoder on Апрель 5, 2009

Привет. Вот и вышло очередное обновление доргена.

Добавлено:

  1. Плагин для тега description
  2. Плагин для парсинга текстов – GoogleSnippets
  3. Плагин для парсинга кеев – WordstatYandex

Качаем и радуемся. На днях выложу сырцы тествого плагина и расскажу как их заюзать ;)

{ 8 comments }

Интересное на форуме

by SeoCoder on Декабрь 21, 2008

Подведем небольшие итоги новому проекту.

За 12 дней на форуме зарегистрировались 84 человека, поднято 53 темы и написано 426 сообщений.

Постараюсь раз в месяц приносить интересные обсуждения на блог. Итак имеем.

И много других интересных тем и приятных собеседников.

{ 5 comments }

MultiThread FTP Uploader

by SeoCoder on Декабрь 5, 2008

i002Очередная бесплатная тулза от меня. Это многопоточный аплоадер.
Что может пока и не может аплоадер.

Умеет:

  • Настройка многопоточности от 1 до 20 потоков
  • Управление пассивным режимом
  • Зааплоадить указанную папку на указанный в ftp в несколько потоков

Не умеет:

  • Создавать папки на ftp
  • Делать рекурсивный аплоад папки, то есть всех вложенных файлов и папок.

Скачать MultiThread FTP Uploader from www.seocoder.org

P.S. Кому покажется интересной тулза может порадовать автора: Z260880410831.

P.P.S. Нужна какая то утилита или программа на заказ, пишите через обратную связь.

______________________________________________________

Продажные постовые: билеты москва, сайт о свадьбе, стиль

{ 7 comments }

Генерация читаемого имени или фамилии

by SeoCoder on Ноябрь 27, 2008

Немногим раньше, выкладывал базу англоязычных имен и фамилий, сегодня на замечательном ресурсе phpclasses.org нашел прикольный класс, для генерации читаемого слова. Для чего применимо, думаю опять не стоит рассказывать.

Вот пример что оно генерило:

  • Xyulaxyewo
  • Thexyaquot
  • Sathixyaqu
  • Quethaquaz
  • Chocichova

Стоит упомянуть, что длина слова, настраивается.

Помогите с алгоритмом для русского языка. Буду очень признателен.

{ 9 comments }

Регистрация почты gmail.com – попытка номер 2

by SeoCoder on Ноябрь 20, 2008

Вообщем все оказалось прозаичнее, надо дергать запрос проверки пароля. Это думаю уже отснифите сами. ;)

То есть не нужно ничего кроме того, что описал в первой попытке.

Всем удачи в нелегкой борьбе с гуглом.

{ 19 comments }

Компоненты для работы с http в Delphi

by SeoCoder on Ноябрь 17, 2008

По умолчанию в Delphi идет с не плохими компонентами Indy. На дельфи также можно использовать голые сокеты, пример их использования есть в предыдущем посте. Но сегодня я расскажу о других бесплатных компонентах – ICS.

Самое главное, что в них прельщает это их асинхронность, то есть компонент не "подвешивает" форму, не будучи вынесеным в отдельный поток. Главный минус, не очень удачный хелп, но примеры из стандартной поставки решают эту проблему. Второе, с чем наверняка придется столкнуться всем, компоненты для работы с ssl, если раньше они были платными, теперь они тоже for free. Есть небольшой нюанс при установке именно ssl компонент.

Найдем в распакованном архиве файлик OverbyteIcsDefs.inc и в нем найдем такую строчку:

// {$DEFINE USE_SSL}

Нам необходимо расскоментировать эту опцию и откомпилировать и установить проект. Вот и все. ;)

Удачи в освоении нехитрых технологий программирования.

P. S. Что нас ждет в близжайщих постах: Гугл фильтр чекер, Многопоточный FTP аплоадер, GYMSnippets – настраиваемый парсер снипетов гугла, яху, мсна, а также обзор блогов оставивших заявку. Не стесняемя подписываемся и комментируем.

{ 17 comments }

TOR смена ip программно

by SeoCoder on Ноябрь 16, 2008

Надеюсь все знают как и зачем юзать TOR. Эта штука позволит вам быть анонимным при серфинге. Но думаю не все знают как там менять ip программно.

Способ очень простой, коннектимся к сокету локальному тора, посылаем пару комманд и вуаля. Меньше слов – больше дела и кода.

proecure ChangeIp;
var
  sck:TIdTCPClient;
begin
  sck:=TIdTCPClient.Create(nil);
  try
    sck.Host:='127.0.0.1';
    sck.Port:=10051;
    sck.Connect;
    sck.SendCmd('authenticate','');
    if sck.LastCmdResult.Code='250' then
    begin
      sck.SendCmd('signal newnym',''); // это вот как раз и меняет IP
    end;
  finally
    sck.Free;
  end;
end;

Надеюсь тема не была спалена, так как это уже давно баян. Скорость у тора не ахти, но юзать можно.

{ 9 comments }

Гугл фильтруй базар

by SeoCoder on Ноябрь 10, 2008

Решил написать фришную тулзу – по определению фильтра над фрихостом. Алгоритм пока простой.

Ищем в гугле по site:url (выставляя английский язык) 50 результатов. Берем тайтлы этих 50 результатов и ищем их в гугле при полном совпадении, то есть в кавычках. Наш фришник должен быть в 50 результатах.

Далее, смотрим при котором количестве результатов он был в топ50, при котором нет. Грань тут выставить сложно, поэтому просто выводим результататы. Утилита почти готова, только уж очень простые критерии. Подкиньте на ваш взгляд несложные методы, чтобы определить, не под фильтром ли фришник, и на этой неделе ждите релиз утилиты. :)

Перешел сегодня на Delphi2009, так как устал бороться с UTF. Работает на мой взгляд быстрее чем Delphi 2007.

Теперь об интересном. О блогах, что прислали заявки. Их чего то не так много, как хотелось, поэтому расскажу обо всех тех двух, что не постеснялись. ;)

Первый прекрасный блог от не менее прекрасной половины человечества – девушке кодере или кодерше. Пишет на Delphi, юзает Firebird, специализируется на парсинге всего чего ей придет на ум. Последние посты об автоматизации постинга в WordPress. Конечно может я мало чего понимаю, но есть же xmlrpc и все станет гораздо проще, но ради практики это стоит пробовать. Честно скажу, что подписался.

Второй блог – как я понял белого сеошника, поставившего себе планку – выйти на результат в пассивный доход 60 косарей всего за 60 дней. Прям как путешествие «вокруг света за 80 дней». Цифра в 60 тыщ и не большая и не маленькая, бум следить за развитием событий, надеюсь автор и тут будет изредка делиться своими успехами и секретами, которые не жалко отдать в паблик.

За сим на сегодня все – 5 утра, мне не фига не спицца, переставил винду, «подрочил» на статсы,  и сижу рисую, как теперь выводить на фришниках. Вообщем оставляйте заявки на обзор ваших блогов, только не в комментах, а через обратную связь. Удачи, и не болеть.

{ 22 comments }

Универсальная регалка акков

by SeoCoder on Октябрь 13, 2008

Устал я каждый раз писать под себя многопоточные регалки и задумался об универсальной. Изложу видение (очень образное) сего продукта.

Как мы все понимаем – всегда во всех регалках имеются одни и теже действия, но все равно лениво как то копировать куски кода и заниматься отладкой его. Так вот что я предлагаю. Каждый сервис просто имеет свой конфигурационный файл с описанием действий, чего надо сделать. Лучшего чем xml для этого я не придумал. XML — это способ записи данных с помощью тегов, атрибутов и других простых конструкций. А в обобщённом смысле — это семейство технологий для обработки структурированных данных.
Вот как к примеру может выглядеть какой-то обобщённый конфиг:

[cc lang="xml"]
get

get
http://www.tester.com/
enabled [/cc]

Идея думаю из конфига ясна. Кто то реализовал такое?! Есть какие то подводные камни?!

{ 11 comments }

Get Adobe Flash playerPlugin by wpburn.com wordpress themes