Нужна помощь, постинг сообщений PHP, cURL, SMF

Discussion in 'PHP' started by armotium, 21 Nov 2011.

  1. armotium

    armotium New Member

    Joined:
    20 Nov 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Пишу постер в форумы, на одном из форумов(движек SMF, simplemachines.org), столкнулся с проблемой:
    При сабмите сообщения получаю вот такую вот ошибку:
    'Your session timedout while posting. Please try to resubmit your message'

    Пост данные передаю все что соснифал:
    Code:
    -----------------------------#boundary#
    Content-Disposition: form-data; name="topic"
    
    0
    -----------------------------#boundary#
    Content-Disposition: form-data; name="subject"
    
    #title#
    -----------------------------#boundary#
    Content-Disposition: form-data; name="icon"
    
    thumbup
    -----------------------------#boundary#
    Content-Disposition: form-data; name="message"
    
    #body#
    -----------------------------#boundary#
    Content-Disposition: form-data; name="notify"
    
    0
    -----------------------------#boundary#
    Content-Disposition: form-data; name="lock"
    
    0
    -----------------------------#boundary#
    Content-Disposition: form-data; name="goback"
    
    1
    -----------------------------#boundary#
    Content-Disposition: form-data; name="post"
    
    Post
    -----------------------------#boundary#
    Content-Disposition: form-data; name="additional_options"
    
    0
    ----------------------------#boundary#
    Content-Disposition: form-data; name="sc"
    
    #token#
    -----------------------------#boundary#
    Content-Disposition: form-data; name="seqnum"
    
    #loggedinuser#
    -----------------------------#boundary#--
    
    Проверял все передается и подставляется как надо, куки юзаются старые, с ними не должно быть проблем, иначе на этапе проверки залогинен или нет уже ругалось бы на session, куки стоят для автологина, долгие, если бы с нми была проблема, не пустил бы форум, а так доходит скрипт до этапа сабмита нормально(т.е. куки принимаются для логина нормально).

    Промежуток между заходом на форум и постингом небольшой ~15 секунд, т.е. о таймауте не может быть речи.
    С таким же промежутком через броузер без проблем постится.

    Может кто то уже сталкивался с подобной проблемой, как ее можно обойти?
    Вообще для этого движка(SMF), откуда берется этот параметр - 'session', из пост даных или из кукисов, где искать хотя бы..(

    Уже все перепробовал, но не могу понять что глючит, постинг в еще один форум на таком же движке, нормально работает, этот ни в какую.

    Буду признателен за любую полезную инфу, если надо еще какие либо подробности, то обязательно скину, только скажите.
    Сенкс.
     
  2. kravch_v

    kravch_v Member

    Joined:
    1 Sep 2011
    Messages:
    134
    Likes Received:
    43
    Reputations:
    1
    Можно посмотреть на код? :)
     
  3. armotium

    armotium New Member

    Joined:
    20 Nov 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Вот функция которая отправляет все:
    Code:
    function multi_curl($data, $options = array()) {
            $curls = array(); 
            $result = array(); 
            $mh = curl_multi_init(); 
            foreach ($data as $id => $param) {
                //echo "<pre>".print_r($param['headers'], true)."</pre>";
                    //exit;
                $curls[$id] = curl_init(); 
                $url = (is_array($param) && !empty($param['url'])) ? $param['url'] : $param; 
                curl_setopt($curls[$id], CURLOPT_URL, $param['url']);
                curl_setopt ($curls[$id], CURLOPT_USERAGENT, $param['user_agent']);
                curl_setopt($curls[$id], CURLOPT_HTTPHEADER,$param['headers']);
                curl_setopt($curls[$id], CURLOPT_REFERER, $param['referer']);
                curl_setopt($curls[$id], CURLOPT_COOKIEJAR, $param['cookies']);  
                curl_setopt($curls[$id], CURLOPT_COOKIEFILE, $param['cookies']);
                curl_setopt($curls[$id], CURLOPT_HEADER, 0);
                curl_setopt($curls[$id], CURLOPT_HTTPPROXYTUNNEL, true);
                curl_setopt($curls[$id], CURLOPT_PROXY, $param['proxy'][0]);
                curl_setopt($curls[$id], CURLOPT_PROXYUSERPWD, $param['proxy'][1]);
                curl_setopt($curls[$id],CURLOPT_FOLLOWLOCATION, true); 
                curl_setopt($curls[$id],CURLOPT_CONNECTTIMEOUT, 120); 
                curl_setopt($curls[$id], CURLOPT_TIMEOUT, 120); 
                curl_setopt($curls[$id], CURLOPT_MAXREDIRS, 10); 
                curl_setopt($curls[$id],CURLOPT_ENCODING,'gzip,deflate'); 
                curl_setopt($curls[$id], CURLOPT_RETURNTRANSFER, 1);
                //curl_setopt($curls[$id], CURLOPT_VERBOSE, true);
               
                if (is_array($param) && !empty($param['post_data'])) {
                    curl_setopt($curls[$id], CURLOPT_POST, 1);
                    curl_setopt($curls[$id], CURLOPT_POSTFIELDS, $param['post_data']);
                }
               
                if (count($options)>0) curl_setopt_array($curls[$id], $options);
                curl_multi_add_handle($mh, $curls[$id]);
            }
            $running = null; 
            do { curl_multi_exec($mh, $running); } while($running > 0);
           
            foreach($curls as $id => $c) {
                if($result[$id] = curl_multi_getcontent($c)) $result[$id] = $result[$id];
                else $result[$id] = array(2, curl_errno($curls[$id]), curl_error($curls[$id]));
                curl_multi_remove_handle($mh, $c);
            }
            curl_multi_close($mh);
            return $result;
        }
    Хотя честно говоря хз как код поможет, разве что настройки для cURL видны
     
  4. SANR

    SANR New Member

    Joined:
    21 Nov 2011
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Делал где то пол года назад для пхпбб тоже через цурл.
    Так вот как раз и за промежутка между авторизацией и постингом на неких форумах и не работало.
    Также стояла задержка 15 или 20сек. Увеличил задержку до 30сек и все стало на свои места.
     
  5. armotium

    armotium New Member

    Joined:
    20 Nov 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    У тебя оно видимо наоборот ругалось на то что слишком маленький промежуток был между заходом на страницу и сабмитом сообщения, я тут ругается на то что якобы слишком много времени прошло и у 'session' истек срок давности

    PhpBB к слову проблем не вызывает вообще, нормальный движек..а вот с этим сплошные муки..но форум нужный (
    Давно бы забил уже иначе.
     
  6. kravch_v

    kravch_v Member

    Joined:
    1 Sep 2011
    Messages:
    134
    Likes Received:
    43
    Reputations:
    1
    Авторизация происходит успешно?
    Как я понял, скрипт отказывается только постить сообщения?
     
  7. armotium

    armotium New Member

    Joined:
    20 Nov 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Да авторизация проходит успешно, потом скрипт идет на страницу для постинга, собирает оттуда все данные необходимые(name="sc", name="seqnum"), подставляет в пост данные, подставляет тайтл сообщения и тело сообщения(name="subject", name="message"), и отправляет сообщение, вверху оно, только там теги заменяются на данные, там видно, в ответ он должен получить страницу с постом и распарсить тоже, но это уже детали, в ответ он получает такую вот ошибку, как описано выше, и пост не создается.
     
  8. kravch_v

    kravch_v Member

    Joined:
    1 Sep 2011
    Messages:
    134
    Likes Received:
    43
    Reputations:
    1
    А там есть сессии, куки или-же хеш?
     
  9. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Какая линейка SMF?
    Во второй вроде эти параметры,
    искать их (и все другие) надо в исходном коде страницы; парсить регуляркой.
     
  10. armotium

    armotium New Member

    Joined:
    20 Nov 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    В пост даных есть один хеш, но я его распаршиваю и подставляю, сейчас немного читаю об этой ошибке, надо в кукисах смотреть, за 'session' насколько я понял они отвечают, потому что только два пути есть откуда скрипт форума данные получает это куки и пост данные.
    Пост данные я полностью воспроизвожу, получается что только куки остаются..

    Есть там еще Java script который в сбе хеш содержит:
    Code:
    <script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
    			var current_header_ic = false;
    
    			function shrinkHeaderIC(mode)
    			{
    				smf_setThemeOption("collapse_header_ic", mode ? 1 : 0, null, "5d603eb914cb0c9b519044aa1aa5965c");
    				document.getElementById("upshrink_ic").src = smf_images_url + (mode ? "/expand.gif" : "/collapse.gif");
    
    				document.getElementById("upshrinkHeaderIC").style.display = mode ? "none" : "";
    
    				current_header_ic = mode;
    			}
    		// ]]></script>
    Но наверно не в нем дело, хеш вот такой сам:
    5d603eb914cb0c9b519044aa1aa5965c

    И пост поле такой же хеш содержит:
    <input type="hidden" name="sc" value="5d603eb914cb0c9b519044aa1aa5965c" />

    Но как я и говорил, в пост данные этот хеш подставляется(не конкретно этот, а текущий)
     
  11. armotium

    armotium New Member

    Joined:
    20 Nov 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    На странице которая грузится перед постингом не нашел этого, а версия какая не знаю, в хедере форума не нашел версии, хз как определить, в футере тоже нету.