LINUX.ORG.RU

Задавать вопросы на otvet.mail.ru


0

2

Добрый вечер.

Меня этот мэил.ру уже достал =) Не могу скриптом задать вопрос на сайте. Не подскажите, что не так? (POST параметры выдерал wireshark'ом)

<?php

class MailRu
{
  private static $_instance;

  public function __construct()
  {
    $this->auth();
    echo $this->ask();
  }

  /**
   * @return MailRu
   */
  public static function getInstance()
  {
    if (!is_object(self::$_instance))
    {
      self::$_instance = new MailRu();
    }

    return self::$_instance;
  }

  private function auth()
  {
     $url    = 'https://auth.mail.ru/cgi-bin/auth';
     $post   = 'Login=login&Domain=mail.ru&Password=gfccmdjhl&level=1';
     $cookie = dirname(__FILE__) . '/cookies.txt';
     $ch     = curl_init();

     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
     curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
     curl_setopt($ch, CURLOPT_POST, true);
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

     $result = curl_exec($ch);
     curl_close($ch);

     return $result;
  }

  public function ask()
  {
    $url    = 'http://otvet.mail.ru/ask';
    $cookie = dirname(__FILE__) . '/cookies.txt';
    $ch     = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $result = curl_exec($ch);
    curl_close($ch);

    $askKey = explode('name="ch" value="', $result);
    $askKey = explode('" />', $askKey[1]);
    $askKey = $askKey[0];

    $url  = 'http://otvet.mail.ru/doit';
    $post = 'action=authaddqst&HTMLMessage=1&text=&ch=' . $askKey . '&test=%D2%C5%D1%D2&' .
            'qtext=%E2%EE%EF%F0%EE%F1+%F1%EE%E1%F1%F2%E2%E5%ED%ED%EE&Body=%EF%EE%FF%F1%ED%E5%ED%E8%FF&' .
            'orfo=&tags=%EC%E5%F2%EA%E0&cid=4&subcid=1330&poll_option=&poll_option=&' .
            'poll_option=&poll_option=&poll_option=&poll_option=&poll_option=&' .
            'poll_option=&poll_option=&poll_option=&poll_option=&poll_option=&' .
            'poll_option=&poll_option=&poll_option=&poll_option=&cancomment=1';
    $ch   = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;
  }
}

?>
★★★

Бегло просмотрел. Не задаете Referer и User-Agent? Referer иногда проверяют, и у меня был случай, когда нужно было задать хоть какое-то значение в UA. И еще: говорите, не работает, так какой код выдает и какое сообщение об ошибке?

amomymous ★★★ ()
Ответ на: комментарий от amomymous

> Бегло просмотрел. Не задаете Referer и User-Agent? Referer иногда проверяют, и у меня был случай, когда нужно было задать хоть какое-то значение в UA. И еще: говорите, не работает, так какой код выдает и какое сообщение об ошибке?

За напоминание о Referer и User-Agent - спасибо. А ошибок вроде нет.

VirRaa ★★★ ()
Ответ на: комментарий от VirRaa

> За напоминание о Referer и User-Agent - спасибо. А ошибок вроде нет.

Таки дело может быть не только в них. Часто встречается, когда после поста на определённый url, c него уже идёт серия 302-х редиректов(с подмешиванием какой-нибудь куки или чего-нибудь в сессию).

А у тебя я опции CURLOPT_FOLLOWLOCATION как раз не наблюдаю.

r_asian ★☆☆ ()
Ответ на: комментарий от dizza

> Да просто глаз резануло использование классов для такой простенькой задачи.

Активированного угля выпей и комнату проветри,чтобы глаза не резало.

Класс тут вполне к месту. Тебеу не приходило в голову, что это может быть либа для чего-то?

r_asian ★☆☆ ()
Ответ на: комментарий от xtraeft

> а что в $result получается?

То, что возвращает сервер - 302 Not Found

VirRaa ★★★ ()
Ответ на: комментарий от dizza

> Да просто глаз резануло использование классов для такой простенькой задачи. Не берите в голову :)

Это вендорный класс для целой системы. Так что...

VirRaa ★★★ ()
Ответ на: комментарий от r_asian

> А у тебя я опции CURLOPT_FOLLOWLOCATION как раз не наблюдаю.

Попробую. Но у FOLLOWLOCATION наблюдаются проблемы с open_basedir.

VirRaa ★★★ ()

Не проверяется возвращаемое значение, старые версии курла могут не поддерживать новые параметры.

Можно поставить CURLOPT_FOLLOWLOCATION чтобы курл перенаправляло куда-угодно.

sched ()
Ответ на: комментарий от sched

> Можно поставить CURLOPT_FOLLOWLOCATION чтобы курл перенаправляло куда-угодно.

У curl'а конфликт с php open_basedir - пока ищу решение этой проблемы.

VirRaa ★★★ ()
Ответ на: комментарий от dizza

> А тупо модулей как в питоне в вашем пыхе нету? Тут именно оно: класс-синглтон без состояния.

Модуль - настолько широкое понятие, что я не могу дать ответ на этот вопрос. Можно его более конкретнее сформулировать?

VirRaa ★★★ ()
Ответ на: комментарий от VirRaa

очень интересно, заинтригован... я кстати давно просветленный там.

XoFfiCEr ★☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.