пятница, 23 января 2009 г.

Пара слов о коде программы UtmCheck

В предыдущем посте я рассказал о программе UtmCheck. Сейчас хочу рассказать по какому принципу работает программа, и какие проблемы пришлось решить.
Для того чтобы получить данные о состоянии счета в билинге, нам нужно программно открыть страницу билинга и прочитать эти данные. Для работы с веб-сервером (запрос, отсылка данных) нам подойдет Win32 Internet Extensions, или WinInet. WinInet представляет собой API для доступа к общим протоколам интернет, включая FTP, HTTP и Gopher. Это высокоуровневый API, позволяющий, в отличие от WinSock или TCP/IP, не заботиться о деталях реализации соответствующих интернет протоколов. К тому же библиотека входит в стандартную поставку Windows. По WinInet есть отличная статья Игорь Ткачёва  на www.rsdn.ru. Прочитали статью и кажется  вот оно. Все как на блюдечке с голубой каёмочкой. Описание, примеры. Берём функцию InternetConnect и третьим параметром INTERNET_DEFAULT_HTTPS_PORT говорим - работаем по https. Пишем простой код на чтение данных с первой страницы и запускаем. Тааа-дааа.... нет не та-да , а ошибка 12045 ERROR_WINHTTP_SECURE_INVALID_CA. Хм, неверный сертификат, что за ерунда? А давайте посмотрим как это работает через браузер. Заходим на страницу и видим предложение установить сертификат сайта. А в особо "запущенных" случаях (у меня так получилось) может выдать что сертификат то неверный, дата истекла у него и подобное. И только после того как мы принимаем сертификат, и просим игнорировать неверный сертификат, нас пускает на нужную страницу. Таким образом наша проблема в том, что мы не можем принять сертификат. Чтож, будем это исправлять. Для этого нужно вставить следующий код
DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
dwFlags = dwFlags | SECURITY_FLAG_IGNORE_UNKNOWN_CA | INTERNET_FLAG_IGNORE_CERT_CN_INVALID  |  INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
InternetSetOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags));
после вызова HttpOpenRequest, но перед вызовом HttpSendRequest. Пробуем запустить. Тааа-дааа. Получилось. Далее, как мне кажется, все просто. Нужно открыть требуемую страницу в билинге и прочитать от туда данные. В данном случае нам нужно найти на странице ( а это по сути текстовый файл ) фразу "Баланс (у.е.)". и там где то рядом с ней и есть нужная нам цифра баланса счета. Ну а дальше рисуем интерфейс. Я решил делать через WinAPI, что хорошо сказалось на размере программы. В принципе все. Код конечно не ахти какой, перескакиваю с char на tchar , и другие минусы. Но, на том и учимся.

0 коммент.:

Отправить комментарий