1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Скачивание КриптоПРО

Тема в разделе "Inno Setup", создана пользователем Эмиль, 4 май 2018.

  1. Новичок

    Регистрация:
    4 фев 2018
    Сообщения:
    16
    Симпатии:
    0
    Пол:
    Мужской
    Добрый день. Раньше работал данный скрипт, который скачивал с сайта КРИПТО-ПРО нужную версию. Сейчас, почему то этого не происходит. Ссылка https://www.cryptopro.ru/system/files/private/csp/39/8495/CSPSetup.exe рабочая, когда вручную вставляешь ее в браузер.

    PS может кто-то подскажет как это делать по другому? Спасибо

    // Скачивание КриптоПро.
    procedure CSPdownload (Sender: TObject);
    var
    Path : string;
    begin
    // MessageBox(hWnd, 'CSPdownload', 'Ошибка', MB_OK or MB_ICONERROR);
    try
    ProgressPage.ProgressBar.Style := npbstMarquee;
    ProgressPage.SetProgress(53, 100);
    ProgressPage.Show;
    ProgressPage.ProgressBar.Show;
    if (WinVersion = '5.1') or (WinVersion = '5.2') then Path := ExpandConstant(GetIniString('CSPPath', 'URLXP', 'https://www.cryptopro.ru/sites/default/files/private/csp/36R4/7777/cspsetup.exe', ExpandConstant('{src}\aTEST.ini')))
    else Path := ExpandConstant(GetIniString('CSPPath', 'URL', 'https://www.cryptopro.ru/system/files/private/csp/39/8495/CSPSetup.exe', ExpandConstant('{src}\aTEST.ini')));
    ProgressPage.Msg1Label.Caption := 'Подготовка к скачиванию файла...';
    ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
    //MessageBox(hWnd, 'Path', 'Ошибка', MB_OK or MB_ICONERROR);
    try
    for I := 53 to 81 do begin
    ProgressPage.SetProgress(I, 100);
    Sleep(10);
    end;
    except
    end;
    if DownloadFile(Path, '') then
    begin
    // MessageBox(hWnd, 'DownloadFile', 'Ошибка', MB_OK or MB_ICONERROR);
    {Edit.Text := '';
    Edit1.Text := '';}
    WizardForm.Hide;
    ShellExec('', szFileName, '-lang rus -kc kc1 -silent -nodlg -args "/qb REGREGISTRY=0 NOINTERACTIVESERVICES=1"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);
    CheckCryptoPro();
    if (addlic) then
    begin
    if MessageBox(hWnd, 'Внимание! Для работы КриптоПро CSP требуется ввести серийный номер.' +
    'Нажмите "Да", чтобы ввести серийный номер сейчас, либо "Нет", чтобы сделать это позже.', 'Установка КриптоПро', MB_YESNO or MB_ICONINFORMATION) = IDYES then
    begin
    MsiSetInternalUI(INSTALLUILEVEL_FULL, 0);
    MsiCollectUserInfo(CSPGUID);
    end;
    //else ShellExec ('', ExpandConstant('{srcexe}\SetupR.exe'), '','', SW_SHOWNORMAL, ewNoWait, ErrorCode);
    end;
    end;
     
  2. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    725
    Симпатии:
    454
    Может потому и не скачивает что:
    Снимок.JPG
    ?
     
  3. Новичок

    Регистрация:
    4 фев 2018
    Сообщения:
    16
    Симпатии:
    0
    Пол:
    Мужской
    До этого проходит авторизация :

    Код (Text):


    // Первый параметр что ищем, второй параметр где ищем, третий - индекс, начиная с какого ищем.
    function PosEx(Find_s: String; FullString: String; Find_Value: integer): Integer;
    var
    TempFullString : String;
    begin
    if Find_Value = 1 then result := Pos(Find_s, FullString);
    if Find_Value > 1 then
            begin
                TempFullString := Copy(FullString, Find_Value, Length(FullString) - Find_Value + 1);
                result := Find_Value + Pos(Find_s, TempFullString);
            end;
    end;

    function InternetSetCookieEx(lpszUrl: String; lpszCookieName: String; lpszCookieData: String; dwFlags: DWORD; dwReserved: DWORD): DWORD;
    external 'InternetSetCookieEx{#A}@Wininet.dll stdcall';

    function IESetProtectedModeCookie(lpszUrl: String; lpszCookieName: String; lpszCookieData: String; dwFlags: DWORD): DWORD;
    external 'IESetProtectedModeCookie@Ieframe.dll stdcall';

    function InternetGetCookie(lpszUrl: String; lpszCookieName: String; lpszCookieData: array of char; var lpdwSize: DWORD): Boolean;
    external 'InternetGetCookie{#A}@Wininet.dll stdcall';

    function InternetSetCookie(lpszUrl: String; lpszCookieName: String; lpszCookieData: String): Boolean;
    external 'InternetSetCookie{#A}@Wininet.dll stdcall';

    function InternetClearAllPerSiteCookieDecisions(): Boolean;
    external 'InternetClearAllPerSiteCookieDecisions@Wininet.dll stdcall';

    const
    INTERNET_COOKIE_HTTPONLY = $00002000;
    INTERNET_FLAG_RESTRICTED_ZONE = $00020000;
    INTERNET_COOKIE_THIRD_PARTY =$10;
    ERROR_INSUFFICIENT_BUFFER = $8007007a;
    INTERNET_COOKIE_EVALUATE_P3P = $00000040;
    COOKIE_STATE_REJECT = 4;
    HTTPREQUEST_PROXYSETTING_PRECONFIG = 0;


    UNINITIALIZED = 0;
    LOADING = 1;
    LOADED = 2;
    INTERACTIVE = 3;
    COMPLETED = 4;

    procedure InstallCryptoPro();
    var
    WinHttpReq: Variant;
    Cookie, s_Cookie : String;
    s_responseText : String;
    SendRequest: String;
    FindID, FindVal1, FindVal2: Integer;
    I : integer;
    URlCookieGet : array of char;
    URlCookieGetString : string;
    Cookie_buff : DWORD;
    GetStatus : longint;
    Msg: TMsg;
    begin

    try
        WinHttpReq := CreateOleObject('Msxml2.XMLHTTP.6.0'); // Используемый объект - поддерживает прокси ИЕ по умолчанию.
        except
        Log('Ошибка создания объекта Msxml2.XMLHTTP.6.0');
        exit;
        end;
    try
          Cookie := 'Old cookie; Expires=Fri, 30-Oct-1998 14:19:41 GMT';
          login := Edit.Text;
          password := Edit1.Text;
          LicenseTextCSP := '';
          URlsiteCookie := 'https://www.cryptopro.ru/';
          URlNameCookie := ''//'SESSf6648e605a04182cadbeb592605c858e';
          URlCookie := '';
          Cookie_buff := 0;

        ProgressPage.ProgressBar.Style := npbstNormal;
        ProgressPage.Show;
        ProgressPage.ProgressBar.Show;
        ProgressPage.SetProgress(0, 100);
        try
          ProgressPage.SetProgress(1, 100);
          ProgressPage.Msg1Label.Caption := 'Подготовка...';
          ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
          ExecAsOriginalUser('RunDLL32.exe', 'inetcpl.cpl,ClearMyTracksByProcess 2', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode);  // Чистка куки, без нее, после первой же успешной авторизации, скачивание будет работать с любым л и п, пока не удаляться перзистент куки.
          //InternetGetCookie(URlsiteCookie, URlNameCookie, URlCookie, 255);  
          //MsgBox(URlCookie, mbInformation, MB_OK)
          //InternetGetCookieEx(URlsiteCookie, URlNameCookie, URlCookieGet, Cookie_buff);
          //MsgBox('Cookie_buff ' + inttostr(Cookie_buff), mbInformation, MB_OK);
          //SetArrayLength(URlCookieGet, 255);
          InternetClearAllPerSiteCookieDecisions();

          if InternetGetCookie(URlsiteCookie, URlNameCookie, URlCookieGet, Cookie_buff) then
          begin
          SetArrayLength(URlCookieGet, Cookie_buff);
          InternetGetCookie(URlsiteCookie, URlNameCookie, URlCookieGet, Cookie_buff);
          end;
          for i := 0 to GetArrayLength(URlCookieGet)-1 do
          URlCookieGetString := URlCookieGetString + URlCookieGet[i];
          URlNameCookie := Copy(URlCookieGetString, 1, Pos('=', URlCookieGetString)-1);

          URlCookie := 'Old cookie; Expires=Fri, 30-Oct-1998 14:19:41 GMT';

          ProgressPage.Msg1Label.Caption := 'Установка соединения с сайтом...';
          ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
          ProgressPage.SetProgress(6, 100);
          // открытие страницы
          WinHttpReq.Open('GET', 'https://www.cryptopro.ru/', true);
          WinHttpReq.SetRequestHeader('Cookie', Cookie);
          WinHttpReq.setRequestHeader('Set-Cookie', Cookie);
          WinHttpReq.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*');
          WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
          WinHttpReq.SetRequestHeader('Accept-Language', 'ru-RU');
          WinHttpReq.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');
          //WinHttpReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate');
          WinHttpReq.SetRequestHeader('Cookie', Cookie);
          WinHttpReq.SetRequestHeader('Connection', 'Keep-Alive');
          WinHttpReq.SetRequestHeader('Host', 'www.cryptopro.ru');
          WinHttpReq.SetRequestHeader('Cache-Control', 'no-cache');
          ProgressPage.SetProgress(7, 100);
          WinHttpReq.Send('');

          i := 8;
          GetStatus := UNINITIALIZED;
          while GetStatus <> COMPLETED do
                begin
                sleep(20);
                if i < 30 then ProgressPage.SetProgress(I, 100);
                if i = 700 then
                    begin
                    WinHttpReq.abort();
                    MessageBox(hWnd, 'Ошибка соединения! Пожалуйста, проверьте состояние подключения к интернету и повторите попытку.', 'Ошибка', MB_OK or MB_ICONINFORMATION);
                    exit;
                    end;
                  i := i + 1;
                  while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
                  begin
                  TranslateMessage(Msg);
                  DispatchMessage(Msg);
                  end;
                GetStatus := WinHttpReq.readyState();
            end;
     
          if WinHttpReq.status = 200 then
            begin
            if WinHttpReq.getResponseHeader('Set-Cookie') <> '' then
            Cookie := WinHttpReq.getResponseHeader('Set-Cookie');
            s_Cookie := Cookie;
                ProgressPage.SetProgress(31, 100);
                s_responseText := WinHttpReq.responseText;
                FindID := Pos('form_build_id', s_responseText); //19
                //MsgBox(inttostr(FindID), mbInformation, MB_OK);
                FindVal1 := PosEx('value', s_responseText, FindID);
                //MsgBox(inttostr(FindVal1), mbInformation, MB_OK);
                FindVal2 := PosEx('/>', s_responseText, FindID);
                //MsgBox(inttostr(FindVal2), mbInformation, MB_OK);  
                SendRequest := 'name=' + login;
                SendRequest := SendRequest + '&pass=' + password;  
                SendRequest := SendRequest + '&op=%D0%92%D1%85%D0%BE%D0%B4';
                SendRequest := SendRequest + '&form_build_id=' + RemoveQuotes(Copy(s_responseText, FindVal1 + 6,FindVal2 - FindVal1 - 9));  
                SendRequest := SendRequest + '&form_id=user_login_block';
                //MsgBox(SendRequest, mbInformation, MB_OK);

                ProgressPage.SetProgress(32, 100);
                ProgressPage.Msg1Label.Caption := 'Авторизация на сайте...';
                ProgressPage.Msg2Label.Caption := 'Пожалуйста подождите...';
                // Отправка ПОСТ запроса для авторизации.. Сам запрос формируется в переменной SendRequest.
                WinHttpReq.Open('POST', 'https://www.cryptopro.ru/main?destination=node%2F258', true);
                WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                WinHttpReq.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*');
                WinHttpReq.SetRequestHeader('Cache-Control', 'no-cache');
                WinHttpReq.SetRequestHeader('Accept-Language', 'ru-RU');
                WinHttpReq.SetRequestHeader('Host', 'www.cryptopro.ru');
                WinHttpReq.SetRequestHeader('Referer', 'https://www.cryptopro.ru/');
                WinHttpReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate');
                WinHttpReq.SetRequestHeader('Content-Length', Length(SendRequest));
                WinHttpReq.SetRequestHeader('Cookie', Cookie);
                ProgressPage.SetProgress(33, 100);
                WinHttpReq.Send(SendRequest);
                i := 34
                GetStatus := UNINITIALIZED;
                while GetStatus <> COMPLETED do
                  begin
                  sleep(20);
                  if i < 40 then ProgressPage.SetProgress(I, 100);
                  if i = 730 then
                      begin
                      WinHttpReq.abort();
                      MessageBox(hWnd, 'Ошибка соединения! Пожалуйста, проверьте состояние подключения к интернету и повторите попытку.', 'Ошибка', MB_OK or MB_ICONERROR);
                      exit;
                      end;
                  i := i + 1;
                    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
                      begin
                      TranslateMessage(Msg);
                      DispatchMessage(Msg);
                      end;
                  GetStatus := WinHttpReq.readyState();
                end;

                if WinHttpReq.status = 200 then
                if WinHttpReq.status = 200 then
                    begin // Проверка логина и пароля.
                    if Pos('это имя пользователя или пароль неверны', WinHttpReq.responseText) <> 0 then
                        begin
                        MessageBox(hWnd, 'Неверный Логин или Пароль. Вводите Логин и Пароль, указанные вами при регистрации на сайте КРИПТОПРО!', 'Ошибка', MB_OK or MB_ICONERROR);  
                        //CheckButton_InstallCSP := true;
                        IESetProtectedModeCookie(URlsiteCookie, URlNameCookie, URlCookie, INTERNET_FLAG_RESTRICTED_ZONE);
                        IESetProtectedModeCookie(URlsiteCookie, URlNameCookie, URlCookie, INTERNET_COOKIE_THIRD_PARTY);
                        InternetSetCookie(URlsiteCookie, URlNameCookie, URlCookie);
                        CoFreeUnusedLibraries();
                        //WizardForm.BackButton.OnClick(WizardForm.BackButton);
                        LicenseTextCSP := '';
                        Exit;
                        end;
                    // Получение лицензионного соглашения
                    WinHttpReq.Open('GET', 'https://www.cryptopro.ru/download?pid=1417', true);
                    WinHttpReq.SetRequestHeader('Accept', 'text/html, application/xhtml+xml, */*');
                    WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                    WinHttpReq.SetRequestHeader('Accept-Language', 'ru-RU');
                    WinHttpReq.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko');
                    //WinHttpReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate');
                    WinHttpReq.SetRequestHeader('Connection', 'Keep-Alive');
                    WinHttpReq.SetRequestHeader('Host', 'www.cryptopro.ru');
                    WinHttpReq.SetRequestHeader('Cache-Control', 'no-cache');
                    WinHttpReq.SetRequestHeader('Cookie', Cookie);
                    WinHttpReq.Send('');
                   
                    i := 41
                    GetStatus := UNINITIALIZED;
                    while GetStatus <> COMPLETED do
                      begin
                        sleep(20);
                        if i < 52 then ProgressPage.SetProgress(I, 100);
                        if i = 740 then
                        begin
                        WinHttpReq.abort();
                        MessageBox(hWnd, 'Ошибка соединения! Пожалуйста, проверьте состояние подключения к интернету и повторите попытку.', 'Ошибка', MB_OK or MB_ICONERROR);
                        exit;
                        end;
                        i := i + 1;
                          while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
                            begin
                            TranslateMessage(Msg);
                            DispatchMessage(Msg);
                            end;
                        GetStatus := WinHttpReq.readyState();
                    end;

                    if WinHttpReq.status  = 200 then
                    begin
                    FindID := Pos('"edit-license-text-wrapper"', WinHttpReq.responseText);
                        if FindID <> 0 then
                          begin
                              FindVal1 := PosEx('ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ', WinHttpReq.responseText, FindID);
                              FindVal2 := PosEx('</textarea>', WinHttpReq.responseText, FindVal1);
                              LicenseTextCSP := Copy(WinHttpReq.responseText, FindVal1 - 1, FindVal2 - FindVal1 - 1);
                              CheckButton_InstallCSP := true;
                              CoFreeUnusedLibraries();
                              //MsgBox(LicenseTextCSP, mbInformation, MB_OK);
                              exit;
                          end else
                          MessageBox(hWnd, 'Ошибка получения визуальной формы сайта https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
                    end else MessageBox(hWnd, 'Ошибка получения визуальной формы сайта https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
                         
              end else MessageBox(hWnd, 'Ошибка авторизации на сайте https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
          end else MessageBox(hWnd, 'Ошибка авторизации на сайте https://www.cryptopro.ru/', 'Ошибка', MB_OK or MB_ICONERROR);
         
          except
          Log('Ошибка функции InstallCryptoPro');
          exit;
          end;
    finally
    ProgressPage.Hide;
    ProgressPage.ProgressBar.Style := npbstMarquee;
    DeleteUrlCacheEntry('https://www.cryptopro.ru/');
    CoFreeUnusedLibraries();
    //WizardForm.BackButton.OnClick(WizardForm.BackButton);
    end;
    end;
     
  4. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.083
    Симпатии:
    711
  5. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    725
    Симпатии:
    454
    А функцию DownloadFile? Я так понимаю именно в ней происходит скачивание?
     
  6. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.083
    Симпатии:
    711
    Krinkels, да, вот тоже самое хотел написать, мол где DownloadFile, но учитывая динамику темы, пятница - понедельник, кинул сразу 2 примера, как говориться примера то 2 ) вообще думаю скорее проблема с регистрацией, просто надо протестировать скачивание, например с того же хоста, а потом прикручивать регистрацию и пытаться скачать криптопро. немного очевидных вещей.
     
  7. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    725
    Симпатии:
    454
    Ну я попробовал второй скрипт, авторизация проходит нормально, так что проблема именно в том куске кода что скачивает, и который автор темы не выложил
     
    sergey3695 нравится это.

Поделиться этой страницей