1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.

Пишем ICQ-автоответчик (редиректор сообщений)

  1. Так вот, может это банально и уже повсюду обсуждалось, но все таки решил написать понятный FAQ по написанию простейших ICQ ботов на Delphi с использованием TICQClient'а.

    Так вот, для начала открываем делфи, создаем новый проект и кидаем на него компонент "TICQCLient" (у кого он не установлен, качаем с сайта и ставим. Можно брать самую новую версию 1.35, но я пока остановился на версии 1.34)

    Меняем значение Caption формы на что-нибудь осмысленное, например "ICQ автоответчик" и придаем ей свойства:

    [​IMG]

    (это не влияет на работу программы, просто оформление окна будет точным и у нас ничего не "поедет".

    Теперь самое главное - кидаем на форму компоненты:

    [​IMG]

    3 едита (в данном случае labeledEdit с вкладки Additional)
    2 баттона (с владки Standart берем "Button")
    1 мемо (с вкладки Standart)
    TICQClient.

    Так, с расположением определились, переходим к написанию кода.

    Для начала обозначим имя TICQClient'у, чтобы постоянно не переписывать его название, делается это в глобальном варе, т.е здесь:

    PHP:
    var
      
    Form1TForm1;
      
    ICQTICQClient;
    Теперь создадим процедуру подключения, назовем её "Connect"

    PHP:
    procedure Connect;
     
    begin
      ICQ
    .UIN := StrToInt(Form1.LabeledEdit1.Text);
      
    ICQ.Password := Form1.LabeledEdit2.Text;
      
    ICQ.ConvertToPlaintext := True;
      
    ICQ.SetAuthorization(FalseTrue);
      
    ICQ.MaskIntoQIP($08000907);
      
    ICQ.Login();
     
    end;
    (Написание этой части кода делаем прямо после:

    PHP:
    implementation

    {$R *.dfm}
    )

    Теперь на кнопку "Подключить" вешаем саму процедуру подключения, для этого:

    Щелкаем двойным щелчком по кнопке "Подключить" и в обработчике событий между begin и end вставляем наш код. Выглядеть это будет так:

    PHP:
    procedure TForm1.Button1Click(SenderTObject);
    begin
    Connect
    ;
    end;
    (т.е между begin и end вставляем Connect; )

    Теперь тоже самое с кнопкой "Отключить". Лвойным щелчком и прописываем:

    PHP:
    procedure TForm1.sButton2Click(SenderTObject);
    begin
     ICQ
    .Disconnect;
    end;
    А чтобы нам наиболее было понятно, в сети ли номер и что с ним происходит, мы сделаем обработку сообщений от сервера! для этого:

    Кидаем на форму еще одно Memo (в данном случае получится Memo2) Именно в нем мы будем видеть, что наш номер в сети.

    Теперь в процедуре создания формы (щелкаем два раза по пустому месту на форме, откроется обработчик FormCreate. В нем между begin и end пишем:

    ICQ := TICQClient.Create(nil);
    ICQ.OnLogin := ICQLogin;

    т.е полностью это будет выглядеть так:

    PHP:
    procedure TForm1.FormCreate(SenderTObject);
     
    begin
     ICQ 
    := TICQClient.Create(nil);
      
    ICQ.OnLogin := ICQLogin;
     
    end;
    и в type дописываем:

    PHP:
    procedure ICQLogin(SenderTObject);
    Теперь создаем процедуру, подобно "Connect", пишем её ниже его в таком виде:

    PHP:
    procedure TForm1.ICQLogin(SenderTObject);
     
    begin
     Form1
    .Memo2.Lines.Add('['+TimeToStr(Time)+'] Успешное подключение!');
    end;
    Теперь для теста компилируем проект. Если вы все сделали так, как я говорил, то у вас все запустится :)

    В итоге вот, что получилось:

    [​IMG] :D

    И так, бота полностью дописал, как положено, даже задержку поставил, чтобы номер не выбивало, причем по уму.

    [​IMG]

    Весь код программы вот:

    PHP:
    unit Unit1;

    interface

    uses
      Windows
    MessagesSysUtilsVariantsClassesGraphicsControlsForms,
      
    DialogsStdCtrlsExtCtrlsICQClient;

    type
      TForm1 
    = class(TForm)
        
    ICQClient1TICQClient;
        
    GroupBox1TGroupBox;
        
    LabeledEdit1TLabeledEdit;
        
    LabeledEdit2TLabeledEdit;
        
    Button1TButton;
        
    Button2TButton;
        
    Timer1TTimer;
        
    GroupBox2TGroupBox;
        
    GroupBox3TGroupBox;
        
    Memo2TMemo;
        
    LabeledEdit4TLabeledEdit;
        
    GroupBox4TGroupBox;
        
    Memo1TMemo;
        
    LabeledEdit3TLabeledEdit;
        
    GroupBox5TGroupBox;
        
    Memo3TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure FormCreate(SenderTObject);
        
    procedure ICQLogin(SenderTObject);
        
    procedure Button2Click(SenderTObject);
        
    procedure ICQMessage(SenderTObjectMsgUINstring);
        
    procedure Timer1Timer(SenderTObject);
      private
        { Private 
    declarations }
      public
        { Public 
    declarations }
      
    end;

    var
      
    Form1TForm1;
      
    ICQ TICQClient;
      
    MessageTStringList;

    implementation

    {$R *.dfm}

    procedure Connect;
     
    begin
      ICQ
    .UIN := StrToInt(Form1.LabeledEdit1.Text);
      
    ICQ.Password := Form1.LabeledEdit2.Text;
      
    ICQ.ConvertToPlaintext := True;
      
    ICQ.SetAuthorization(FalseTrue);
      
    ICQ.MaskIntoQIP($08000907);
      
    ICQ.Login();
     
    end;

     
    procedure TForm1.ICQMessage(SenderTObjectMsgUINstring);
    begin
      Form1
    .Memo3.Lines.Add('['+TimeToStr(Time)+']' ' ' + (UIN) + ': ' +Msg);
      
    Message.Add(UIN+'='+Msg);
    end;

    procedure TForm1.ICQLogin(SenderTObject);
     
    begin
     Form1
    .Memo2.Lines.Add('['+TimeToStr(Time)+'] Успешное подключение!');
     
    Button2.Enabled:=True;
    end;

    procedure TForm1.Timer1Timer(SenderTObject);
    var
    uinmsgstring;
    begin
    Timer1
    .Interval:=StrToInt(LabeledEdit4.Text);
    if 
    Message.Count>0 then begin
    UIN
    :=copy(Message.strings[0],1,pos('=',Message.strings[0])-1);
    Msg:=copy(Message.strings[0],pos('=',Message.strings[0])+1,length(Message.strings[0]));
    Message.Delete(0);
    ICQ.SendMessage(StrToInt(UIN),Form1.Memo1.Lines.Text);
    ICQ.SendMessage(StrToInt(Form1.LabeledEdit3.Text), 'Входящее сообщение от UIN: ' +UIN #10#13 + 'Сообщение: ' + Msg);
    end;
    end;

    procedure TForm1.Button1Click(SenderTObject);
    begin
    Connect
    ;
    Button1.Enabled:=False;
    Timer1.Enabled:=True;
    end;

    procedure TForm1.Button2Click(SenderTObject);
    begin
    ICQ
    .Disconnect;
    Button1.Enabled:=True;
    Button2.Enabled:=False;
    Form1.Memo2.Lines.Add('['+TimeToStr(Time)+'] Отключено! :)');
    end;

    procedure TForm1.FormCreate(SenderTObject);
     
    begin
      ICQ 
    := TICQClient.Create(nil);
      
    ICQ.OnLogin := ICQLogin;
      
    ICQ.OnMessageRecv := ICQMessage;
      
    Message:=TstringList.Create;
      
    Button2.Enabled:=False;
      
    Timer1.Enabled:=False;
     
    end;

    end.
    Проще, как говорится - не бывает! Объяснять и расписывать просто уже лень - много пистаь придется, по исходнику все будет понятно!)

    Исходник


    ©sks, uinsell.net
     
  2. Код отвратительный)

    Автору нужно поставить кол по информатике :)