secure.sendNotification, Invalid request

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

Здравствуйте, уважаемые.
Взяв и немного подправив скрипт Александра (спасибо :) ) из этой темы: http://flapps.ru/forum/topic2052.html , я столкнулся со следующей проблемой. Всё отлично работает, когда получателей меньше 100. Когда же их больше (сейчас в базе более 41к UID'в), я получаю от ВК следующее:

Код: Выделить всё

8 Invalid request: same query repeated too frequently
Как видно из кода, я уже даже поставил sleep (30) после каждой отправки, но это не помогло.
 скрипт

Код: Выделить всё

<?php set_time_limit(0); $uidsForNotice = array(); function flat_array($array) {    global $uidsForNotice;        foreach ($array as $value)     {        if(is_array($value))         {             $result=array_merge($result,flat_array($value));        }        else        {            if (!(in_array($value, $uidsForNotice)))            {                $uidsForNotice[] = $value;            }        }     }     return $result; } if (isset($_POST['send'])) {     require('VkApi.class.php');    include('settings_for_notification.php');        mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());     function get_url($query)     {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $query);        curl_setopt($ch, CURLOPT_HEADER, 0);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_TIMEOUT, 10);        return curl_exec($ch);        curl_close($ch);    }     $message = $_POST['mess'];    $sql = 'SELECT `iID` FROM `'.$table_name.'`';    $res = @mysql_query($sql)        or die("Invalid query: " . mysql_error());    $all = @mysql_num_rows($res);        echo 'Всего пользователей: '.$all.'<br />';    echo 'Сообщение: '.$message.'<br /><br />';        $all_send = 0;    $api = new VkApiNode($app_id, $api_secret);    $totalsent = 0;    if ($all > 100)     {        $kolvo = ceil($all/100);        for ($i=0; $i<$kolvo; $i++)         {            $uids = '';            $sql = 'SELECT `iID` FROM `'.$table_name.'` ORDER BY `iID` LIMIT '.($i*100).','.(100);            $res = @mysql_query($sql) or die("Invalid query: " . mysql_error());                        $tempuids = array ();            while($tempuids[]=mysql_fetch_array($res)){/*umm... do nothing...*/}             flat_array ($tempuids);            unset($uidsForNotice[count($uidsForNotice)-1]);            $query = $api->sendNotification($uidsForNotice, $message);            get_url($query);                                    echo '<br /><br />vk возвращает: <br />';            $all_send = get_url($query);            echo $all_send;                 if ($all_send == 0)            {                echo 'Идёт отправка... Отправлено: 0 / '.$all.'<br />';            }            else            {                $all_send = $all_send + substr_count($uids, ',') + 1;                           echo 'Идёт отправка... Отправлено: '.$all_send.' / '.$all.'<br />';            }            $totalsent += $all_send;            flush();            sleep(30);        }        echo '<br />Отправка завершена. Отправлено: '.($totalsent).' / '.$all.'<br />';    }    else     {        $uids = array();        $tempuids = array ();        while($tempuids[]=mysql_fetch_array($res)){/*umm... do nothing...*/}         flat_array ($tempuids);        unset($uidsForNotice[count($uidsForNotice)-1]);        echo '<br /><br />uids after flat_array: <br />';        print_r($uidsForNotice);        $uidsStr = '';        foreach ($uidsForNotice as $i)         {            $uidsStr = $uidsStr.','.$i;        }        $uidsStr = substr($uidsStr, 1);        echo '<br /><br />uids STRING: <br />';        print_r($uidsStr);          $query = $api->sendNotification($uidsForNotice, $message); //---- РАБОТАЕТ        echo '<br /><br />vk возвращает: <br />';        $all_send = get_url($query);        echo $all_send;             if ($all_send == 0)        {            echo 'Отправлено: 0 / '.$all.'<br />';        }        else        {            $all_send = $all_send + substr_count($uids, ',') + 1;                       echo 'Отправлено: '.$all_send.' / '.$all.'<br />';        }     }    }else {    ?>        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">    <html>        <head>            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">            <title>Отправка уведомлений</title>        </head>                <body>            <h1>Отправка уведомлений</h1>            <form method="post">                Текст уведомления (максимум 1024 символа):<br />                <textarea name="mess" cols="50" rows="5"></textarea><br /><br />                <button name="send" type="submit">Отправить</button>            </form>        </body>    </html><? } ?>
Будьте добры, помогите разобраться хотя бы с тем, в чем вообще может быть проблема. Я не прошу готового решения, хотя и не откажусь от него. В гугле ничего не нашел. Также не ничего не нашел помощи в обсуждении этого метода вот здесь: Обсуждение secure.sendNotification (Алексей Лавров)


Кроме того, через некоторое время работы скрипта получаю еще и это: Request-URI Too Large. С РНР раньше не работал, поэтому понятия не имею, почему такое может возникать. Но с этим еще не разбирался.

С нетерпением жду ответов. Заранее благодарен.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: secure.sendNotification, Invalid request

Сообщение Александр »

Не ограничения контакта?
http://flapps.ru/forum/topic3207.html#p23867
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

Re: secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

Александр,
Честно говоря, даже не знаю. Но вроде как дело не в этом. Пробовал делать двухсуточный перерыв между отправлениями - тот же эффект.

Далее приведу немного отредактированные для удобства чтения результаты выполнения скрипта. Звездочки, естественно, вставил сам.
Всего пользователей: 42075
Сообщение: Текст сообщения.

vk возвращает:
8 Invalid request: same query repeated too frequently api_id 22***** format XML message Уважаемые жители Зомбиленда! Рады сообщить, что Арена вновь открыла свои двери для вас. Сражайтесь и побеждайте! method secure.sendNotification random 373590138 timestamp 130994**** uids ,10000****,10000****, ... [часть вырезана] ... ,1002****,10026**** v 2.0 sig 7deb4b50f27bb0e24f14314efe83a9a1 Идёт отправка... Отправлено: 0 / 42075
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: secure.sendNotification, Invalid request

Сообщение Александр »

LonelyANDRoid
А если на 123 строчке написать sleep(3) ?
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

Re: secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

Александр,
Не помогло. Поставил даже Sleep(4) на всякий случай. Результат тот же. =/

Я вот подумал, если первый же результат таков, то может дело не в частоте запросов?
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

Re: secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

И еще кое-что. Как это
Александр писал(а):LonelyANDRoid
А если на 123 строчке написать sleep(3) ?
могло помочь? Может дело в том, что я в РНР новичок, а может просто торможу, но разве при кол-ве UID'ов больше 100 вообще выполняется эта строка?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: secure.sendNotification, Invalid request

Сообщение Александр »

LonelyANDRoid
Не, всё таки не помогло бы. Я недоразобрал код.

У тебя:

Код: Выделить всё

             get_url($query);                                  echo '<br /><br />vk возвращает: <br />';            $all_send = get_url($query);
get_url - два раза вызываешь.
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

Re: secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

Александр,
Спасибо огромное! Вновь и вновь моя невнимательность стоит мне много времени =(

Теперь, правда, другая ошибка:
vk возвращает:
113 Invalid user id api_id 22***95 format XML message Какое-нибудь сообщение method secure.sendNotification random 1890248998 timestamp 1310560256 uids ,***004613,***008456, ***, 100258503,100260177 v 2.0 sig 870bbf972d5147f86113ed6f540421ec Идёт отправка... Отправлено: 0 / 44902
Сейчас будем разбираться...
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

Re: secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

Ура, всё работает! Еще раз спасибо, Александр.

Авось кому пригодится, привожу финальный вариант кода. Он кривоват, но всё-таки он работает. Отправляет очень медленно - минут за 15-20 только уведомление отправилось только 15к пользователей.

Еще одна проблема, которую пришлось решить: при долгой отправке в объекте VK "стареет" timestamp, поэтому я добавил в VkApiClass функцию его обновления и вызываю перед каждой отправкой.

Функция простая:

Код: Выделить всё

    public function refreshTimestamp ()    {        $this->timestamp = time();    }
Код скрипта отправки сообщений далее.
 фекалокод

Код: Выделить всё

<?php set_time_limit(0); $uidsForNotice = array(); function flat_array($array) {    global $uidsForNotice;        foreach ($array as $value)     {        if(is_array($value))         {             $result=array_merge($result,flat_array($value));        }        else        {            if (!(in_array($value, $uidsForNotice)))            {                $uidsForNotice[] = $value;            }        }     }     return $result; } if (isset($_POST['send'])) {     require('VkApi.class.php');    include('settings_for_notification.php');        mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());    mysql_select_db($db_name) or die (mysql_error());     function get_url($query)     {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $query);        curl_setopt($ch, CURLOPT_HEADER, 0);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_TIMEOUT, 10);        return curl_exec($ch);        curl_close($ch);    }     $message = $_POST['mess'];    $sql = 'SELECT `iID` FROM `'.$table_name.'`';    $res = @mysql_query($sql)        or die("Invalid query: " . mysql_error());    $all = @mysql_num_rows($res);        echo 'Всего пользователей: '.$all.'<br />';    echo 'Сообщение: '.$message.'<br /><br />';        $all_send = 0;    $api = new VkApiNode($app_id, $api_secret);    $totalsent = 0;    $sentCount = 0;    if ($all > 100)     {        $kolvo = ceil($all/100);        for ($i=0; $i<$kolvo; $i++)         {            $uidsForNotice = array(); // обнуляем массив получателей уведомлений             $uids = '';            $sql = 'SELECT `iID` FROM `'.$table_name.'` ORDER BY `iID` LIMIT '.($i*100).','.(100);            $res = @mysql_query($sql) or die("Invalid query: " . mysql_error());                        $tempuids = array ();            while($tempuids[]=mysql_fetch_array($res)){/*umm... do nothing...*/}             flat_array ($tempuids);            unset($uidsForNotice[0]);            $api->refreshTimestamp();            $query = $api->sendNotification($uidsForNotice, $message);                        echo '<br /><br />vk возвращает: <br />';            $all_send = get_url($query);            echo $all_send;             $t = substr_count($all_send, ',') + 1;            if ($t!=1) $sentCount += $t;             echo 'Идёт отправка... Отправлено: '.$sentCount.' / '.$all.'<br />';             flush();            sleep(4);                    }        echo '<br />Отправка завершена. Отправлено: '.($sentCount).' / '.$all.'<br />';    }    else     {        $uids = array();        $tempuids = array ();        while($tempuids[]=mysql_fetch_array($res)){/*umm... do nothing...*/}             flat_array ($tempuids);        unset($uidsForNotice[count($uidsForNotice)-1]);        echo '<br /><br />uids after flat_array: <br />';        print_r($uidsForNotice);        $query = $api->sendNotification($uidsForNotice, $message);         echo '<br /><br />vk возвращает: <br />';        $all_send = get_url($query);        echo $all_send;             if ($all_send == 0)        {            echo 'Отправлено: 0 / '.$all.'<br />';        }        else        {            $all_send = $all_send + substr_count($uids, ',') + 1;                       echo 'Отправлено: '.$all_send.' / '.$all.'<br />';        }    }    }else {    ?>        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">    <html>        <head>            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">            <title>Отправка уведомлений</title>        </head>                <body>            <h1>Отправка уведомлений</h1>            <form method="post">                Текст уведомления (максимум 1024 символа):<br />                <textarea name="mess" cols="50" rows="5"></textarea><br /><br />                <button name="send" type="submit">Отправить</button>            </form>        </body>    </html><? } ?>
Спасибо, flapps, без вас было бы тяжко :)
LonelyANDRoid
Сообщения: 34
Зарегистрирован: 11 мар 2011, 16:06

Re: secure.sendNotification, Invalid request

Сообщение LonelyANDRoid »

Недавно упал мой сервер и теперь скрипт не работает. До падения всё было нормально. Кто-нибудь знает, в чем может быть проблема?
После восстановления сервера при выполнении этого скрипта я получал сообщения об ошибках, которых раньше не было. Код тот же. Почти все ошибки я поправил, но сейчас получаю следующие результаты работы скрипта:
4 Incorrect signature api_id 224**** method secure.sendNotification format XML v 2.0 timestamp 1316684385 random 1719490133 uids 10019****, ... ,10034**** message Уважаемые игроки.... Удачи в сражениях! sig 25dc459f44c51a1e8766f57******** Идёт отправка... Отправлено: 204 / 69420
и сообщения не доставляются... :(
Ответить