Авторизация ВК с помощью libcurl. Почему не отправляется форма? — Хабр Q&A

Авторизация вк с помощью libcurl. почему не отправляется форма?

Всем привет. В общем, авторизируюсь ВК с помощью libcurl. Поля email/pass заполняются успешно, но вот форма не отправляется(т.е. не редиректит). Вот код самого запроса:

CURL* curl = curl_easy_init();
	if (!curl) return {};

	std::string appId = "1"; // Свой appid скрыл

	CURLcode res;
	std::string request = "https://oauth.vk.com/authorize?client_id="   appId   "&display=page&redirect_uri=vk.com/blank.html&scope=offline&response_type=token&v=5.64";
	std::string response;

	curl_easy_setopt(curl, CURLOPT_URL, request);
	curl_easy_setopt(curl, CURLOPT_POST, true);
	curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20220101 Firefox/38.0");
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "email=1234567890&pass=123456"); // Свои данные тоже скрыл
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
	curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
	curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
	curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
	curl_easy_setopt(curl, CURLOPT_VERBOSE, true);

	res = curl_easy_perform(curl);
	
	curl_easy_cleanup(curl);

curl_easy_perform(curl) возвращает 0.
Вот лог CURLOPT_VERBOSE: https://vhod-v-lichnyj-kabinet.ru/cCJZRNhF

Заранее спасибо!

Curl для

Привет!

Только сегодня сам интересовался этим вопросом, и нашел такое решение:

function get_curl($url) {
if(function_exists(‘curl_init’)) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$output = curl_exec($ch);
echo curl_error($ch);
curl_close($ch);
return $output;
} else {
return file_get_contents($url);
}
}

И применяешь эту функцию к своей ссылке вместо file_get_contents.

Oauth2.0 используя curl и bash

Я хочу написать баш скрипт, который будет взаимодействовать с контактом через апи.

Для начала необходимо запрограммировать OAuth2.0 авторизацию. Все казалось бы просто, но проблема в том, что я не могу использовать браузер, так как хочу чтобы мой скрипт работал на юниксовой машине без иксов и без вмешательства пользователя, то есть меня.

Исходя из документация сайта вконтакте сначала я должен выполнить GET запрос:

https://oauth.vk.com/authorize?client_id=<myapp_id>&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&scope=video,audio&response_type=token&v=5.44&revoke=1

Этот запрос выполняется нормально и я получаю страницу для отображения пользователю с формами ввода. На данной странице меня интересует только следующий код:

<form method="post" action="https://login.vk.com/?act=login&soft=1&utf8=1">
<input type="hidden" name="_origin" value="https://oauth.vk.com">
<input type="hidden" name="ip_h" value="<some_value>" />
<input type="hidden" name="lg_h" value="<some_value>" />
<input type="hidden" name="to" value="<some_value>">
<dl class="fi_row">
<dt class="fi_label">Phone or email:</dt>
<dd>
<div class="iwrap"><input type="text" class="textfield" name="email" value="" /></div>
</dd>
</dl>
<dl class="fi_row">
<dt class="fi_label">Password:</dt>
<dd>
<div class="iwrap"><input type="password" class="textfield" name="pass" /></div>
</dd>
</dl>
<div class="fi_row">
<div class="fi_subrow">
<input class="button" type="submit" value="Log in" /><div class="near_btn"><a href="//oauth.vk.com/blank.html#error=access_denied&error_reason=user_denied&error_description=User denied your request">Cancel</a></div>
</div>
</div>
<div class="fi_row_new">
<div class="fi_header fi_header_light">Not registered yet?</div>
</div>
<div class="fi_row">
<a class="button wide_button gray_button" href="https://m.vk.com/join?api_hash=a9612b3095c82d30df">Sign up for VK</a>
</div>
</form>

Исходя из документации и этого кода делаю вывод что должен реализовать следующее, то есть отправить пост запрос:

https://login.vk.com/?act=login&soft=1&utf8=1

и в качестве параметров передать следующие поля:

_origin, ip_h, lg_h, to, email, pass

Но этот запрос у меня не работает. Возвращается пустая строка при попытке выполнить через curl и страница с ошибкой, мол неправильный пароль если отправляю запрос через какой-нибудь REST клиент. Была мысль что проблема может быть в том, что я не использую куки, но с их добавлением тоже ничего не изменилось, хотя возможно я что-то сделал не так.

Скрипт, который я пытаюсь заставить работать:

#!/bin/bash
username=$1
password=$2

response=$(curl --cookie-jar vk.txt "https://oauth.vk.com/authorize" --data "client_id=<app_id>&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&scope=video,audio&response_type=token&v=5.44&revoke=1")
echo "response is $response"
echo "================================================================="
response=$(curl --request POST --cookie vk.txt "https://login.vk.com/?act=login&soft=1&utf8=1" --data-urlencode "_origin=https://oauth.vk.com&ip_h=<some_value>&lg_h=<some_value>&to=<some_value>&email=<my_email>&pass=<my_pass>")
echo "response is $response"
echo "================================================================="

exit 0

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

Я нашел на просторах статью, где эта задача решалась на питоне и у чувака все работает. Я воспользовался его питоновским кодом, переделав его под третий питон, но он также не работает. Возвращает пустую страницу после ввода логина и пароля, хотя должен возвращать страницу с разрешениями для приложения. Мне кажется, что механизм авторизации претерпел некоторые изменения, в связи с чем код перестал работать. Вот ссылка на ту статью:
https://habrahabr.ru/post/143972/

Вообщем вопрос в следующем: как сделать так чтобы всё заработало или что я делаю не так?

Vk api authorization curl?

Токен для работы моего скрипта могу получить, перейдя по ссылке вида:

https://oauth.vk.com/authorize?client_id=

&scope=notify,friends,photos,offline,wall&redirect_uri=blank.html&display=popup&response_type=token

Из открывшегося окна копирую токен и работаю с ним.

Скажите, как можно ли убрать костыль с копированием из адресной строки токена и получить токен в скрипт напрямую?

Где-то встречал, что никак, мол вк проверяет с какого домена обращение и если это не vk.com то не работает, надеюсь это неправда))

Получение token vk через curl php

Во первых, у тебя нету редиректа, страничку куда перенаправляется после удачного входа.

Во вторых, ты чё то мудришь с куками. Попробуй их сбрасывать CURLOPT_COOKIESESSION true.

В третьих, проверь настройки своего клиента client_id=2890984, может такого вообще не существует.

Похожее:  ASP.NET Core Identity

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *