Autor Téma: Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???  (Přečteno 8528 krát)

Offline VladaS

  • Příspěvků: 27
  • Karma: 0
    • Verze Delphi: 7
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #30 kdy: 31-08-2013, 14:47:14 »
EDIT: Díky, pomohlo to a to dole napsané už NEPLATÍ !!! (TEmbeddedWB se právě nainstalovat podařilo)

Tím jak jsem si všiml, že v "$(DELPHI)\source\Internet" vůbec nic nemám mi došlo, že "někdo" myslel, že bude Delphi používat jenom "příležitostně"
a šetřil tedy místem na disku - jo jo, někdy se to nevyplatí "šetřit na nesprávném místě", takže teď jdu prozkoumat, co půjde "podniknout" s tím TEmbeddedWB ...  ;)

VCLIE je standardní balíček Delphi už po mnoho let :)

Tak nevím, ale zřejmě tu mám něco "nesdandardně" a potřebuju to (samozřejmě) vyřešit...  ;)

Mám Delphi 7 Enteprise a Windows 8 64 bit (varovalo to samozřejmě, že je to nekompatibilní, ale zatím fungovalo všechno)
dclie70.bpl nemám vůbec a vclie70.bpl jenom v C:\Windows\SysWOW64\ (takže asi z nějakého nainstalovaného programu)
"Internet EExplorer Components" jsem nenašel vůbec a mám jenom WebBrowser a WebBrowser_V1 které jsem si ještě navíc sám přidal do "InternetExpress"
Library path: $(DELPHI)\Lib;$(DELPHI)\Bin;$(DELPHI)\Imports;$(DELPHI)\Projects\Bpl;$(DELPHI)\Rave5\Lib
BPL Output: $(DELPHI)\Projects\Bpl
DCP Output: $(DELPHI)\Projects\Bpl

Browsing Path: $(DELPHI)\source\vcl;$(DELPHI)\Source\Rtl;$(DELPHI)\source\rtl\Corba45;$(DELPHI)\source\rtl\Sys;$(DELPHI)\source\rtl\Win;$(DELPHI)\source\rtl\common;$(DELPHI)\source\Internet;$(DELPHI)\source\clx;$(DELPHI)\source\websnap;$(DELPHI)\Source\WebMidas;$(DELPHI)\Source\Indy;$(DELPHI)\Source\IntraWeb;$(DELPHI)\Source\Samples;$(DELPHI)\Source\Soap;$(DELPHI)\Source\ToolsAPI;$(DELPHI)\Source\Xml

A teď jak vidím to $(DELPHI)\source\Internet tak vidím, že to mám prázdné - že bych to neměl nainstalováno komplet ?
« Poslední změna: 31-08-2013, 15:13:59 od VladaS »

Offline VladaS

  • Příspěvků: 27
  • Karma: 0
    • Verze Delphi: 7
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #31 kdy: 31-08-2013, 18:09:40 »
Synapse u tridy THTTPSend ma property Cookies, coz je seznam stringu, do ktereho automaticky prijate Cookies z hlavicky extrahuje a pokud pouzijes stejnou instanci THTTPSend pro dalsi pozadavek, tak je do hlavicky pozadavku zase automaticky prida, jak ti psal Lukas. Takze pokud by ses prihlasil Synapsi, nemusis se o nic starat.

Takhle je tvym ukolem nekde vydolovat obsah Cookie, sestavit radek Set-Cookie: ..... ve spravnem formatu a pridat ho k radkum v property Cookies.

Tak EmbeddedWB "zradil", sice funguje, ale také trpí tím "zpomalovacím syndromem" jako WebBrowser a kvůli tomu to tu celé vlatně řeším ...  :-\

Zkouším tedy té Synapsi "vnutit cookies" (mám k dospozici textový soubor z MSIE, anebo uložené z Wirescharku ve všech mořných formátech, jenom binární se uložit nepodařilo) a nejjednodušší mi to přijde z toho textového souboru MSIE, tedy jestli je to opravdu možné a alespoň napřed "na zkoušku" a s "momentálně aktuální cookies" po přihlášení pomocí MSIE anebo WebBrovseru.

Tohle je asi blbost (vidím že to má být "seznam stringů" a ne jenom string a navíc do toho "kontrolního Mema" to zřejmě načítá jen poslední 3 řádky i za pomoci "insertu"),
ale jak by prosím tohle tedy šlo "modifikovat" (a co tedy použít v tom "HTTP1.Cookies." aby to bylo správně) a může to tak v Synapsi s tou (právě aktuální) cookies z MSIE vůbec fungovat ??

Anebo načíst 'D:\Cookie_MSIE.txt' třeba do Memo a pak se (jak?) prosím nastaví ty jednostlivé stringy z jednotlivých řádků Mema ?

  HTTP1 := THTTPSend.Create;
  HTTP1.Cookies.LoadFromFile('D:\Cookie_MSIE.txt');
  Memo2.Lines.Insert(0, HTTP1.Cookies.Text);
  HTTP1.HTTPMethod('GET', Memo1.Lines);

Anebo spíš (v principu, jinak samozřejmě načíst ve smyčce) asi nějak takto ?

Memo2.Lines.LoadFromFile('D:\Cookie_MSIE.txt');
HTTP1.Cookies.Insert(1,Memo2.Lines[0]);
HTTP1.Cookies.Insert(2,Memo2.Lines[1]);

Bohužel i když zkusím jen ty 2 řádky, tak to havaruje na "Index List out of bounds (1)"  :-\

Děkuju ...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #32 kdy: 31-08-2013, 20:58:06 »
Bohužel i když zkusím jen ty 2 řádky, tak to havaruje na "Index List out of bounds (1)"  :-\
Ja se tomu ani nedivim, vzdyt prece musis videt, ze ten radek Set-Cookie ma jiny format, nez treba soubor, do ktereho si MSIE cookie zapisuje, ty musis udelat neco takoveho:
Kód: Delphi [Vybrat]
  1. var
  2.    MsieTxtCookie: TStringList;
  3.    SetCookie: string;
  4. begin
  5.     MsieTxtCookie := TStringList.Create;
  6.     try
  7.       MsieTxtCookie.LoadFromFile(....);
  8.       SetCookie := Format('Set-Cookie: %s=%s; Domain=%s; Path=%s; Expires=%s',[
  9.         MsieTxtCookie[...],
  10.         MsieTxtCookie[...],
  11.         MsieTxtCookie[...],
  12.         MsieTxtCookie[...],
  13.      ]);
  14.      HTTPClient.Cookies.Add(SetCookie);
  15.      ...
  16.      HTTPClient.HTTPMethod(....);
  17.      ...
  18.  
tj. v tom prikazu Format musis vytahat vhodne polozky z toho TXT souboru a prevest je do spravneho formatu. Musi z toho vypadnout to, co ti v syrovem tvaru ukazuje WireShark v odpovedi
« Poslední změna: 31-08-2013, 22:08:53 od pf1957 »

Offline VladaS

  • Příspěvků: 27
  • Karma: 0
    • Verze Delphi: 7
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #33 kdy: 01-09-2013, 03:59:07 »
Grrrrrr - tak cookies posílám takto:

      MsieTxtCookie.LoadFromFile('D:\Lide\Cookie.txt');
      SetCookie := Format('Set-Cookie: uhash=%s; ds=%s; last_visited=%s',[
        MsieTxtCookie[0],
        MsieTxtCookie[1],
        MsieTxtCookie[2]

Jsou to jenom ty 3 hodnoty, na každém řádku je v souboru jedna a ve Wiresharku vidím, že to posílám (doufám) stejně, jako prohlížeč,
ale "průšvih" je, že tou Synapsí nejsem i přihlášený, takže vidím "výsledek", že "jsem byl automaticky odhlášen"  :-\

Sice si z butonu dokážu přečíst co to posílá na přihlášení, ale je to přes ten "Seznamácký dialog" a přes ten je už přihlášení trochu složitější a ještě navíc se tím i ten uhash (a i jiné položky) v cookies změní, takže to už "není taková legrace, jak to vypadalo" a nevím, jestli už jsem na tomhle (zatím) "neskončil" ...  :-\

Potřeboval bych to z té Synapse asi nejlépe nějak rozparsovat, abych se přes ni mohl přihlásit "normálně legálně" a i ty cookies aby to potom tedy už (snad) používalo také "normálně" ?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #34 kdy: 01-09-2013, 08:05:50 »
ale "průšvih" je, že tou Synapsí nejsem i přihlášený, takže vidím "výsledek", že "jsem byl automaticky odhlášen"  :-\
Byt prihlaseny Synapsi by melo znamenat, ze na server posles cookies, ve kterych si server zapamatoval, ze byl klient prihlasen. Pokud pri prihlasovani neprobiha zadny dalsi provoz (treba ze by vyzvidali vlastnosti pocitace apod.),  tak uz te mohou odlisit jen podle hlavicky request a ev. nejakeho hidden pole v dotazu.

Takze se podivej WireSharkem, jak se lisi request posilana prihlasenym browserem od te, co posilas Synapsi. Nejpsis to bude polozka User-Agent, tu by bylo vhodne zmenit. V nasem frameworku bych to udelal:
Kód: Delphi [Vybrat]
  1. HTTPClient.HeaderFields['User-Agent'] := Format('%s version %s',[cRobotName,AppEnv.AppVersion]);
  2.  
ale ve standardni Synapsi indexovana property HeaderFields[] neni, to si budes muset naprogramovat (v Headers tj. ve stringlistu nahradit obsah radku, ktery zacina User-Agent: )

Citace
přes ten je už přihlášení trochu složitější a ještě navíc se tím i ten uhash (a i jiné položky) v cookies změní, takže to už "není taková legrace, jak to vypadalo" a nevím, jestli už jsem na tomhle (zatím) "neskončil"
Jestli si nekdo pohral s tim, aby heslo neputovalo po siti v plain podobe a zasifroval ho nebo posila hash vypocteny z hesla a treba nejakych dalsich hlavicek HTTP, pripadne doplnil nejakou ohranu, aby znesnadnil utoky o podvrzene prihlasovani, o ktere se snazis, tak to muze byt docela zabava.

My jsme treba do zpracovani dulezitych requestu na webu zabudovavali throttling s exponencialne rostouci prodlevou, protoze na rychlou komunikaci se serverem mezi stroji jsou web services a ne web s ksichtem :-)

Offline VladaS

  • Příspěvků: 27
  • Karma: 0
    • Verze Delphi: 7
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #35 kdy: 01-09-2013, 10:51:04 »
Takze se podivej WireSharkem, jak se lisi request posilana prihlasenym browserem od te, co posilas Synapsi. Nejpsis to bude polozka User-Agent, tu by bylo vhodne zmenit. V nasem frameworku bych to udelal:
Kód: Delphi [Vybrat]
  1. HTTPClient.HeaderFields['User-Agent'] := Format('%s version %s',[cRobotName,AppEnv.AppVersion]);
  2.  
ale ve standardni Synapsi indexovana property HeaderFields[] neni, to si budes muset naprogramovat (v Headers tj. ve stringlistu nahradit obsah radku, ktery zacina User-Agent: )


To jsem tam právě měl nastavené  už od začátku - aby ta Synapse tolik "nebila do očí"  ;) ale jen nevím jestli to nemohlo naopak vadit:
        HTTP1.UserAgent := 'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:23.0) Gecko/20100101 Firefox/23.0 SeaMonkey/2.20';
(protože jsem použil cookies z přihlášeného SeaMonkey a myslel že to tak stačí, protože ve Wiresharku je vidět, že to i odesílám...)

No právě že jsou tam samé "uhashe" a uložené "TimeStampy" (ty zrovna ale nejspíš nejsou kvůli ochraně, i když "kdo ví", jestli ne i kvůli ní ...),
takže nevím jestli by bylo něco platné (pokaždé) "úmyslně odhlásit" (aby to vždy vycházelo ze stejného stavu),
nějak Wiresharkem odchytat tu komunikaci, ale ta ochrana může být opravdu složitá (jesli se ty cookies nemusí dokonce třeba ještě i číst a nějak zpracovat...),
tak aby to nebylo jenom (hodně) složité a stejně úplně zbytečné práce ...  :-\

Odlišuje mne (nejspíš) právě ten "uhash", ale ten se při každé relaci mění a potom se v cookies mění ještě i některé části
"dlouhého řetězce" ds, který také nejde dost dobře "dešifrovat"  :-\

Heslo opravdu zašifrované je a nikde vidět není - navíc když to hodí na ten "přiblblý Seznamácký dialog",
kde se dá i vybrat ještě že to nemá být v SSL (pokud by SSL "zlobilo") a to logování je nějak "provázané" ještě i se serverem seznamu,
(zkrátka se to tedy hlásí "účtem Seznamu" a ten si ukládá hodně podobnou cookies, jen hodnoty jednotlivých položek se liší)
takže to na takového začátečníka po 10-ti letech, jako jsem teď já, je už upravdu "tak trochu moc" ...  :-\  ;)

Spíš mne ještě napadlo, že jsem si teď hrál ještě s EmbeddedWB, zjistil že ze svého přihlášení umí vypsat EmbeddedWB1.GetCookiesPath;
cook:=EmbeddedWB1.GetCookie; - to se používá jak když ten cook mám pořád prázdný ?
a jestli by se té Synapsi nějak nedaly "podstrčit" odkazy na cookies z přihlášeného EmbeddedWB v paměti,
protože ty by (doufám) měly být nějak dostupné ...
Mohlo by to tak nějak (alespoň teoreticky) jít, anebo to je úplný nesmysl ?

Jo a ještě tak přemýšlím, co může způsobovat, že ten EmbeddedWB i WebBrowser (ve kterých by to jinak bylo tak jednoduché, když to v nich jinak funguje...)
po určité době tak "nepoužitelně zpomalí" - nedá se tam něco "zbytečného povypínat", nebo to způsobuje ta komunikuje přes rozhraní MSIE,
anebo čím jen to může být, jestli by to opravdu nešlo nějak "ošetřit" ?
« Poslední změna: 01-09-2013, 11:59:11 od VladaS »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #36 kdy: 01-09-2013, 20:52:31 »
(jesli se ty cookies nemusí dokonce třeba ještě i číst a nějak zpracovat...),
tak aby to nebylo jenom (hodně) složité a stejně úplně zbytečné práce ...  :-\
Urcite ne, ty cookies musi byt pro klienta transparentni. Normalne se to dela tak, ze si server vygeneruje nejake unique token a k nemu platnost a typicky si to ulozi ve vazbe 1:1 k uctu do DB a posle to zpatky  formou Cookies klientovi. Kdyz dostane dalsi request (nevi jeste od koho), tak vezme to token z Cookies (if any) a jde ho hledat do DB. Kdyz ho najde, zkontroluje platnost a pokud plati, vytahne z DB  account a pokracuje ve zpracovani requestu. Pokud nenajde nebo expiroval, budto  request vyfuckuje nebo presmeruje na login stranku.

Co muze udelat, ze to unique token nevytvori ciste generatorem, ale 'osolí' to jeste nejakou jinou hodnotou z hlavicky requestu, treba tim user-agent. Ale musi to byt neco, co dostane znovu v pristich requestech, pokud to chce kontrolovat.

Hidden pole bys odhalil WireSharkem pri pozorovani request s prihlaseneho browseru, bud jako parametr v URL nebo v tele requestu.

Citace
cook:=EmbeddedWB1.GetCookie; - to se používá jak když ten cook mám pořád prázdný ?
Nevim, nic jsem s tim nedelal, ale melo by pro to platit tohle msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx

Citace
Jo a ještě tak přemýšlím, co může způsobovat, že ten EmbeddedWB i WebBrowser (ve kterých by to jinak bylo tak jednoduché, když to v nich jinak funguje...)
po určité době tak "nepoužitelně zpomalí" - nedá se tam něco "zbytečného povypínat", nebo to způsobuje ta komunikuje přes rozhraní MSIE,
anebo čím jen to může být, jestli by to opravdu nešlo nějak "ošetřit" ?
No asi zpusobem, jakym s tim pracujes - nekde jsi uvadel nejakou divnou smycku se sleep, kde v cyklu oteviras znovu a znovu stranku, aniz bys ji zaviral a navic jsem ti psal, ze si servery hlidaji max. pocet spojeni z jedne IP adresy.

Takze ja bych pro zacatek zacal tim, ze bych pozadavky serializoval: povesil bych se na event OnDocumentComplete, nastartoval prvni pozadavek, v complete  handleru bych si z odpovedi vyndal  z prijate odezvy co potrebuju, zavrel okno a udelal dalsi request.

A az se to bude chovat mravne, tak bych resil, jake jsou moznosti delat tech pozadavku nekolik paralelne.

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 241
  • Karma: 17
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #37 kdy: 01-09-2013, 21:48:31 »
Tak nejak bych byl radeji, kdyby se ta Synapse nepouzivala k podvadeni.

Offline VladaS

  • Příspěvků: 27
  • Karma: 0
    • Verze Delphi: 7
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #38 kdy: 01-09-2013, 22:27:32 »
Nevim, nic jsem s tim nedelal, ale melo by pro to platit tohle msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx

Takže asi nějak takto (samozřejmě převést do pascalu) a když se zavolá název cookie, tak by to mělo vrátit její hodnotu ?
Ale když si cookie server obsluhuje sám přes tu DB, tak to (asi) stejně potřebovat nebudu a spíš jsem byl jenom zvědavý, jak to přesně funguje
a proč mi to tu cestu k souboru s cookies vypisovalo, ale hodnoty cookies už ne ...

// Retrieve the value of the cookie with the specified name.
function GetCookie(sName)
{
  // cookies are separated by semicolons
  var aCookie = document.cookie.split("; ");
  for (var i=0; i < aCookie.length; i++)
  {
    // a name/value pair (a crumb) is separated by an equal sign
    var aCrumb = aCookie.split("=");
    if (sName == aCrumb[0])
      return unescape(aCrumb[1]);
  }
  // a cookie with the requested name does not exist
  return null;
}

Citace
No asi zpusobem, jakym s tim pracujes - nekde jsi uvadel nejakou divnou smycku se sleep, kde v cyklu oteviras znovu a znovu stranku, aniz bys ji zaviral a navic jsem ti psal, ze si servery hlidaji max. pocet spojeni z jedne IP adresy.

Takze ja bych pro zacatek zacal tim, ze bych pozadavky serializoval: povesil bych se na event OnDocumentComplete, nastartoval prvni pozadavek, v complete  handleru bych si z odpovedi vyndal  z prijate odezvy co potrebuju, zavrel okno a udelal dalsi request.

A az se to bude chovat mravne, tak bych resil, jake jsou moznosti delat tech pozadavku nekolik paralelne.

Tim sleepem jsem to zkusil zpomalit úmyslně (jenom dočasně) a právě proto, aby server "stíhal určitě" - bohužel to nepomohlo a postupně zpomalovalo i dál.
Zřejmě tedy i tak server nechal ta spojení z WebBrovseru otevřená, na rozdíl od Synapse, která (pokud jsem to pochopil správně) čeká na odpověď serveru a potom teprve pokračuje a tím je tedy i spolehlivější, že se požadavek vymkoná určitě  ?

Zkoušel jsem to i "paralelně" (4 až 8 WebBrowserů) (ale to až potom), jelo samozřejmě rychleji (ale jak jsem potom zjistil opravdu nespolehlivě, protože se něco z toho na serveru opravdu takto nestačilo vykonat) - no ale asi "chudák server" a aby mne potom ještě nezačali podezřívat, že se snažím o nějaký DOS, protože to bych opravdu nerad ...

To s "OnDocumentComplete" mne už také napadlo a tedy jsem to už zkoušel, ale zpomalovalo to i tak - WebBrowser byl ale otevřený v té smyčce "trvale",
a bylo mi divné, že ani při velkém zpomalení (právě tím sleepem a jeden dotaz i za několik sekund) v něm nebyla vidět odezva serveru,
ale až když to vykonalo úplně poslední požadavek - to by tak nevadilo že "výsledek" nebyl vidět (i když kdyby byl pro "kontrolu" vidět by se mi to samozřejmě líbilo víc), ale říkal jsem si, jestli by to "zavírání okna" třeba nezdržovalo moc, aneo jsem spíš nevěděl jak na to
- tedy aby se ať už WebBrowser, anebo TEmbeddedWB v té smyčce vždycky (kompletně) "zrušil" a zase znovu "vytvořil" - tyhle věci už jsem za ty roky bohužel zapoměl... :(
« Poslední změna: 01-09-2013, 23:21:46 od VladaS »

Offline VladaS

  • Příspěvků: 27
  • Karma: 0
    • Verze Delphi: 7
Re:Jednodušší (rychlejší) náhrada za komponentu WebBrowser ???
« Odpověď #39 kdy: 01-09-2013, 22:42:46 »
Tak nejak bych byl radeji, kdyby se ta Synapse nepouzivala k podvadeni.

Snad jde jenom o nedorozumění - pokud se tedy nepovažuje za "podvádění" to, že úplně to samé, co bych mohl dělat (a zcela legálně)
i ručně si chci jenom "zautomatizovat", abych potom svůj (takto ušetřený) čas mohl věnovat raději něčemu příjemnějšímu (anebo užitečnějšímu)
a hlavně to dělám jenom pro svou vlastní potřebu a i zároveň abych se na tom něco (zajímavého) naučil - pokud to ale vadí,
tak už (samozřejmě) Synapsi používat nebudu a potřebné informace se tedy (bohužel) už raději také budu snažit získat raději jinde ...  :(