Привет! Понадобился скрипт для наполнения сайтов на двиге DLE. В одну ночь раскурил cUrl и сделал авторизацию с записью кукисов. А дальше тупик, дело в том что curl-ом я авторизуюсь, и следом пытаюсь открыть сокет для передачи данных в /addnews.html но ничего не выходит(скрипт показывает страницу где я залогинился, а ниже страницу на которой не аторизирован, открытую сокетом для отправки в форму данных ). Подскажите чем грабить форму и как сделать чтоб это всё происходило на странице на которой curl нас залогинит (с открытой сессией). И каким способом лучше передать данные в addnews.htlm? Мой скрипт: PHP: $url = 'http://dle.hi/addnews.html'; $login = 'admin'; $pass = 'admin'; $title = 'dflskd;jfs;dlkjf;sdjf;s'; $story = 'ldf;lgjd;fljgd;fklgjd;fklgjd;fjg;dfjg'; $full = 'as;lkdja;lsdjka;lsjd;alsjd'; $ch = curl_init(trim($url)); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.4) Gecko/2008102920 AdCentriaIM/1.7 Firefox/3.0.4'); curl_setopt($ch, CURLOPT_REFERER, trim($url)); curl_setopt($ch, CURLOPT_POSTFIELDS, 'login=submit&login_name='.trim($login).'&login_password='.trim($pass)); curl_setopt($ch, CURLOPT_POSTFIELDS, 'login=submit&login_name='.trim($login).'&login_password='.trim($pass)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $cookiefile = tempnam('cookie/1', 'cookie_'); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); $res = curl_exec($ch); curl_close($ch); echo $res; ###############################################################################################3 //открываем сокет к http://www.example.loc на 80-й порт с таймаутом в 30 секунд $socket = fsockopen('www.dle.hi', 80, $errno, $errstr, 30); //если fsockopen вернула false, то завершаем работу скрипта и выводим текст и номер ошибки if(!$socket)die("$errstr($errno)"); //собираем данные $data = "title=".urlencode("John")."&short_story=".urlencode("Smith"); //пишем в сокет метод, URI и протокол fwrite($socket, "POST /addnews.html HTTP/1.1\r\n"); //а также имя хоста fwrite($socket, "Host: www.dle.hi\r\n"); //теперь отправляем заголовки //Content-type должен быть applicaion/x-www-form-urlencoded fwrite($socket,"Content-type: application/x-www-form-urlencoded\r\n"); //размер передаваемых данных передаем в заголовке Content-length fwrite($socket,"Content-length:".strlen($data)."\r\n"); //типы принимаемых данных. */* означает, что принимаем все типы данных fwrite($socket,"Accept:*/*\r\n"); //представимся оперой fwrite($socket,"User-agent:Opera 10.00\r\n"); fwrite($socket,"\r\n"); //теперь передаем данные fwrite($socket,"$data\r\n"); fwrite($socket,"\r\n"); //теперь читаем и выводим ответ $answer = ''; while(!feof($socket)){ $answer.= fgets($socket, 4096); } echo $answer; //закрываем сокет fclose($socket); Удалось словить заголовок POST запроса: PHP: POST /addnews.html title=Заголовок&alt_name=Альт.имя&catlist%5B%5D(категории)=2&bbfont=0&bbsize=0&short_story=краткая новость&full_story=большая новость&tags=&allow_comm=1&allow_main=1&approve=1&allow_rating=1&add=%EE%F2%EF%F0%E0%E2%E8%F2%FC&mod=addnews&enkbsjhk=de1fd1fa36b276fc8425fbc0d3c0fb8b Код формы в которую нужно передать данные те. /addnews.html: PHP: <form method=post name="entryform" id="entryform" onsubmit="if(document.entryform.title.value == '' || document.entryform.short_story.value == ''){alert('У вашей статьи должен быть хотя бы заголовок и краткая версия');return false}" action=""> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="20" align="left" valign="top"><img src="/templates/Default/images/dlet_abl01.gif" width="20" height="30" alt="" /></td> <td align="left" valign="top" class="abl02"><table width="100%" border="0" cellpadding="0" cellspacing="0" class="abl121"> <tr> <td width="40" height="30"><img src="/templates/Default/images/spacer.gif" width="40" height="1" alt="" /></td> <td align="left" class="ntitle">Публикация новости на сайте</td> </tr> </table></td> <td width="20" align="right" valign="top"><img src="/templates/Default/images/dlet_abl13.gif" width="20" height="30" alt="" /></td> </tr> <tr> <td width="20" align="left" valign="top"><img src="/templates/Default/images/dlet_abl51.gif" width="20" height="30" alt="" /></td> <td align="left" valign="top" class="abl22"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="30" class="abl221"> </td> </tr> </table></td> <td width="20" align="right" valign="top"><img src="/templates/Default/images/dlet_abl53.gif" width="20" height="30" alt="" /></td> </tr> <tr> <td width="20" align="left" valign="top" class="abl31"><img src="/templates/Default/images/spacer.gif" width="20" height="1" alt="" /></td> <td align="left" valign="top" class="stext"> <table width="99%" border="0" cellpadding="0" cellspacing="0"> <tr> <td width="110" height="25" nowrap="nowrap">Введите заголовок:</td> <td><input type="text" name="title" value="" maxlength="150" class="f_input" /></td> </tr> <tr> <td height="25" nowrap="nowrap">URL статьи:</td> <td><input type="text" name="alt_name" value="" maxlength="150" class="f_input" /></td> </tr> <tr> <td height="25">Категория:</td> <td style="padding-bottom:5px;"><select name="catlist[]" id="category" onchange="onCategoryChange(this.value)" style="width:316px;height:73px;" multiple><option value="0"></option><option style="color: black" value="1" >Информация</option><option style="color: black" value="2" >xxx</option></select></td> </tr> <tr> <td>Краткое содержание:</td> <td style="padding-bottom:5px;"><textarea name="short_story" id="short_story" onclick=setFieldName(this.name) style="width:98%; height:160px" class="f_textarea" /></textarea></td> </tr> <tr> <td>Полная новость:<br />(необязательно)</td> <td><textarea name="full_story" id="full_story" onclick=setFieldName(this.name) style="width:98%; height:200px" class="f_textarea" /></textarea></td> </tr> <tr> <td height="25" nowrap="nowrap">Ключевые слова<br />для облака тегов:</td> <td><input type="text" name="tags" value="" maxlength="150" class="f_input" /></td> </tr> <script type="text/javascript"> <!-- var item = null; if (document.getElementById) { item = document.getElementById("category"); } else if (document.all) { item = document.all["category"]; } else if (document.layers) { item = document.layers["category"]; } if (item) { onCategoryChange(item.value); } // --> </script> <tr> <td width="110"> </td> <td><input type="checkbox" name="allow_comm" id="allow_comm" value="1" checked="checked" /><label for="allow_comm">Разрешить комментарии</label> <input type="checkbox" name="allow_main" id="allow_main" value="1" checked="checked" /><label for="allow_main">Публиковать на главной</label><br /><input type="checkbox" name="approve" id="approve" value="1" checked="checked" /><label for="approve"> Опубликовать новость на сайте</label><br /><input type="checkbox" name="allow_rating" id="allow_rating" value="1" checked="checked" /><label for="allow_rating"> Разрешить рейтинг статьи</label><br /><input type="checkbox" name="news_fixed" id="news_fixed" value="1" /><label for="news_fixed"> Зафиксировать новость</label></td> </tr> <tr> <td width="110"> </td> <td><input class="bbcodes_poll" type="submit" name="add" value="отправить" /> <input class="bbcodes_poll" type="button" name="nview" onclick="preview()" value="просмотр" /></td> </tr> </table> Жду ответа!
Ты после авторизации курлом не отправляешь куки через сокет. А HTTP запрос через сокет можешь осуществить моей функцией https://forum.antichat.ru/showthread.php?t=200568
Проблема ещё в том что нужно выбирать категорию (как это реализовать понятия не имею), думал может как-то удастся сграбить форму для последующего заполнения.
Смотришь сюда: PHP: <select name="catlist[]" id="category" onchange="onCategoryChange(this.value)" style="width:316px;height:73px;" multiple> <option value="0"></option> <option style="color: black" value="1" >Информация</option> <option style="color: black" value="2" >xxx</option> </select> для POST: берёшь name от select и присваиваешь ему value от нужных категорий Например, если выбрать первую и последнюю категории, то в пост пойдёт: catlist[]=0&catlist[]=2 или в кодированном виде: catlist%5B%5D=0&catlist%5B%5D=2 Проблема в том, чтобы изьять эти name и value чтоли?
с одним сайтом да, проблем не будет... но если сайтов 20, здесь думаю нужно будет сравнение по категориям. Ну а я как новичок не скоро в этом разберусь. А пока курю передачу cookies сокетами.
чё там курить, всё просто: "Cookie: cook1=value; cook2=123; cook3=""; PHPSESSID=sdfasnldcfhdausvgfasl\r\n" ко всем значениям применить urlencode()
! Подскажите можно ли как-нить сохранить, или напрямую отобразить картинку со страници, только это не обычная картинка а код(на сайте, защита от ботов, captcha). Путь картинки ничего собой не представляет и просто так не открыть, оно только грузится в браузере когда заходиш на страницу, так вот я и думаю, можна ли как-то сохранить эту картинку???? http://site.com/engine/modules/antibot.php?rndval=какие-то цифры