• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Авторизация На Сайте Joomla 3

triamera977

Homo habilis
Принятый Кодер
Регистрация
27 Апр 2015
Сообщения
79
Баллы
60
Сделал авторизацию на сайте под Joomla 3. Авторизация проходит через раз. Подскажите пожалуйста где я накосячил.

Код:
unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, StdCtrls, sLabel, sButton, sEdit, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, ShellAPI,inifiles,
  sCheckBox;

type
  TAvtoriz_Form = class(TForm)
    sEdit1: TsEdit;
    sEdit2: TsEdit;
    sButton1: TsButton;
    sButton2: TsButton;
    sLabel1: TsLabel;
    sLabel2: TsLabel;
    sLabel3: TsLabel;
    sLabel4: TsLabel;
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    sButton3: TsButton;
    sCheckBox1: TsCheckBox;
    procedure sButton2Click(Sender: TObject);
    procedure sButton1Click(Sender: TObject);
    procedure sButton3Click(Sender: TObject);
       procedure sCheckBox1Click(Sender: TObject);
      private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
  tavtoriz = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Avtoriz_Form: TAvtoriz_Form;
  code, token:string;
  avtoriz:tavtoriz;
  myreturn, mycbsecuritym3, my1, bufer: string;
  optin2:TIniFile;

implementation

uses Unit1, Unit2;

{$R *.dfm}

procedure tavtoriz.Execute;
var
stream:TStringList;
str: TStringList;

begin
  try
  Avtoriz_Form.IdHTTP1.Request.AcceptCharSet := 'windows-1251';
  str := TStringList.Create;
  stream:=TStringList.Create;
  myreturn := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login'));
  code:=Avtoriz_Form.IdHTTP1.Post('http://as-1w.ru/cb-profile/login',stream);

  Delete(myreturn, 1, Pos('name="return" value="', myreturn) + 20);
  bufer := myreturn;
  Delete(myreturn, Pos('" />', myreturn), Length(myreturn));
  my1 := bufer;
  Delete(my1, 1, Pos('name=', my1) + 5);
  Delete(my1, Pos('"', my1), Length(my1));
  myreturn := 'return=' + myreturn;
  my1 := my1 + '=1';

  if Pos('"cbsecuritym3"',code)<> 0 then
begin
       token:=Copy(code,Pos('"cbsecuritym3"',code),76);
       Delete(token,1,22);
     Avtoriz_Form.Memo1.Lines.Add('cbsecuritym3='+token);

  // ---------------------------------------------------------------------------------
 
  str.Add('username=' + Avtoriz_Form.sEdit1.text);
  str.Add('passwd=' + Avtoriz_Form.sEdit2.text);
  str.Add(myreturn);
  str.Add('cbsecuritym3=' + token);
  str.Add(my1);
  end;

  Avtoriz_Form.IdHTTP1.HandleRedirects:=True;
  bufer := Avtoriz_Form.IdHTTP1.Post('http://as-1w.ru/cb-profile/login', str);
  bufer := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login'));

  if Pos('Выход', bufer) > 1 then
  begin
     ShowMessage('Здорова '+Avtoriz_Form.sEdit1.Text);
   end
  else
  begin
    ShowMessage('Проверьте логин\пароль'); //

end;
except
  on e:Exception  do
  begin

    str.Free;
    stream.Free;
     Exit;
  end;
   end;
      end;

procedure TAvtoriz_Form.sButton2Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TAvtoriz_Form.sButton1Click(Sender: TObject);
begin
avtoriz:=tavtoriz.Create(False);
end;

procedure TAvtoriz_Form.sButton3Click(Sender: TObject);
begin
ShellExecute (Avtoriz_Form.Handle, nil, 'http://as-1w.ru/component/comprofiler/registers', nil, nil, SW_RESTORE);
end;

procedure TAvtoriz_Form.sCheckBox1Click(Sender: TObject);
begin

if sCheckBox1.Checked=true then
begin
  sEdit2.PasswordChar:=#0 ;
end else
begin
sEdit2.PasswordChar:='*' ;
end;
end;


end.
 

Вложения

  • joomla.jpg
    joomla.jpg
    42.3 КБ · Просмотры: 9
Ты пытаешся авторизация повторно 2 раза не освобождая память
Код:
finally
  begin
    str.Free;
    stream.Free;
     Exit;
    end;
      end;
а у тебя стоит когда ошибка вылетает тогда очистить память.
Код:
except
  on e:Exception  do
  begin

    str.Free;
    stream.Free;
     Exit;
  end;
   end;
      end;
 
Попробовал сделать без потока. Авторизируется без проблем, но есть одно НО. Если с начало ввести пароль не правильно, а потом ввести правильный пароль то появляется ошибка.(скрин прилагаю)
Код:
unit Unit6;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sLabel, sButton, sEdit, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP, IdAntiFreezeBase, IdAntiFreeze,ShellAPI,inifiles,
  sCheckBox;

type
  TAvtoriz_Form = class(TForm)
    sEdit1: TsEdit;
    sEdit2: TsEdit;
    sButton1: TsButton;
    sButton2: TsButton;
    sLabel1: TsLabel;
    sLabel2: TsLabel;
    sLabel3: TsLabel;
    sLabel4: TsLabel;
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    sButton3: TsButton;
    sCheckBox1: TsCheckBox;
    procedure sButton2Click(Sender: TObject);
    procedure sButton1Click(Sender: TObject);
    procedure sButton3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure sCheckBox1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Avtoriz_Form: TAvtoriz_Form;
  code, token:string;
  myreturn, mycbsecuritym3, my1, bufer: string;
  optin2:TIniFile;

implementation

uses Unit1, Unit2;

{$R *.dfm}

procedure TAvtoriz_Form.sButton2Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TAvtoriz_Form.sButton1Click(Sender: TObject);
var
stream:TStringList;
str: TStringList;

  // В этих переменных будем хранить те самые пару значений из переловленного запроса.
begin
  optin2.WriteString('Edits','Login',sEdit1.Text);
  optin2.WriteString('Edits','Pass',sEdit2.Text);
  optin2.Free;

  Avtoriz_Form.IdHTTP1.Request.AcceptCharSet := 'windows-1251';
  str := TStringList.Create;
  stream:=TStringList.Create;

    myreturn := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login')); // Отправляем запрос на страницу авторизации
  code:=Avtoriz_Form.IdHTTP1.Post('http://as-1w.ru/cb-profile/login',stream);

  // --Ищем в коде страницы авторизации переменные, которые нам нужно будет отправить. Все те же последнюю и предпоследнюю переменные из перехваченного запроса.
  Delete(myreturn, 1, Pos('name="return" value="', myreturn) + 20);
  bufer := myreturn;
  Delete(myreturn, Pos('" />', myreturn), Length(myreturn));
  my1 := bufer;
  Delete(my1, 1, Pos('name=', my1) + 5);
  Delete(my1, Pos('"', my1), Length(my1));
  myreturn := 'return=' + myreturn;
  my1 := my1 + '=1';


if Pos('"cbsecuritym3"',code)<> 0 then
begin
       token:=Copy(code,Pos('"cbsecuritym3"',code),76);
       Delete(token,1,22);
     Avtoriz_Form.Memo1.Lines.Add('cbsecuritym3='+token);

  // ---------------------------------------------------------------------------------
  // Формируем POST запрос
  str.Add('username=' + Avtoriz_Form.sEdit1.text); // Добавляем в запрос переменную username
  str.Add('passwd=' + Avtoriz_Form.sEdit2.text); // Добавляем в запрос переменную password
  str.Add(myreturn); // Добавляем ранее найденную переменную myreturn
  str.Add('cbsecuritym3=' + token);
  str.Add(my1); // И переменную my1
  end;

  Avtoriz_Form.IdHTTP1.HandleRedirects:=True;
  bufer := Avtoriz_Form.IdHTTP1.Post('http://as-1w.ru/cb-profile/login', str);

  // Сформированный Post запрос отправляем на сервер, адрес мы узнали из перехваченнгого пакета.
  bufer := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login'));
   // Возвращаемся на страницу авторизации
  if Pos('Выход', bufer) > 1 then
  // На странице должна появиться кнопка с надписью "Выход".
  begin

    ShowMessage('Приветствую тебя '+Avtoriz_Form.sEdit1.Text); // Если она есть - все ок
     Avtoriz_Form.Hide;
     Form1.Show;

end
  else
  begin
    ShowMessage('Проверьте Логин/пароль'); // Если не все - то не ок
  str.Destroy;
  stream.Destroy;
end;

end;

procedure TAvtoriz_Form.sButton3Click(Sender: TObject);
begin
ShellExecute (Avtoriz_Form.Handle, nil, 'http://as-1w.ru/component/comprofiler/registers', nil, nil, SW_RESTORE);
end;

procedure TAvtoriz_Form.FormCreate(Sender: TObject);
begin
optin2:=TiniFile.Create(ExtractFilePath(Application.ExeName)+'Option.ini');
sEdit1.Text:= optin2.ReadString('Edits','Login',sEdit1.Text);
  sEdit2.Text:= optin2.ReadString('Edits','Pass',sEdit2.Text);
end;

procedure TAvtoriz_Form.sCheckBox1Click(Sender: TObject);
begin

if sCheckBox1.Checked=true then
begin
  sEdit2.PasswordChar:=#0 ;
end else
begin
sEdit2.PasswordChar:='*' ;
end;
end;

procedure TAvtoriz_Form.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
Form1.Close;
end;

end.
 

Вложения

  • joomla3.jpg
    joomla3.jpg
    26 КБ · Просмотры: 8
Ты пытаешся авторизация повторно 2 раза не освобождая память
Код:
finally
  begin
    str.Free;
    stream.Free;
     Exit;
    end;
      end;
а у тебя стоит когда ошибка вылетает тогда очистить память.
Код:
except
  on e:Exception  do
  begin

    str.Free;
    stream.Free;
     Exit;
  end;
   end;
      end;
Спасибо. А по поводу второй ошибки есть версии?
 

Вложения

  • joomla3.jpg
    joomla3.jpg
    26 КБ · Просмотры: 8
Спасибо. А по поводу второй ошибки есть версии?
Код:
str.Destroy;
  stream.Destroy
может быть так же если вы запускаете в среде делпхи проект.
Дайте саму кнопку авторизации я посмотрю.
Если в потоки не получалось как вы писали выше,может вы поток не уничтожали и сразу же открывали следующий.
 
Код:
str.Destroy;
  stream.Destroy
может быть так же если вы запускаете в среде делпхи проект.
Дайте саму кнопку авторизации я посмотрю.
Если в потоки не получалось как вы писали выше,может вы поток не уничтожали и сразу же открывали следующий.


Код:
procedure TAvtoriz_Form.sButton1Click(Sender: TObject);
var
stream:TStringList;
str: TStringList;

  // В этих переменных будем хранить те самые пару значений из переловленного запроса.
begin
  optin2.WriteString('Edits','Login',sEdit1.Text);
  optin2.WriteString('Edits','Pass',sEdit2.Text);
  optin2.Free;

  Avtoriz_Form.IdHTTP1.Request.AcceptCharSet := 'windows-1251';
  str := TStringList.Create;
  stream:=TStringList.Create;

  myreturn := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login')); // Отправляем запрос на страницу авторизации
  code:=Avtoriz_Form.IdHTTP1.Post('http://as-1w.ru/cb-profile/login',stream);

  // --Ищем в коде страницы авторизации переменные, которые нам нужно будет отправить. Все те же последнюю и предпоследнюю переменные из перехваченного запроса.
  Delete(myreturn, 1, Pos('name="return" value="', myreturn) + 20);
  bufer := myreturn;
  Delete(myreturn, Pos('" />', myreturn), Length(myreturn));
  my1 := bufer;
  Delete(my1, 1, Pos('name=', my1) + 5);
  Delete(my1, Pos('"', my1), Length(my1));
  myreturn := 'return=' + myreturn;
  my1 := my1 + '=1';


if Pos('"cbsecuritym3"',code)<> 0 then
begin
       token:=Copy(code,Pos('"cbsecuritym3"',code),76);
       Delete(token,1,22);
     Avtoriz_Form.Memo1.Lines.Add('cbsecuritym3='+token);

  // ---------------------------------------------------------------------------------
  // Формируем POST запрос
  str.Add('username=' + Avtoriz_Form.sEdit1.text); // Добавляем в запрос переменную username
  str.Add('passwd=' + Avtoriz_Form.sEdit2.text); // Добавляем в запрос переменную password
  str.Add(myreturn); // Добавляем ранее найденную переменную myreturn
  str.Add('cbsecuritym3=' + token);
  str.Add(my1); // И переменную my1
  end;

  Avtoriz_Form.IdHTTP1.HandleRedirects:=True;
  bufer := Avtoriz_Form.IdHTTP1.Post('http://as-1w.ru/cb-profile/login', str);

  // Сформированный Post запрос отправляем на сервер, адрес мы узнали из перехваченнгого пакета.
  bufer := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login'));
   // Возвращаемся на страницу авторизации
  if Pos('Выход', bufer) > 1 then
  // На странице должна появиться кнопка с надписью "Выйти".
  begin


    ShowMessage('Приветствую тебя '+Avtoriz_Form.sEdit1.Text); // Если она есть - все ок
        Avtoriz_Form.Hide;
     Form1.Show;

end
  else
  begin
    ShowMessage('Проверьте Логин/пароль'); // Если не все - то не ок
  str.Destroy;
  stream.Destroy;
end;

end;
 
Попробуйте,создать логическое уравнение,если в edit1.text =пароль или логин пуст,то освобождаем память то есть Free.
 
Тест аккаунт есть чтобы протестировать
 
Код:
bufer := Utf8ToAnsi(Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login'));
убери Utf8ToAnsi
Код:
bufer := Avtoriz_Form.IdHTTP1.Get('http://as-1w.ru/cb-profile/login');
 
Если убрать utf8ToAnsi тогда не будет выполняться условие. Т.к. будет кривая кодировка
Код:
if Pos('Выход', bufer) > 1 then
   begin
    ShowMessage('Приветствую тебя '+Avtoriz_Form.sEdit1.Text); // Если она есть - все ок
     Avtoriz_Form.Hide;
     Form1.Show;
end
  else
  begin
   ShowMessage('Проверьте Логин/пароль'); // Если не все - то не ок
 str.Destroy;
  stream.Destroy;
end;
 
Если убрать utf8ToAnsi тогда не будет выполняться условие. Т.к. будет кривая кодировка
Код:
if Pos('Выход', bufer) > 1 then
   begin
    ShowMessage('Приветствую тебя '+Avtoriz_Form.sEdit1.Text); // Если она есть - все ок
     Avtoriz_Form.Hide;
     Form1.Show;
end
  else
  begin
   ShowMessage('Проверьте Логин/пароль'); // Если не все - то не ок
str.Destroy;
  stream.Destroy;
end;
У меня наоборот вместо русского текста стоят знаки ?????
 
У меня наоборот вместо русского текста стоят знаки ?????
Это наверно потому что ты используешь версию делфи выше чем 7, я когда работал на XE8, то тоже по умолчанию было все в порядке с кодировкой, но на данный момент я работаю с Delphi 7 и тут требуется прописать кодировку. В общем проблему решил с данной ошибкой, всё было банально просто, как всегда подвела меня моя не внимательность
Код:
 optin2.WriteString('Edits','Login',sEdit1.Text);
  optin2.WriteString('Edits','Pass',sEdit2.Text);
  optin2.Free;
вот в этом месте и была ошибка
 
да :(. А в потоке так и не получилось сделать тоже самое.
 
Буду очень признателен
 
Вверх Снизу