[РЕШЕНО] curl upload image Доброго времени суток, необходима помощь, уже не знаю что поделать, пытаюсь выполнить свой скрипт, все проходит на ура, за исключением, не загружаются изображения как только не пытался, выкладываю часть кода. Использую библиотеку курл PHP: <?php error_reporting(0); set_time_limit(0); include('../curl/func.php'); include('./pop3/pop3_func.php'); $date = array(); $date['login[email]']='мыло'; $date['login[password]']='пасс'; get_url('http://slando.ru/login/?region=32&subregion=56&ref%5B0%5D%5Bregion%5D=32&ref%5B0%5D%5Bsubregion%5D=56&ref%5B0%5D%5Bseek_type%5D=offer&ref%5B0%5D%5Baction%5D=user&ref%5B0%5D%5Bmethod%5D=index', '', '', $date, basedir().'cookie.txt',basedir().'cookie.txt'); unset($date); $captcha = get_url('http://slando.spb.ru/sankt-peterburg/captcha//', '', '', '', basedir().'cookie.txt',basedir().'cookie.txt'); file_put_contents("cap.jpg", $captcha); $captcha = file("cap.jpg"); for ($i=0;$i<9;$i++) { unset($captcha[$i]); } $cap = implode("",$captcha); file_put_contents("cap.jpg", $cap); $text=recognize("cap.jpg","клучь капчи",false, "antigate.com"); $data['data[category_id]']= '329'; $data['data[offer_seek]']= 'offer'; $data['data[region_id]']= '32'; $data['data[subregion_id]']= '56'; $data['data[address]']= 'Адмиралтейская'; $data['data[param_price]']= '500'; $data['data[title]']= 'Заголовок'; $data['data[description]']= 'Текст объявления '; $data['data[param_currency]']= 'RUB'; $data['data[param_rent_from]']= date('d-m-Y'); $data['data[param_total_rooms_in_flat]']= '4'; $data['data[video]']= ''; $data['data[email]']= ''; $data['data[contact_method]']= 'phone'; $data['data[phone]']= ''; $data['data[newsletter]']= 'on'; $data['image[\'1\']']= "file"; $data['image[\'1\']']= '@'.basedir().'1.jpg'; $data["image['2']"]= 'file'; $data["image['2']"]= '@'.basedir().'2.jpg;type=image'; $data["image['3']"]= 'file'; $data["image['3']"]= '@'.basedir().'3.jpg;type=application/octet-stream'; $data['data[captcha]']= $text; $data['save']= 'true'; $data['submit']= 'Опубликовать'; print $page = get_url('http://slando.spb.ru/sankt-peterburg/adding/body/?category_id=329&os=offer', '', '', $data, basedir().'cookie.txt',basedir().'cookie.txt'); //Дальше идет работа с pop3 unlink(basedir()."cookie.txt"); ?> curl.php PHP: <?php function get_url($url, $ref = '', $header = '', $post = '', $cookie = '', $cookiefile = '', $proxy = '', $timeout = '', $popitok = 10) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if ($ref != '') curl_setopt($ch, CURLOPT_REFERER, $ref); if ($header != '') curl_setopt($ch, CURLOPT_HEADER, $array); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); if ($post != '') { curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/10.00 (Windows NT 5.1; U; ru) Presto/2.1.1'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } if ($cookie != '') curl_setopt($ch, CURLOPT_COOKIE, $cookie); if ($cookiefile != '') { curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); } if ($proxy != '') curl_setopt($ch, CURLOPT_PROXY, $proxy); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/11.0 (Windows NT 5.1; U; ru) Presto/2.1.1'); curl_setopt($ch, CURLOPT_ENCODING, "gzip"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($timeout != '') curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $i = 0; do { $i++; flush(); $content = curl_exec($ch); } while ($i < $popitok && $content == '' || curl_errno($ch) != 0 && $i < $popitok); if (curl_errno($ch) != 0 || $content == '') { echo "<br><div style=\"border-style:solid; border-width:1px; width:750px; padding:10px; position:relative; border-color:#FF8000;\"><b><font color=\"#B30000\">Error CURL:</font></b> ".curl_error($ch)." | <b><font color=\"#B30000\">Error number:</font></b> ".curl_errno($ch)."<br> <b>Url: <a href='".$url."'> ".$url."</a></b></div><br><br>"; curl_close($ch); return false; } else { curl_close($ch); return $content; } } function basedir() { $document_root = $_SERVER['SCRIPT_FILENAME']; return mb_ereg_replace("[\w\d_-]{1,}.php", "", $document_root); } function recognize( $filename, $apikey, $is_verbose = true, $sendhost = "antigate.com", $rtimeout = 5, $mtimeout = 120, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0, $is_russian = 0) { if (!file_exists($filename)) { if ($is_verbose) echo "file $filename not found\n"; return false; } $fp=fopen($filename,"r"); if ($fp!=false) { $body=""; while (!feof($fp)) $body.=fgets($fp,1024); fclose($fp); $ext=strtolower(substr($filename,strpos($filename,".")+1)); } else { if ($is_verbose) echo "could not read file $filename\n"; return false; } if ($ext=="jpg") $conttype="image/pjpeg"; if ($ext=="gif") $conttype="image/gif"; if ($ext=="png") $conttype="image/png"; $boundary="---------FGf4Fh3fdjGQ148fdh"; $content="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"method\"\r\n"; $content.="\r\n"; $content.="post\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"key\"\r\n"; $content.="\r\n"; $content.="$apikey\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"phrase\"\r\n"; $content.="\r\n"; $content.="$is_phrase\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"regsense\"\r\n"; $content.="\r\n"; $content.="$is_regsense\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"numeric\"\r\n"; $content.="\r\n"; $content.="$is_numeric\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"min_len\"\r\n"; $content.="\r\n"; $content.="$min_len\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"max_len\"\r\n"; $content.="\r\n"; $content.="$max_len\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"file\"; filename=\"capcha.$ext\"\r\n"; $content.="Content-Type: $conttype\r\n"; $content.="\r\n"; $content.=$body."\r\n"; //???? ????? $content.="--$boundary--"; $poststr="POST http://$sendhost/in.php HTTP/1.0\r\n"; $poststr.="Content-Type: multipart/form-data; boundary=$boundary\r\n"; $poststr.="Host: $sendhost\r\n"; $poststr.="Content-Length: ".strlen($content)."\r\n\r\n"; $poststr.=$content; // echo $poststr; if ($is_verbose) echo "connecting $sendhost..."; $fp=fsockopen($sendhost,80,$errno,$errstr,30); if ($fp!=false) { if ($is_verbose) echo "OK\n"; if ($is_verbose) echo "sending request ".strlen($poststr)." bytes..."; fputs($fp,$poststr); if ($is_verbose) echo "OK\n"; if ($is_verbose) echo "getting response..."; $resp=""; while (!feof($fp)) $resp.=fgets($fp,1024); fclose($fp); $result=substr($resp,strpos($resp,"\r\n\r\n")+4); if ($is_verbose) echo "OK\n"; } else { if ($is_verbose) echo "could not connect to anti-captcha\n"; if ($is_verbose) echo "socket error: $errno ( $errstr )\n"; return false; } if (strpos($result, "ERROR")!==false or strpos($result, "<HTML>")!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } else { $ex = explode("|", $result); $captcha_id = $ex[1]; if ($is_verbose) echo "captcha sent, got captcha ID $captcha_id\n"; $waittime = 0; if ($is_verbose) echo "waiting for $rtimeout seconds\n"; sleep($rtimeout); while(true) { $result = file_get_contents('http://antigate.com/res.php?key='.$apikey.'&action=get&id='.$captcha_id); if (strpos($result, 'ERROR')!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } if ($result=="CAPCHA_NOT_READY") { if ($is_verbose) echo "captcha is not ready yet\n"; $waittime += $rtimeout; if ($waittime>$mtimeout) { if ($is_verbose) echo "timelimit ($mtimeout) hit\n"; break; } if ($is_verbose) echo "waiting for $rtimeout seconds\n"; sleep($rtimeout); } else { $ex = explode('|', $result); if (trim($ex[0])=='OK') return trim($ex[1]); } } return false; } } ?>
Все такое $data["image['1']"] Заменить на $data["image"]['1']. Плюс посмотреть вывод var_dump($data); Плюс посмотреть через wireshark что вообще отсылается. Дополнительно - если вы не заинтересованы в ответе через форум (оставляя осеку вместо этого) - рекомендую воздержаться от написания вообще.
Вот и я не могу разобраться в чем причина, может все таки у кого получится решить проблему за небольшое вознаграждение?
Так, ну убери кавычку а файл лучше загружать как: PHP: $data["image[2]"]= '@'.dirname(__FILE__).'/img.jpg' без всяких file Все русские буквы прогнать iconv, с учетом нужной кодировки(utf-8). base_dir конечно классно написана, ничего не скажешь
Спасибо за новый для меня метод, пхп изучал не по книге а методом тыка =) Вариант так и не проходит, почему то не прогружает и все, на других сайтах таких проблем нет, эменно эт аплащадка не слушается, попробовать все переписать на сокетах и передовать точную копию заголовков. но это все с нуля придется делать... =(((
PHP: function get_url($url, $ref = '', $header = '', $post = '', $cookie = '', $cookiefile = '', $proxy = '', $timeout = '', $popitok = 10) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Opera/10.00 (Windows NT 5.1; U; ru) Presto/2.1.1'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); if ($ref) curl_setopt($ch, CURLOPT_REFERER, $ref); if ($header) curl_setopt($ch, CURLOPT_HEADER, true); if ($post) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } if ($cookie) curl_setopt($ch, CURLOPT_COOKIE, $cookie); if ($cookiefile) { curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); } if ($proxy) curl_setopt($ch, CURLOPT_PROXY, $proxy); if ($timeout) curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $i = 0; do { $i++; flush(); $content = curl_exec($ch); } while ($i < $popitok && $content == '' || curl_errno($ch) != 0 && $i < $popitok); if (curl_errno($ch) != 0 || $content == '') { echo "<br><div style=\"border-style:solid; border-width:1px; width:750px; padding:10px; position:relative; border-color:#FF8000;\"><b><font color=\"#B30000\">Error CURL:</font></b> " . curl_error($ch) . " | <b><font color=\"#B30000\">Error number:</font></b> " . curl_errno($ch) . "<br> <b>Url: <a href='" . $url . "'> " . $url . "</a></b></div><br><br>"; curl_close($ch); return false; } else { curl_close($ch); return $content; } } Почистил твою функцию от мусора, может быть дело в нем. Попробуй ее. И покажи ответ от сервера в виде заголовков, вообще полный ответ.
ответ заголовка от сервера через curl: Code: HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Wed, 28 Mar 2012 23:06:54 GMT Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Vary: Accept-Encoding X-Cnection: close Transfer-Encoding: chunked Content-Type: text/html снифер мозилы http live header: Code: http://www.slando.ru/adding/body/?category_id=329&os=offer POST /adding/body/?category_id=329&os=offer HTTP/1.1 Host: www.slando.ru User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Referer: http://www.slando.ru/adding/body/?category_id=329&os=offer Cookie: __utma=1.153408566.1331562425.1332884650.1332976082.4; __utmz=1.1331562425.1.1.utmcsr=slando.spb.ru|utmccn=(referral)|utmcmd=referral|utmcct=/sankt-peterburg/; PHPSESSID=vej4manucq3k5h5vm4iot31nu2; disablegeo=1; __utmb=1.4.9.1332976082; __utmc=1; SESSID=vej4manucq3k5h5vm4iot31nu2; SESSID=vej4manucq3k5h5vm4iot31nu2 Content-Type: multipart/form-data; boundary=---------------------------41184676334 Content-Length: 2076276 -----------------------------41184676334 Content-Disposition: form-data; name="data[region_id]" 32 -----------------------------41184676334 Content-Disposition: form-data; name="data[subregion_id]" 56 -----------------------------41184676334 Content-Disposition: form-data; name="data[address]" 11111 -----------------------------41184676334 Content-Disposition: form-data; name="data[param_price]" 11111 -----------------------------41184676334 Content-Disposition: form-data; name="data[title]" 1111111111111111111111111111 -----------------------------41184676334 Content-Disposition: form-data; name="data[description]" ssssssssssssssssssssssssssssssssssssssssssss -----------------------------41184676334 Content-Disposition: form-data; name="data[param_currency]" RUB -----------------------------41184676334 Content-Disposition: form-data; name="data[param_rent_from]" 29-03-2012 -----------------------------41184676334 Content-Disposition: form-data; name="data[param_total_rooms_in_flat]" 1 -----------------------------41184676334 Content-Disposition: form-data; name="image[1]" file -----------------------------41184676334 Content-Disposition: form-data; name="image[1]"; filename="a5.jpg" Content-Type: image/jpeg yOya HTTP/1.1 200 OK Date: Wed, 28 Mar 2012 23:08:51 GMT Set-Cookie: PHPSESSID=vej4manucq3k5h5vm4iot31nu2; path=/; domain=.slando.ru Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 7780 X-Cnection: close Content-Type: text/html Смотрел куки пхп сессия не меняется, т.е. объявлени размещается без проблемм, смотрел функции нашел только функции валидации со стороны клиенты на введеные поля Я знаю, что решение в любом случаи есть, вот и не отступаю. Так же экспериментирование без регистрации возможно на сайте так же я думаю все дело в том, что работает какой то js который уже аплодит, но пересмотрев функции никаких query аплодов не обнаружил, в общем так же хочу допить и выяснить в чем же проблемам, не хочется в дальнейшем с подобной проблемой встречатся. Code: Content-Disposition: form-data; name="image[1]" file
У меня подозрения, что неправильно отсылаешь каптчу/заполняешь все поля такие как e-mail. К сожалению у меня нет времени, чтобы зарегистрировать аккаунт. Следует обратить внимание на то, где присваивается новая сессия, где она обновляется и т.д. Скорее всего дело в ней.
Скорее всего так и есть, но победить всеравно не удается, регнул акк. логин и пароль как для сайта так и для pop3
Проблема оказалась вот в чем: PHP: $data['data[email]']= '[email protected]'; //email обязателен Картинки в таком виде: PHP: $data['image[1]']= '@'.basedir().'capt.jpg'; А image[2], image[3], если их нет, то можно вообще не отсылать. Все строки на русском в: PHP: $text = iconv('cp-1251', 'utf,8', 'текст'); И вот этот бред лучше стереть: PHP: $captcha = file("cap.jpg"); for ($i=0;$i<9;$i++) { unset($captcha[$i]); } $cap = implode("",$captcha); file_put_contents("cap.jpg", $cap); я так и не понял что он делает
сделал этот вариант сейчас проверю у меня сам скрипт конвертирован весь в utf проходит норм а тут я не использую file_get_contents т.к. передаю ссесию в кукисах и получаю правильную строку, а так как курл функция написана с отображением заголовков то капча хавается с заголовками а мне влом было переписывать вот я сохраняю капчу в файл с заголовками потом ее в массив удаляю 9 строчек т.к. в них находятся заголовки а дальше сама капча, после чего получаю нормальную капчу и отправляю ее на интигейт, в итоге получаю что объявление размещено. сейчас попробую с фотами залить, и тут допишу текст
Протестировал, ничего не помогает, хоть убей не грузятся фотки, вот результат работы скрипта Uploaded with ImageShack.us
спасибо, тема закрыта, высший услышал меня сверху, и сландо обновили движок, теперь и фотографии грузятся нормуль через их новую аяковский аплодер, и капчей нет, все стало супер.