Работа с captcha vk api

2121
29 декабря 2016, 10:06

Как правильно отвечать на запрос капчи?

<?php
$token="token";
$key = $_POST['key'];
$wall = file_get_contents("https://api.vk.com/method/users.get?access_token=".$token);
$wall = json_decode($wall);
$wall = $wall->error;
if(isset($_POST['enter_key']))
{
    $wall1 = file_get_contents("https://api.vk.com/method/users.get?captcha_sid=".$wall->captcha_sid."&captcha_key=".$key."&access_token=".$token);
    print_r($wall1);
}
?>
<?echo"<img src='".$wall->captcha_img."'>";?>
<form method = "post">
    <input type="text" name="key">                                  
    <input name = "enter_key" type = "hidden">
    <button type="submit" class="btn btn-primary">Отпрваить</button>
</form>

Я отправляю запрос users.get, в ответ получаю ошибку капчи, потом отправляю запрос users.get + captcha_sid и captcha_key в ответе получаю ошибку капчи и просит опять ввести капчу Вот пример http://nicolaa.h1n.ru/1.php

Answer 1

При отправке капчи вы запрашиваете новую капчу и зачем-то передаете её sid. То есть вы берете новый свежесгенерированный sid и передаете вместе с ним решение старой капчи (у которой другой sid). В принципе, я думаю, это единственная дырка в логике вашего скрипта.

Но сама по себе ваша реализация ужасна: лишний запрос к API, неразборчивый код. Разумнее переписать его примерно так:

<?php
$token = 'token';
// Параметры запроса к API
$parameters = [
    'access_token' => $token
];
// Если страницу открыли после отправки формы решения капчи,
// то добавляем соответствующие параметры к запросу
if (!empty($_POST['captcha_sid']) && !empty($_POST['captcha_key'])) {
    $parameters['captcha_sid'] = $_POST['captcha_sid'];
    $parameters['captcha_key'] = $_POST['captcha_key'];
}
$request  = file_get_contents('https://api.vk.com/method/users.get?'.http_build_query($parameters));
$response = json_decode($request);
// Если ВК вернул ошибку с капчей, то
// показываем форму решения капчи
if (isset($response->error->captcha_img)) {
    echo '<img src="'.$response->error->captcha_img.'" alt="Captcha">';
    echo '<form method="post">';
    echo '<input type="text" name="captcha_key" required>';                           
    echo '<input type="hidden" name="captcha_sid" value="'.$response->error->captcha_sid.'">';
    echo '<button type="submit" class="btn btn-primary">Отправить</button>';
    echo '</form>';
}
READ ALSO
не могу вывести ассоциативный массив [требует правки]

не могу вывести ассоциативный массив [требует правки]

Здравствуйте не могу вывести отсюда данные mysql_fetch_assoc

305
Странное поведение SQL: возвращает Too Many Connections

Странное поведение SQL: возвращает Too Many Connections

Проблема следующая: как-то странно получается, что при подключении к БД отдается Too Many ConnectionsИз одного скрипта

365
Найти совпадения

Найти совпадения

Добрый деньПомогите, пожалуйста, найти верное направление для реализации моей задачи, которая заключается в следующем:

363
phpstorm - как описать переменную phpdoc&#39;ом вне класса?

phpstorm - как описать переменную phpdoc'ом вне класса?

Внутри класса описываю переменную:

390