Формы

Статус
В этой теме нельзя размещать новые ответы.

untwist

Постоялец
Регистрация
30 Сен 2006
Сообщения
121
Реакции
36
В общем суть такая.
Нужно сделать поднятие анкет.

1) авторизоваться на сайте
2) открывает анкету
3) и со всеми полями и т.п форму отправляет обратно на сервер.

на серваке дата обновляется и анкете поднимается в топ 10

Я в общем то это все сделал
Авторизация (сURL) форма (регулярные + PHP Simple HTML DOM Parser)

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

в общем может у кого есть идеи как пересылать формы по быстрей. Думал покапаться в огороде jQuery form, к примеру во фрейм грузить форму а jquery будет кликать на отправку формы. но желательно сделать это все через крон ((
В общем может у кого есть идеи ?
 
У элемента <form> есть не так много возможных вложенных: select, input (он же textarea, input hidden и input password), file, input checkbox, input radio, input submit (он же input image).

Через DOM Parser вытаскиваешь нужную тебе <form>, потом идешь по всем ее детям и если это что-то из полезного (а не <div> к примеру) - анализируешь и строишь массивчик key=>value.

Потом в этот массивчик дописываешь, что именно ты хочешь сабмитнуть.

Потом собираешь в массивчик в кучу и херачишь курлом. Все.

После того, как у тебя будет готов такой костяк, ты сможешь на основе него очень быстро писать какие угодно сабмитилки, только лишь путем внесения изменений в массивчик.
 
может у тебя есть пример подобного скриптика на php ?
 
PHP:
class Former {
 var $formvars = array();
 var $html;
 var $action,$method;
 var $submitfound = false;

 function form2arr($str,$path='form',$num=0) {
  $this->html = str_get_html($str);
  $e = $this->html->find($path,$num);
  $this->submitfound = false;
  $this->action = $e->action;
  $this->method = isset($e->method) ? $e->method : 'GET';
  $this->formvars = array();
  $this->element2arr($e);
  $this->html->clear();
  return $this->formvars;
 }

 function element2arr($e) {
  if ($e->tag == 'input' && $e->type == 'hidden')   $this->formvars[$e->name] = isset($e->value)?$e->value:'';
  if ($e->tag == 'input' && $e->type == 'password') $this->formvars[$e->name] = isset($e->value)?$e->value:'';
  if ($e->tag == 'input' && $e->type == 'text')     $this->formvars[$e->name] = isset($e->value)?$e->value:'';
  if ($e->tag == 'input' && $e->type == '') 	    $this->formvars[$e->name] = isset($e->value)?$e->value:'';
  if ($e->tag == 'input' && $e->type == 'submit' && !$this->submitfound) {
	$this->formvars[$e->name] = isset($e->value) ? $e->value:'';
	$this->submitfound = true;
  }
  if ($e->tag == 'input' && $e->type == 'image'  && !$this->submitfound) {
	$this->formvars[$e->name] = isset($e->value) ? $e->value:'';
	$this->formvars['x'] = 1;
	$this->formvars['y'] = 1;
	$this->submitfound = true;
  }
  if ($e->tag == 'input' && $e->type == 'checkbox' && stristr($e->outertext,'checked')) $this->formvars[$e->name] = isset($e->value)?$e->value:'';
  if ($e->tag == 'input' && $e->type == 'radio'    && stristr($e->outertext,'checked')) $this->formvars[$e->name] = isset($e->value)?$e->value:'';

  if ($e->tag == 'textarea') $this->formvars[$e->name] = $e->innertext;

  if ($e->tag == 'select') {
    unset($value);
    foreach($e->children as $o) if ($o->tag=='option') {
	if (!isset($value) || stristr($o->outertext,'selected')) 
	    $value=(isset($o->value) ? $o->value : $o->innertext);
    }
    $this->formvars[$e->name] = $value;
  }
  // input file не обрабатываем, т.к. значения по умолчанию там не бывает
  if (is_array($e->children)) foreach($e->children as $o) $this->element2arr($o);
 }
}

$str = '
 <form method=post>
   <input name=login></input>
   <INPUT type=hidden name=id value=1>
   <select name=loc>
	<option value=1>1</option>
	<option selected>haha</option>
   </select>
   <div id=1> <input type=checkbox name=aa value=1 checked> </div></form>
 ';

$former = new Former();
$arr = $former->form2arr($str);
var_dump($arr);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху