Авторизация
С загрузкой проблем нет, но загвоздка состоит в необходимой авторизации. Соответственно каждый раз на диск сохраняется окно запроса.
Процедура авторизации вот как описана:
1)Человек вводит логин и пароль, нажимает "Зайти".
2)Логин и пароль передается скрипту с именем "enter.pl".
3)Указанный скрипт возвращает ответ с так-называемыми "cookie", плюс к этому он еще перенаправляет клиента на страничку "battle2.pl".
Как это можно реализовать в CppWebbrowser?
Хочу написать программку которая загружала html на диск (combats.ru), затем изменяла бы страницу и загружала бы измененный код в CppWebBrowser.
С загрузкой проблем нет, но загвоздка состоит в необходимой авторизации. Соответственно каждый раз на диск сохраняется окно запроса.
Процедура авторизации вот как описана:
1)Человек вводит логин и пароль, нажимает "Зайти".
2)Логин и пароль передается скрипту с именем "enter.pl".
3)Указанный скрипт возвращает ответ с так-называемыми "cookie", плюс к этому он еще перенаправляет клиента на страничку "battle2.pl".
Как это можно реализовать в CppWebbrowser?
Вот так Я смотрю статистику, нажатием одной кнопки на тулбаре IE(вместо перехода на страницу с формой ввода, ввода имени и нажатия кнопки)
{
BSTR bstrHeaders = NULL;
TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData.c_str();
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;
bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencoded\r\n");
if (!bstrHeaders){
ShowMessage("Could not allocate bstrHeaders");
return;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
pvPostData = vPostData;
if(pvPostData){
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
if(!psa){
return;
}
SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
}
m_pWebBrowser2->Navigate(WideString("http://ps.mycompany.ru/cgi-bin/status.pls"), &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}
...
String sPostData="user=MyAccount";
WebPostData(sPostData);
С куками и переадресацией пока сам разбираюсь. Точно могу сказать, что их надо добавлять аналогично через &vHeaders. Если сделаешь вперед меня дай знать.
2."TMyIEExtentionImpl"-это отдельный компонент (сори за глупый вопрос)?
1.Имя "user" вижу. А пароль куда здесь пристроить?
Как называются параметры надо посмотреть на странице с формой, правый клик и выбрать просмотр HTML кода. Имена полей ввода и есть названия параметров. У меня будет так:
String sPostData="login=gizmo&password=HGdb5s";
2."TMyIEExtentionImpl"-это отдельный компонент (сори за глупый вопрос)?
СОМ-компонент. Плагин к IE который добавляет ему на панель кнопку, по нажатию на кот. выдается статистика(миную форму ввода).
Вот еще вариант:
{
//TODO: Add your source code here
//iieo?aiea noaoenoeee ?a?ac WinInet
//http://ps.company.ru/cgi-bin/status.pls
// for POST
// char *pTarget = "/cgi-bin/status.pls";
// char *pOptHeaders = "user=gizmo";
// for GET
//char *pTarget = "/cgi-bin/status.pls?user=gizmo";
//char *pOptHeaders = NULL;
String Line, Msg;
HINTERNET hInternet = InternetOpen("CGI AGENT",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hConnection = InternetConnect(hInternet, "ps.company.ru",
80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET hRequest = HttpOpenRequest(hConnection , "POST",
"/cgi-bin/status.pls",
NULL, NULL, NULL,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, NULL);
if(TRUE == ::HttpSendRequest( hRequest,
NULL,
0,
user.c_str(),
user.Length()))
{
//... ?eoaai ...
DWORD dwRead;
TCHAR szTemp[1024];
while (InternetReadFile(hRequest, (LPVOID)szTemp, 1023, &dwRead))
{
if (!dwRead) break;
szTemp[dwRead]='\0';
Line = Line + String(szTemp);
}
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnection);
InternetCloseHandle(hInternet);
// ... ia?nei ...
int startpos = Line.Pos ( "" ) + AnsiString("").Length();
int endpos = Line.Pos ( "" );
// ... oi?ie?oai niiauaiea ...
Line = Line.SubString ( startpos, endpos-startpos );
Msg.printf("Iauai iieo?aiiie eioi?iaoee:\n\r%s aaeo", Line.c_str());
// ... iieo?aai HWND Browser-a ...
HWND hBrowser=NULL;
long lBrowser;
if ( SUCCEEDED (m_pWebBrowser2->get_HWND(&lBrowser)))
hBrowser=(HWND)lBrowser;
MessageBox(hBrowser, Msg.c_str(), "Noaoenoeea cn2-mdm", MB_OK);
...
WIGetStat(sPostData);
...
}
Такой вариант использую на работе т.к. там на странице со статистикой никакой полезной информации, кроме кол-ва скачаных байт, нет. А дома предпочтительней первый вариант, там есть еще много чего.
if (NMHTTP1->CookieIn != "")
{ ccc = NMHTTP1->CookieIn;
// Memo1->Text=ccc;
}
осталось узнать как их использовать.
Куки можно заполучить след. образом:
if (NMHTTP1->CookieIn != "")
{ ccc = NMHTTP1->CookieIn;
// Memo1->Text=ccc;
}
осталось узнать как их использовать.
Мне бы для начала вообще узнать, что это такое...
Вроде просто, но почему-то при компиляции слетает (окно ошибки):
char *ddd;
char *ranf;
char *dummy;
int ggg;
ggg=random(1000000);
dummy=ltoa(ggg,ranf,10);
ranf="lg.net.ua\log.pl?";
ddd=strcat(ranf,dummy);
Кнопка вот как в HTML выглядит:
<td class="row2" align="center" colspan="2"><input type="submit" name="view_history" value="Показать статистику" class="liteoption" /></td
1. Form name="action", value "options", action=""
2. button name="view_history",value="Показать статистику".
Имя сервера,скажем "lg.net.ua\stat.php".
Вопрос-как будет выглядеть строка sPostData?.
"?action=view_history"-не работает.
И ещё - как через CppWebBrowser отправлять POST- данные, без IE-плагина? Я обыскал всё, но только к Делфи нашел.
Ну надо было
{
BSTR bstrHeaders = NULL;
TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData.c_str();
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;
bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencodedrn");
if (!bstrHeaders){
Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
return;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
pvPostData = vPostData;
if(pvPostData){
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
if(!psa){
return;
}
SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
}
CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}
Кнопка вот как в HTML выглядит:
<td class="row2" align="center" colspan="2"><input type="submit" name="view_history" value="Показать статистику" class="liteoption" /></td
Кнопку не трогай. Тебе нужны INPUT-элементы. Напр. на страница ввода имени пользователя:
<FORM METHOD="POST" action="http://ps.mycompany.ru/cgi-bin/status.pls">
Учетная запись:<INPUT TYPE="text" NAME="user" >
<INPUT TYPE="submit" value="Запрос">
...
мне нужен <INPUT TYPE="text" NAME="user"
т.о.
WebPostData(CppWebBrowser1, "http://ps.mycompany.ru/cgi-bin/status.pls", sPostData);
Ну если прям не терпится нажать на кнопку, то вот тебе еще один вариант:
1. Переходишь на страницу с формой ввода CppWebBrowser1-Navigate();
2. Дожидаешься полной ее загрузки.
3. Заполняешь программно INPUT-элементы и нажимаешь кнопку, примерно так:
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc;
CComQIPtr<IHTMLElementCollection, &IID_IHTMLElementCollection> pColl;
CComQIPtr<IDispatch, &IID_IDispatch> pTmpDisp;
CComQIPtr<IHTMLInputElement, &IID_IHTMLInputElement> pElement1;
CComQIPtr<IDispatch, &IID_IDispatch> pDisp1;
CComQIPtr<IHTMLInputElement, &IID_IHTMLInputElement> pElement2;
CComQIPtr<IDispatch, &IID_IDispatch> pDisp2;
if ( SUCCEEDED (WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc)))
{
if ( SUCCEEDED (pDoc->get_all(&pColl)))
{
if ( SUCCEEDED (pColl->tags(TVariant("INPUT"), &pTmpDisp)))
{
pColl=pTmpDisp;
TVariant v1("string"), v12("Only"), v2;
pColl->item( v1, v2, &pDisp1);
pElement1 = pDisp1;
pElement1->put_value(wsName);
pColl->item( v12, v2, &pDisp2);
pElement2 = pDisp2;
pElement2->put_checked(1);
// нажать на кнопку //click SUBMIT Button
IHTMLElementCollection *HTMLForms = NULL;
if ( SUCCEEDED ( pDoc->get_forms ( &HTMLForms ) ) && HTMLForms )
{
// slHtmlFormName <form name=...>
TVariant vName5(0);
TVariant vIndex5;
IDispatch *pDisp5 = NULL;
if ( SUCCEEDED ( HTMLForms->item (vName5, vIndex5, &pDisp5 ) ) && pDisp5 )
{
IHTMLFormElement *HTMLForm = NULL;
if ( SUCCEEDED ( pDisp5 -> QueryInterface ( IID_IHTMLFormElement, ( LPVOID* )&HTMLForm ) ) && HTMLForm )
{
HTMLForm -> submit ();
HTMLForm -> Release ();
}
pDisp5 -> Release ();
}
HTMLForms -> Release ();
}
}
}
}
Если поставить задачу так: забудем на время о вводимых данных и нужно просто сымитировать нажатие кнопки (только на форме несколько кнопок).
Ну Ты сначала возьми меня на работу, а потом уж задачу ставь...:).
Нужно найти кнопку (по типу как в примере выше) и IHTMLElement::click.
А есть идеи как эту самую кнопку искать?
А есть идеи как эту самую кнопку искать?
А имя у нее есть?
А имя у нее есть?
Кнопка:
<td class="row2" align="center" colspan="2"><input type="submit" name="view_history" value="Показать статистику" class="liteoption" /></td
Имя, я так понял,"view_history"
А форма (если надо) name="action",value=""