Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Авторизация

12K
06 октября 2005 года
dalex
12 / / 01.09.2005
Хочу написать программку которая загружала html на диск (combats.ru), затем изменяла бы страницу и загружала бы измененный код в CppWebBrowser.
С загрузкой проблем нет, но загвоздка состоит в необходимой авторизации. Соответственно каждый раз на диск сохраняется окно запроса.
Процедура авторизации вот как описана:

1)Человек вводит логин и пароль, нажимает "Зайти".
2)Логин и пароль передается скрипту с именем "enter.pl".
3)Указанный скрипт возвращает ответ с так-называемыми "cookie", плюс к этому он еще перенаправляет клиента на страничку "battle2.pl".

Как это можно реализовать в CppWebbrowser?
246
07 октября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dalex
Хочу написать программку которая загружала html на диск (combats.ru), затем изменяла бы страницу и загружала бы измененный код в CppWebBrowser.
С загрузкой проблем нет, но загвоздка состоит в необходимой авторизации. Соответственно каждый раз на диск сохраняется окно запроса.
Процедура авторизации вот как описана:

1)Человек вводит логин и пароль, нажимает "Зайти".
2)Логин и пароль передается скрипту с именем "enter.pl".
3)Указанный скрипт возвращает ответ с так-называемыми "cookie", плюс к этому он еще перенаправляет клиента на страничку "battle2.pl".

Как это можно реализовать в CppWebbrowser?


Вот так Я смотрю статистику, нажатием одной кнопки на тулбаре IE(вместо перехода на страницу с формой ввода, ввода имени и нажатия кнопки)

Код:
void __fastcall TMyIEExtentionImpl::WebPostData(String sPostData)
{
    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. Если сделаешь вперед меня дай знать.
12K
08 октября 2005 года
dalex
12 / / 01.09.2005
1.Имя "user" вижу. А пароль куда здесь пристроить?
2."TMyIEExtentionImpl"-это отдельный компонент (сори за глупый вопрос)?
246
08 октября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dalex
1.Имя "user" вижу. А пароль куда здесь пристроить?


Как называются параметры надо посмотреть на странице с формой, правый клик и выбрать просмотр HTML кода. Имена полей ввода и есть названия параметров. У меня будет так:
String sPostData="login=gizmo&password=HGdb5s";


Цитата:
Originally posted by dalex

2."TMyIEExtentionImpl"-это отдельный компонент (сори за глупый вопрос)?


СОМ-компонент. Плагин к IE который добавляет ему на панель кнопку, по нажатию на кот. выдается статистика(миную форму ввода).

Вот еще вариант:

Код:
void __fastcall TMyIEExtentionImpl::WIGetStat(String user)
{
    //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);
...

}

Такой вариант использую на работе т.к. там на странице со статистикой никакой полезной информации, кроме кол-ва скачаных байт, нет. А дома предпочтительней первый вариант, там есть еще много чего.
12K
10 октября 2005 года
dalex
12 / / 01.09.2005
Куки можно заполучить след. образом:

if (NMHTTP1->CookieIn != "")
{ ccc = NMHTTP1->CookieIn;
// Memo1->Text=ccc;
}
осталось узнать как их использовать.
246
11 октября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dalex
Куки можно заполучить след. образом:

if (NMHTTP1->CookieIn != "")
{ ccc = NMHTTP1->CookieIn;
// Memo1->Text=ccc;
}
осталось узнать как их использовать.


Мне бы для начала вообще узнать, что это такое...

12K
11 октября 2005 года
dalex
12 / / 01.09.2005
Подскажи мне ещё вот что: хочу в конец URL добавлять случайное число.

Вроде просто, но почему-то при компиляции слетает (окно ошибки):
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);
12K
11 октября 2005 года
dalex
12 / / 01.09.2005
И ещё - как через CppWebBrowser отправлять POST- данные, без IE-плагина? Я обыскал всё, но только к Делфи нашел.
Кнопка вот как в HTML выглядит:

<td class="row2" align="center" colspan="2"><input type="submit" name="view_history" value="Показать статистику" class="liteoption" /></td
12K
11 октября 2005 года
dalex
12 / / 01.09.2005
Уффф... твою функцию WebPostData повесил на кнопку. Теперь надо разобраться что именно "постить". Имеем следующую схему:
1. Form name="action", value "options", action=""
2. button name="view_history",value="Показать статистику".
Имя сервера,скажем "lg.net.ua\stat.php".
Вопрос-как будет выглядеть строка sPostData?.
"?action=view_history"-не работает.
246
12 октября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dalex
И ещё - как через CppWebBrowser отправлять POST- данные, без IE-плагина? Я обыскал всё, но только к Делфи нашел.


Ну надо было

Код:
void WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData)
{
  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);
}


Цитата:
Originally posted by dalex

Кнопка вот как в 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"
т.о.
 
Код:
String sPostData="user=gizmo";
WebPostData(CppWebBrowser1, "http://ps.mycompany.ru/cgi-bin/status.pls", sPostData);


Ну если прям не терпится нажать на кнопку, то вот тебе еще один вариант:
1. Переходишь на страницу с формой ввода CppWebBrowser1-Navigate();
2. Дожидаешься полной ее загрузки.
3. Заполняешь программно INPUT-элементы и нажимаешь кнопку, примерно так:
Код:
WideString  wsName = InputBox("Имя", "Введите имя", "Пупкин");

    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 ();
                }
            }
        }
    }


12K
12 октября 2005 года
dalex
12 / / 01.09.2005
Если поставить задачу так: забудем на время о вводимых данных и нужно просто сымитировать нажатие кнопки (только на форме несколько кнопок).
12K
12 октября 2005 года
dalex
12 / / 01.09.2005
Как будет выглядеть код без заполнений полей, галки и если несколько кнопок, а надо нажать одну?
12K
12 октября 2005 года
dalex
12 / / 01.09.2005
Как будет выглядеть код без заполнений полей, галки и если несколько кнопок, а надо нажать одну?
246
12 октября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dalex
Если поставить задачу так: забудем на время о вводимых данных и нужно просто сымитировать нажатие кнопки (только на форме несколько кнопок).


Ну Ты сначала возьми меня на работу, а потом уж задачу ставь...:).
Нужно найти кнопку (по типу как в примере выше) и IHTMLElement::click.

12K
12 октября 2005 года
dalex
12 / / 01.09.2005
Цитата:
Нужно найти кнопку (по типу как в примере выше) и IHTMLElement::click.


А есть идеи как эту самую кнопку искать?

246
12 октября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by dalex
А есть идеи как эту самую кнопку искать?


А имя у нее есть?

12K
12 октября 2005 года
dalex
12 / / 01.09.2005
Цитата:
Originally posted by GIZMO
А имя у нее есть?



Кнопка:

<td class="row2" align="center" colspan="2"><input type="submit" name="view_history" value="Показать статистику" class="liteoption" /></td

Имя, я так понял,"view_history"
А форма (если надо) name="action",value=""

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог