Получение ответа от браузера
Необходимо получить данные от браузера, а точнее код авторизации. Я использую API ссылку для этого кода OAuth2 сервиса MailRu. Этот код отображается в адресной строке браузера после успешной авторизации, при этом происходит перенаправление на redirect_uri=.... Для запуска браузера используется Process, после этого я пытаюсь прослушать порт XXXX с помощью HttpListener, однако даже если я получаю какой-то ответ, то это бессмысленный набор символов. (UTF-8 и т.п. пробовал, результат тот же)
Как можно получить код авторизации из браузера после успешной авторизации?
Код с использованием HttpListener
static void SniffPort()
{
byte[] input = new byte[] { 1 };
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Broadcast, 5000));
socket.IOControl(IOControlCode.ReceiveAll, input, null);
byte[] buffer = new byte[4096];
Task.Factory.StartNew(() =>
{
while (true)
{
int len = socket.Receive(buffer);
if (len <= 40) continue;
string bin = Encoding.Default.GetString(buffer, 0, len);
Console.WriteLine(bin);
}
});
}
static HttpListener _httpListener = new HttpListener();
static void Main(string[] args)
{
Console.WriteLine("Starting server...");
_httpListener.Prefixes.Add("https://localhost:5000/");
_httpListener.Start();
Console.WriteLine("Server started.");
SniffPort();
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Users\User\Desktop\chrome-win\chrome.exe");
startInfo.WindowStyle = ProcessWindowStyle.Normal;
Process p = new Process();
startInfo.Arguments = "--app=https://o2.mail.ru/login?client_id=CLIENT_ID&response_type=code&scope=userinfo&redirect_uri=https://localhost:5000/&state=some_state";
p.StartInfo = startInfo;
p.Start();
p.WaitForExit();
}
Также был вариант с FiddlerCore, однако после его использования приходится изменять настройки связанные с прокси в inetcpl.cpl. Также это не работает если браузер запомнил пользователя и сразу авторизовался после запуска браузера, FiddlerCore не выдаёт эту информацию.
Код с использованием FiddlerCore
public class HttpProxy : IDisposable
{
public HttpProxy()
{
Fiddler.FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;
Fiddler.FiddlerApplication.Startup(5000, true, false);
}
void FiddlerApplication_BeforeRequest(Fiddler.Session oSession)
{
Console.WriteLine(String.Format("REQ: {0}", oSession.url));
}
public void Dispose()
{
Fiddler.FiddlerApplication.Shutdown();
}
}
static HttpListener _httpListener = new HttpListener();
static void Main(string[] args)
{
HttpProxy httpProxy = new HttpProxy();
//Запуск браузера как в коде, который находится выше.
}