потоки и indy [delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 1n0y, 23 Apr 2010.

  1. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    уураа! всё работает :)
    спасибаспасиба! :-*
     
  2. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    ребят, это снова я :rolleyes:
    вот функция авторизации, слизана у пухового.
    собстно, в чем проблема: в таком виде куки не сохраняются и не передаются, изменить, скажем http.Response.ContentType внутри функции я тоже не могу :(
    причем, если переменные и функции не делать локальными для потока (ну, тоесть какбэ один поток паралельный главному юзать) - всё отлично работает.
    что я снова сделал не так?


    Code:
      tgo = class(TThread)
      private
       http:TIdHTTP;
       IdCookieManager1:tidcookiemanager;
       compressor : tidCompressorZLib;
       name, pass,s,s2:string;
       post:tstringlist;
     function test_log_vk (name, pass : string) : string;
      protected
        procedure Execute; override;
      end;
    
    function tgo.test_log_vk (name, pass : string) : string;
    begin
      http:=tidhttp.Create;
      http.AllowCookies := True;
      http.HandleRedirects:=false;
      IdCookieManager1 := Tidcookiemanager.Create;
      http.CookieManager:=IdCookieManager1;
      compressor := tIdCompressorZLib.Create;
      http.Compressor := compressor;
      http.Request.AcceptEncoding := 'gzip,deflate';
      http.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)';
      http.ReadTimeout := 10000;
      post:=tstringlist.create;
    
      try
       http.get ('http://vk.com');
      except end;
      post.add ('op=a_login_attempt');
      try
       c:=http.post ('http://vk.com/login.php', post);
      except end;
       if ansipos('captcha_sid',c) <>0 then
        begin
         form1.Memo3.Lines.Add('капча!');
          if form1.CheckBox10.Checked=true then
           synchronize(get_capt_r)
          else
           begin
            synchronize(get_capt_auto);
           end;
         form1.Memo3.Lines.Add('обезьяны разгадали капчу: '+cap);
         post.add ('captcha_sid='+sid);
         post.add ('captcha_key='+cap);
         try
          http.post ('http://vk.com/login.php', post);
         except end;
        end;
      post.Clear;
      post.add ('email=' + name);
      post.add ('pass=' + pass);
      post.add ('expire=');
      post.add ('vk=1');
      try
       s := http.post ('http://login.vk.com/?act=login', post);
      except end;
      post.Clear;
       s2:=copy(s, pos('value=''',s)+7, 56);
      post.Add ('op=slogin');
      post.Add ('redirect=1');
      post.Add ('expire=0');
      post.Add ('to=');
      form1.Label2.caption:=s2;
      post.Add ('s=' + s2);
      try
       http.post ('http://vk.com/login.php', post);
       http.get (http.Response.Location);
      except end;
        if length(http.Response.Location)  = 0 Then
        begin
         result:='ok';
        end
       else
        begin
         result:='no_ok';
        end;
    end;
    
     
  3. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    ну помогите же! :( :( :(
     
  4. Sunstrider

    Sunstrider Banned

    Joined:
    9 Apr 2010
    Messages:
    152
    Likes Received:
    10
    Reputations:
    4
    Это код чекера ?
     
    1 person likes this.
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Это свойство только для чтения, его нет смысла изменять.
    А с куками что-то непонятно, но скорее всего ты намутил с куки менеджером, например создал не тот который нужно. Покажи как ты вызываешь эту фанкшен свою
     
  6. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    дело в том, что если я отправляю капчу на антигейт - оно меняется с application/x-www-form-urlencoded на multipart/form-data и контакт принимать запрос нехочет :(
    ыы, ну как положено - test_log_vk(name,pass);


    ставил бряки на кукименеджер.pas - вроде работает.. нечего не понимаю ;(


    это код авторизации. прикрутить можешь к чему угодно :)
     
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Неправильно. IdHttp.Request.xxxxxx - запрос, IdHttp.Response.xxxxxxxx - ответ
    А ты хочешь контент-тайп у ответа изменить, это бессмыссленнно, тут дело в другом.
    Для антикапчи можно создать другой экземпляр IDHttp.
    А вообще доступ к контент-тайпу запроса можно получить так:
    Http.Request.ContentType, но не Http.Response.ContentType как было у тебя
    Нет, меня интересовал весь код функции в которой ты это делаешь
     
    #27 GhostOnline, 25 Apr 2010
    Last edited: 25 Apr 2010
    1 person likes this.
  8. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    аа, вот в чем дело :) приму к сведению, спасибо

    делаю я это в процедуре tgo.execute;
    беру акк, выполняю функцию test_log_vk, и если ответ ок - продолжаю работу с акком. если ответ no_ok - беру другой акк

    впринцыпе вопрос с куками решен добавлением HTTP.Request.CustomHeaders.Add('Cookie: remixsid=' + sid), но всёже интересно, почему неработает кукименеджер :(
     
  9. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Может обновить инди?
     
  10. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    обновлял вчера. вроде последние индейцы стояли - 10.
    и с одним потоком всё работает, вот вчомдело..
     
  11. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    залей куда нибудь свой код, и модуль с формой тоже!
     
  12. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    PHP:
    procedure tnew.getln;
    var
     
    i,t:integer;
    begin
    t
    :=form1.memo1.lines.count-1;
     for 
    i:=0 to t do
     
    form1.memo2.lines.add(form1.idhttp1.get(form1.memo1.lines[i]));
    end;
    так компактнее и побыстрее, хотя по факту маловажно.
     
    #32 Flame of Soul, 25 Apr 2010
    Last edited: 25 Apr 2010
  13. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    чем объясняется ввод новой переменной t?
     
  14. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Delphi не производит разворачивания циклов, как и вынесение инвариантного кода за пределы цикла. То есть в компиляторе нет как такового оптимизатора, вот я и посчтитала что более рационально будет именно так, потому что метод:

    PHP:
    for i:=0 to memo1.lines.count – 1 do
    будет вызываться в каждой итерации, то есть каждый раз будет подсчитывать количество элементов, а если у нас там элементов несколько тысяч, допустим 2000 строк, собственно не так уж и много, как и посчитать количество их элементов, но так как тип используемый там идет как string а не char и заблогонамеренно неизвестна длина строк, пересчет происходить будет в каждой итерации. Даже если взять что memo1.lines.count было бы постоянным и пересчета не производилось, то в условии у нас стоит математическое выражение memo1.lines.count -1

    ну соответственно чтобы не заставлять вести лишние подсчеты и желательно вынести количество элементов в отдельную переменную, если конечно оно у нас постоянно и не меняется в теле цикла на произвольное, допустим код вида:
    PHP:
    var i:integer;
    begin
      
    for i:=0 to Memo1.Lines.Count-do
        if (
    i mod 2 0then begin memo1.Lines.Add('a'end;
    end;
    во первых доказывает нам что VCL вызывает подсчет в каждой итерации, а во вторых указывает на то что количество элементов в теле цикла при его воздействии на Memo меняется и учитывается, что тоже иногда необходимо. (i mod 2 = 0) использовано только чтобы избежать зацикливания.

    Ну и банально даже то что при инкрементации переменной цикла i на более высокое значение компилятор не использует Флаг нуля (ZF) а просто сравнивает значение с 0. Семантически это не верно, но я не вижу в этом особого греха.
     
    #34 Flame of Soul, 25 Apr 2010
    Last edited: 25 Apr 2010
    1 person likes this.
  15. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    То, использовать второй пример в цикле for не имеет смысла это понятно, но вот насчет введения новой переменной для хранения неизменяемого математического выражения спорно...

    Кстати у компилятора delphi достаточно хороший встроенный оптимизатор
     
  16. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Прошу прощения у модераторов за отход от основной темы.
    ну во первых оно изменяемо, тут я с вами не согласна, можно рассмотреть ситуации когда количество строк велико и у нас автоперенос по ширене строк, тогда при изменении размеров формы количество строк изменится и цикл закончится в тот момент когда первый раз условие будет нарушено, однако при выносе в переменную - этот фактор не повлияет и количество строк уже не будет совпадать с тем что в переменно, что собственно и может вызвать сбой в программе.

    Во вторых, программа не застрахована от посылке сообщений из вне, так как Memo тоже имеет handle что означает что количество строк в ней может измениться если у нас есть пересылка данных с другого потока во время выполнения цикла, а если данных много то и цикл выполняется дискретно,соответственно - порциями которыми выделяет ОС под процесс, ну и что я Вам рассказываю, вы ведь я думаю тоже хороший программист и Сами понимаете это, то есть фактор из вне у нас не повлияет на структуру если count будет считаться в каждой итерации.

    Однако если вынести за переменную то мы можем схлопотать 2 эксепшена на основании чего можно заключить то что есть возможность внедрения эксплойта в систему, однако для посылке сообщения у нас естественно должны быть соответствующие права. Не могу так сказать на вскидку насколько серьезная это погрешность но факт того что она есть радует.

    Ну и IDA Pro Free совершенно бесплатна как и Оленька, так что отладчик и проверяйте))). А по поводу того что в дельфинчике довольна хороший оптимизатор, не спорю так и есть, но люблю я эту IDE и компилятор не за это)
     
    1 person likes this.
  17. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    нет, у меня по условию в мемо во время проверки нечего не дописывается\удаляется. но за внимание - спасибо :)