Страница 1 из 2
secure.sendNotification, Invalid request
Добавлено: 04 июл 2011, 01:17
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. С РНР раньше не работал, поэтому понятия не имею, почему такое может возникать. Но с этим еще не разбирался.
С нетерпением жду ответов. Заранее благодарен.
Re: secure.sendNotification, Invalid request
Добавлено: 05 июл 2011, 20:57
Александр
Re: secure.sendNotification, Invalid request
Добавлено: 06 июл 2011, 11:30
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
Re: secure.sendNotification, Invalid request
Добавлено: 07 июл 2011, 20:16
Александр
LonelyANDRoid
А если на 123 строчке написать sleep(3) ?
Re: secure.sendNotification, Invalid request
Добавлено: 12 июл 2011, 14:07
LonelyANDRoid
Александр,
Не помогло. Поставил даже Sleep(4) на всякий случай. Результат тот же. =/
Я вот подумал, если первый же результат таков, то может дело не в частоте запросов?
Re: secure.sendNotification, Invalid request
Добавлено: 12 июл 2011, 14:20
LonelyANDRoid
И еще кое-что. Как это
Александр писал(а):LonelyANDRoid
А если на 123 строчке написать sleep(3) ?
могло помочь? Может дело в том, что я в РНР новичок, а может просто торможу, но разве при кол-ве UID'ов больше 100 вообще выполняется эта строка?
Re: secure.sendNotification, Invalid request
Добавлено: 12 июл 2011, 19:40
Александр
LonelyANDRoid
Не, всё таки не помогло бы. Я недоразобрал код.
У тебя:
Код: Выделить всё
get_url($query); echo '<br /><br />vk возвращает: <br />'; $all_send = get_url($query);
get_url - два раза вызываешь.
Re: secure.sendNotification, Invalid request
Добавлено: 13 июл 2011, 15:36
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
Сейчас будем разбираться...
Re: secure.sendNotification, Invalid request
Добавлено: 13 июл 2011, 19:26
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, без вас было бы тяжко

Re: secure.sendNotification, Invalid request
Добавлено: 22 сен 2011, 12:52
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
и сообщения не доставляются...
