ребят, это снова я вот функция авторизации, слизана у пухового. собстно, в чем проблема: в таком виде куки не сохраняются и не передаются, изменить, скажем 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;
Это свойство только для чтения, его нет смысла изменять. А с куками что-то непонятно, но скорее всего ты намутил с куки менеджером, например создал не тот который нужно. Покажи как ты вызываешь эту фанкшен свою
дело в том, что если я отправляю капчу на антигейт - оно меняется с application/x-www-form-urlencoded на multipart/form-data и контакт принимать запрос нехочет ыы, ну как положено - test_log_vk(name,pass); ставил бряки на кукименеджер.pas - вроде работает.. нечего не понимаю ;( это код авторизации. прикрутить можешь к чему угодно
Неправильно. IdHttp.Request.xxxxxx - запрос, IdHttp.Response.xxxxxxxx - ответ А ты хочешь контент-тайп у ответа изменить, это бессмыссленнно, тут дело в другом. Для антикапчи можно создать другой экземпляр IDHttp. А вообще доступ к контент-тайпу запроса можно получить так: Http.Request.ContentType, но не Http.Response.ContentType как было у тебя Нет, меня интересовал весь код функции в которой ты это делаешь
аа, вот в чем дело приму к сведению, спасибо делаю я это в процедуре tgo.execute; беру акк, выполняю функцию test_log_vk, и если ответ ок - продолжаю работу с акком. если ответ no_ok - беру другой акк впринцыпе вопрос с куками решен добавлением HTTP.Request.CustomHeaders.Add('Cookie: remixsid=' + sid), но всёже интересно, почему неработает кукименеджер
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; так компактнее и побыстрее, хотя по факту маловажно.
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-1 do if (i mod 2 = 0) then begin memo1.Lines.Add('a') end; end; во первых доказывает нам что VCL вызывает подсчет в каждой итерации, а во вторых указывает на то что количество элементов в теле цикла при его воздействии на Memo меняется и учитывается, что тоже иногда необходимо. (i mod 2 = 0) использовано только чтобы избежать зацикливания. Ну и банально даже то что при инкрементации переменной цикла i на более высокое значение компилятор не использует Флаг нуля (ZF) а просто сравнивает значение с 0. Семантически это не верно, но я не вижу в этом особого греха.
То, использовать второй пример в цикле for не имеет смысла это понятно, но вот насчет введения новой переменной для хранения неизменяемого математического выражения спорно... Кстати у компилятора delphi достаточно хороший встроенный оптимизатор
Прошу прощения у модераторов за отход от основной темы. ну во первых оно изменяемо, тут я с вами не согласна, можно рассмотреть ситуации когда количество строк велико и у нас автоперенос по ширене строк, тогда при изменении размеров формы количество строк изменится и цикл закончится в тот момент когда первый раз условие будет нарушено, однако при выносе в переменную - этот фактор не повлияет и количество строк уже не будет совпадать с тем что в переменно, что собственно и может вызвать сбой в программе. Во вторых, программа не застрахована от посылке сообщений из вне, так как Memo тоже имеет handle что означает что количество строк в ней может измениться если у нас есть пересылка данных с другого потока во время выполнения цикла, а если данных много то и цикл выполняется дискретно,соответственно - порциями которыми выделяет ОС под процесс, ну и что я Вам рассказываю, вы ведь я думаю тоже хороший программист и Сами понимаете это, то есть фактор из вне у нас не повлияет на структуру если count будет считаться в каждой итерации. Однако если вынести за переменную то мы можем схлопотать 2 эксепшена на основании чего можно заключить то что есть возможность внедрения эксплойта в систему, однако для посылке сообщения у нас естественно должны быть соответствующие права. Не могу так сказать на вскидку насколько серьезная это погрешность но факт того что она есть радует. Ну и IDA Pro Free совершенно бесплатна как и Оленька, так что отладчик и проверяйте))). А по поводу того что в дельфинчике довольна хороший оптимизатор, не спорю так и есть, но люблю я эту IDE и компилятор не за это)
нет, у меня по условию в мемо во время проверки нечего не дописывается\удаляется. но за внимание - спасибо