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

Эмиль

Новичок
Добрый день. Раньше работал данный скрипт, который скачивал с сайта КРИПТО-ПРО нужную версию. Сейчас, почему то этого не происходит. Ссылка 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;
 

Эмиль

Новичок
До этого проходит авторизация :

Код:
// Первый параметр что ищем, второй параметр где ищем, третий - индекс, начиная с какого ищем.
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;
 

Krinkels

Он где то тут
Администратор
А функцию DownloadFile? Я так понимаю именно в ней происходит скачивание?
 

sergey3695

Ветеран
Модератор
Krinkels, да, вот тоже самое хотел написать, мол где DownloadFile, но учитывая динамику темы, пятница - понедельник, кинул сразу 2 примера, как говориться примера то 2 ) вообще думаю скорее проблема с регистрацией, просто надо протестировать скачивание, например с того же хоста, а потом прикручивать регистрацию и пытаться скачать криптопро. немного очевидных вещей.
 

Krinkels

Он где то тут
Администратор
скорее проблема с регистрацией
Ну я попробовал второй скрипт, авторизация проходит нормально, так что проблема именно в том куске кода что скачивает, и который автор темы не выложил
 
Сверху