Delphi массовая отправка сообщений в VK

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Amd64, 8 Jul 2012.

  1. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Хотел написать небольшого спам бота,вводим диапазон ID,и по нему будут рассылаться сообщения,например:
    начальный ID 1 , а конечный 10: в этом интервале от 1 до 10 будут рассылаться сообщения.

    Как я понял,то без доп потока здесь не обойтись,т.к без него программа намертво виснет.Но с потоком вообще ничего не происходит.Или я его не правильно сделал,или не знаю...

    Это исходник с кнопкой(при нажатии должна начаться рассылка)

    Это исходник с самим потоком
     
    #1 Amd64, 8 Jul 2012
    Last edited: 8 Jul 2012
  2. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    917
    Likes Received:
    492
    Reputations:
    724
    А где куки?
     
    _________________________
  3. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    На форме,в которой происходит авторизация,лежит компонент IdcookieManager.
    Сообщение отправляется,но без потока всё виснет,а с потоком вообще не хочет работать.
     
  4. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    IdAntiFreeze
     
  5. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Кинул,прога не виснет,но и ничего не отравляется...Ничего не происходит.
     
  6. 2echnoman

    2echnoman New Member

    Joined:
    3 Jul 2012
    Messages:
    54
    Likes Received:
    0
    Reputations:
    0
    Ну сначала нужно залогиниться в Vk под свой учеткой, а затем рассылать сообщения. Но в коде твоего потока этого нету.
     
  7. vsmake

    vsmake New Member

    Joined:
    18 Jun 2012
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    А толку? Вк лимит сообщений 20 , нужно много аккаунтов.
     
  8. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Ты такой наивный, думаешь, что просто так без авторизации можно отправить сообщение? :eek:
     
  9. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Да вы что?А то я не знал что нужно залогиниться!Авторизация есть.
    Тема всё еще актуальна.
     
  10. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Выложи сорцы в теме в теге code, а то качать не хочется, да и на работе linux, в делфи всё равно не залезть, только так же в gedit-е читать.
     
  11. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Там качать ничего не надо,а просто ссылку открыть)
    Вот:

    PHP:
    unit Unit3;
         
        interface
         
        
    uses
          Windows
    MessagesSysUtilsVariantsClassesGraphicsControlsForms,
          
    DialogsStdCtrls;
         
        
    type
          TForm3 
    = class(TForm)
            
    Button1TButton;
            
    GroupBox2TGroupBox;
            
    IDNumberTEdit;
            
    toIDNumberTEdit;
            
    Label1TLabel;
            
    Label2TLabel;
            
    GroupBox1TGroupBox;
            
    Memo1TMemo;
            
    procedure Button1Click(SenderTObject);
          private
            { Private 
    declarations }
          public
            { Public 
    declarations }
          
    end;
         
        var
          
    Form3TForm3;
         
        
    implementation
         
        uses Unit1
    ,Unit4;
         
        {
    $R *.dfm}
        function 
    UrlEncode(const sAnsiString): string;
        var
          
    Iinteger;
        
    begin
          Result 
    := '';
          for 
    := 1 to Length(S) do
            case 
    S[iof
              
    '%'' ''&''=''@''.'#13, #10, #128..#255: Result := Result + '%'
                
    IntToHex(Ord(S[i]), 2);
            else
              
    Result := Result S[i];
            
    end;
        
    end;
         
        
    procedure TForm3.Button1Click(SenderTObject);
        var
          
    NewThreadTNewThread;
        
    begin
          NewThread
    :=TNewThread.Create(true);
          
    NewThread.FreeOnTerminate:=true;
          
    NewThread.Priority:=tpLower;
          
    NewThread.Resume;
        
    end;
         
         
        
    end.
    Теперь сам поток

    PHP:

    unit Unit4
    ;
         
        interface
         
        
    uses
          Windows
    MessagesSysUtilsVariantsClassesGraphicsControlsForms,
          
    DialogsStdCtrlsExtCtrls;
         
        
    type
          TNewThread 
    = class(TThread)
          private
            { Private 
    declarations }
          protected
            
    procedure Executeoverride;
          
    end;
         
         
        
    implementation
         
        uses Unit1
    ,Unit3;
         
         
         function 
    UrlEncode(const sAnsiString): string;
        var
          
    Iinteger;
        
    begin
          Result 
    := '';
          for 
    := 1 to Length(S) do
            case 
    S[iof
              
    '%'' ''&''=''@''.'#13, #10, #128..#255: Result := Result + '%'
                
    IntToHex(Ord(S[i]), 2);
            else
              
    Result := Result S[i];
            
    end;
        
    end;
         
         
        
    procedure TNewThread.Execute;
        var
        
    Memo1:TMemo;
        
    IDNumber,toIDNumber:Tedit;
        
    s,hash,ConnectToGroup:string;
        
    LengthID,IDNumber1,toIDNumber1:integer;
          
    begin
            
    //IDNumber1:=StrToInt(IDNumber.Text);//начальное ID юзера
            //toIDNumber1:=StrToInt(toIDNumber.Text);//конечное ID юзера
             
    form1.Memo1.Clear;
           while 
    IDNumber1 <= toIDNumber1 do
            
    begin
            IDNumber1
    :=StrToInt(IDNumber.Text);//начальное ID юзера
            
    toIDNumber1:=StrToInt(toIDNumber.Text);//конечное ID юзера
            
    LengthID:=Length(IDNumber.Text);//длина ID - необходим,чтобы спрасить hash
            
    S:=form1.IdHTTP1.get('http://vk.com/im?sel='+IntToStr(IDNumber1) );
            
    hash:=Copy(SPos('IM.deleteDialog('+IntToStr(IDNumber1), S)+16+LengthID+318);//получаем hash
             
    if Pos('Отправить',S)<>0 then
            begin
             form1
    .IdHTTP1.get('http://vk.com/im?sel='+IntToStr(IDNumber1)+'&act=a_send&al=1&hash='+hash+'&media=&msg='+UrlEncode(ansitoutf8(Memo1.Text))+'&title=&to='+IntToStr(IDNumber1));
             
    form1.Memo1.Lines.Add('Сообщение отправленно юзеру'+IntToStr(IDNumber1));
             
    IDNumber1:=IDNumber1+1;
            
    end
             
    else
             
    begin
              form1
    .Memo1.Lines.Add('Ошбика!Сообщение не отправленно юзеру'+IntToStr(IDNumber1));
             
    IDNumber1:=IDNumber1+1;
         
             
    end;
         
            
    end;
          try
          
    form1.IdHTTP1.Disconnect;
        
    except
        end
    ;
        
    end;
         
         
        
    end.






     
  12. КOT

    КOT Banned

    Joined:
    14 Jun 2012
    Messages:
    26
    Likes Received:
    6
    Reputations:
    2
    я нашел ошибку в твоем коде!
    Code:
    Ошбика!Сообщение не отправленно юзеру
    исправь
    Code:
    Ошибка! Сообщение не отправлено юзеру
    вот в чем борода!!11
     
    1 person likes this.
  13. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Хватит уже троллить((
     
  14. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    убери поток наxуй, оформи все нормально в виде процедур.
     
  15. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Не помогло...что я не так сделал?Поток убрал,когда жму на кнопку запуска спама,то ничего не происходит.

    PHP:
    unit Unit3;

    interface

    uses
      Windows
    MessagesSysUtilsVariantsClassesGraphicsControlsForms,
      
    DialogsStdCtrlsIdBaseComponentIdAntiFreezeBaseIdAntiFreeze;

    type
      TForm3 
    = class(TForm)
        
    Button1TButton;
        
    GroupBox2TGroupBox;
        
    IDNumberTEdit;
        
    toIDNumberTEdit;
        
    Label1TLabel;
        
    Label2TLabel;
        
    GroupBox1TGroupBox;
        
    Memo1TMemo;
        
    IdAntiFreeze1TIdAntiFreeze;
        
    procedure Button1Click(SenderTObject);
      private
        { Private 
    declarations }
      public
        { Public 
    declarations }
      
    end;

    var
      
    Form3TForm3;
    s,hash,ConnectToGroup:string;
    LengthID,IDNumber1,toIDNumber1:integer;
    Memo1TMemo;
    IDNumber,toIDNumberTEdit;

    implementation

    uses Unit1
    ;

    {
    $R *.dfm}
    function 
    UrlEncode(const sAnsiString): string;
    var
      
    Iinteger;
    begin
      Result 
    := '';
      for 
    := 1 to Length(S) do
        case 
    S[iof
          
    '%'' ''&''=''@''.'#13, #10, #128..#255: Result := Result + '%'
            
    IntToHex(Ord(S[i]), 2);
        else
          
    Result := Result S[i];
        
    end;
    end;
    procedure send;
    begin
    form1
    .IdHTTP1.get('http://vk.com/im?sel='+IntToStr(IDNumber1)+'&act=a_send&al=1&hash='+hash+'&media=&msg='+UrlEncode(ansitoutf8(Memo1.Text))+'&title=&to='+IntToStr(IDNumber1));
    form1.Memo1.Lines.Add('Сообщение отправленно юзеру'+IntToStr(IDNumber1));
    IDNumber1:=IDNumber1+1;
     
    sleep(5000);
    end;

    procedure get_hash;
    begin
    LengthID
    :=Length(IDNumber.Text);//длина ID - необходим,чтобы спрасить hash
    S:=form1.IdHTTP1.get('http://vk.com/im?sel='+IntToStr(IDNumber1) );
    hash:=Copy(SPos('IM.deleteDialog('+IntToStr(IDNumber1), S)+16+LengthID+318);
     
    end;

    procedure send_Err;
    begin
    form1
    .Memo1.Lines.Add('Ошбика!Сообщение не отправленно юзеру'+IntToStr(IDNumber1));
    IDNumber1:=IDNumber1+1;
    sleep(5000);
    end;

    procedure TForm3.Button1Click(SenderTObject);
    begin
         IDNumber1
    :=StrToInt(IDNumber.Text);//начальное ID юзера
        
    toIDNumber1:=StrToInt(toIDNumber.Text);//конечное ID юзера
         
    form1.Memo1.Clear;
       while 
    IDNumber1 <= toIDNumber1 do
        
    get_hash;
         if 
    Pos('Отправить',S)<>0 then send
         
    else
          
    send_Err;

      try
      
    form1.IdHTTP1.Disconnect;
    except
    end
    ;
    end;





     
    #15 Amd64, 9 Jul 2012
    Last edited: 9 Jul 2012
  16. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Amd64, иди учи циклы:
    Code:
    	while IDNumber1 <= toIDNumber1 do get_hash;
    	if Pos('Отправить',S)<>0 then send else send_Err;
    
     
  17. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    А что там с циклом не так?
     
  18. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Code:
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    	....
    	// вызываем в цикле процу get_hash n раз
    	while IDNumber1 <= toIDNumber1 do get_hash;
    	
    	// после цикла ищем "Отправить" в переменной S
    	if Pos('Отправить', S)<>0 then 
    		// и если находим делаем send
    		send else send_Err;
    	...
    end; 
    
     
  19. 2echnoman

    2echnoman New Member

    Joined:
    3 Jul 2012
    Messages:
    54
    Likes Received:
    0
    Reputations:
    0
    Ну блин приведи хоть кусок кода, где она происходит, а то сколько смотрю не могу найти.
     
  20. Amd64

    Amd64 New Member

    Joined:
    10 Jan 2011
    Messages:
    24
    Likes Received:
    2
    Reputations:
    0
    Так у меня же тоже самое было,почти...Сделал как ты показал-ничего не изменилось.

    Авторизация.Находится на форме unit1.
    PHP:
    procedure TForm1.AuthAllClick(SenderTObject);
    var
     
    PageProfile:string;
     
    begin
       
    if login.Text='' then messagebox(0,'Введите ваш E-mail','Vk_Infromer',MB_OK or MB_ICONINFORMATION)
       else
          if 
    pass.Text='' then messagebox(0,'Введите пароль!','Vk_Infromer',MB_OK or MB_ICONINFORMATION)
          else
     
    begin
      TidCookieManager
    .Create(IdHTTP1);
       
    IdHTTP1.Request.Host:='http://vk.com';
       
    IdHTTP1.Request.UserAgent:='Mozila/5.0 (Windows; U; Windows NT 5.1; com; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
       
    IdHTTP1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
       
    IdHTTP1.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
       
    IdHTTP1.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
       
    IdHTTP1.AllowCookies:=true;
       
    IdHTTP1.HandleRedirects:=true;
    try
      
    PageProfile:=IdHTTP1.get('http://vkontakte.ru/login.php?email='+login.Text+'&pass='+pass.Text);
    except
    end
    ;
     if 
    Pos('logout'PageProfile)<>0 then
         begin
          messagebox
    (0,'Авторизация прошла успешно!','Vk_Spamer',MB_OK or MB_ICONINFORMATION);
         
    end
     
    else
       
    begin
        messagebox
    (0,'Авторизация не удалась!Попробуйте снова.','Vk_Spamer|Ошибка!',MB_OK or MB_ICONERROR);
       
    end;
     
    end;
       
    end;




    Все Unit я подключил между собой.
     
    #20 Amd64, 9 Jul 2012
    Last edited: 9 Jul 2012