idHTTP, delphi, sms-y

0

Witam,
chciałbym dodać do swojego programu możliwość wysyłania sms-ów (powiadomień na moją komórkę) w zależności od wyników jakie wypluje. Zrobiłbym to z płatną www.smsapi.pl (post lub get i po sprawie) problem w tym, że trzeba prowadzić działalność by z tego skorzystać. Dlatego chciałbym zrobić to przez stronę orange. Tu zaczyna się problem. Nie umiem wypełnić formularza by tam się zalogować a co dopiero wysłać sms-a. Mógłby ktoś poprawić poniższy kod by się jakoś tam zalogować?

 

procedure TForm1.Button1Click(Sender: TObject);
var
     HTTP       : TidHTTP;
     html, s    : string;
     i          : integer;
     StreamIn   : TStringStream;
     Plik       : TStringList;
begin
     HTTP := TidHTTP.Create(nil);
     StreamIn:= TStringStream.Create('');
     HTTP.IOHandler:= Form1.IdSSLIOHandlerSocketOpenssl1;
     Http.Request.UserAgent:= 'Mozilla/5.0 (Windows; U; Windows NT 5.0; pl-PL; rv:1.7.6) Gecko/20050226 Firefox/1.0.1';
     StreamIn.WriteString('login-field=XXXXX&password-field=XXXXX');
     try
      HTTP.HandleRedirects := True;
      HTTP.AllowCookies := True;
      HTTP.Request.ContentType :='application/x-www-form-urlencoded';
      html := HTTP.Post('https://www.orange.pl/start.phtml',StreamIn);
      plik:= TStringList.Create;
      plik.Add(html);
      plik.SaveToFile('C:\wynik.html');

     finally
      FreeAndNil(HTTP);
      plik.Free;
     end;
end;

dodam, że dll-ki do ssla są i działają, po prostu nie wiem co ma się znaleźć w nagłówku (nie umiem użyć sniffera), pewnie "kukisy" też nie działają z powyższym kodem jak należy - średnio się na tym znam. Szukam "dobrodzieja" obeznanego w tematyce, który pomoże. Byłbym bardzo wdzięczny. PS googlowałem dużo, nie odsyłajcie proszę do "szukajek".

0

Może inaczej zadam pytanie, jak odczytać parametry nagłówka dla metody POST które wymaga strona?
tzn. na pewno jest potrzebny login i hasło, ale pewnie strona wymaga też innych danych, jak je odczytać?
oraz czy Indy radzi sobie ze stronami z js ???

1

Ja pisałem tylko program obsługujący darmowe SMSy przez bramkę Orange. Jednak to w Twoim wypadku kiedy chcesz by robił to automat odpada, bo trzeba wpisywać kod z obrazka. Natomiast widzę, że uparłeś się na Indy, a z tym pomóc może tylko @kAzek, bo chyba on jeszcze ogarnia ten pakiet. Ja bym proponował Synapse. Jednak podstawowym problemem, który wnika z zadanego przez Ciebie pytania, jest to że sam nie wiesz co strona wysyła POSTem po HTTPS, a podałeś jakieś dane do wysłania. Jeżeli chodzi o strony po HTTPS, to ja się dobrze nie znam. Jednak jeżeli musiałem analizować taką stronę do logowania na przykład facebook albo nk to po prostu zapisywałem stronę na dysk i w jej kodzie html podmieniałem https na http i upewniałem się pod WireSharkiem co jest wysyłane. Ponieważ wiadomo strony po HTTPS są szyfrowana i tego nie podejrzysz pod snifferem tak jak dla plain textu w obsłudze protokołu HTTP. Jeżeli już ustalisz co jest wysyłane do strony metodą POST - musisz się postarać wysłać to samo, jak najdokładniej, bo inaczej pewnie strona odrzuci Twoje zapytanie. Natomiast co do JS nie obsłuży Ci tego ani Indy, ani Synapse ani SimpleTcp. Jedynie prawdziwa przeglądarka www. Ale właśnie czy jesteś pewien, że strona potrzebuje do działania JS? Próbowałeś na chwilę wyłączyć jego obsługę w przeglądarce dla tej strony i spróbowac wysłać SMS ponownie? Bo babranie się z TWebBroswer kiedy wszystko ładnie można obsłużyć Synapse to jak polowanie na muchy z armatą. Natomiast mogę potwierdzić, że przed chwilą wysłałem SMSa testowego do siebie moim programem z darmowej bramki i doszedł. Z tym, że ja w swoim programie założyłem, że numery w Orange mają określony prefix, jednak teraz kiedy przenoszenie numerów między sieciami jest niemal codziennością należało by z tego zrezygnować, bo numer przeniesiony z innej sieci do Orange może mieć za pewne dowolny początek, jaki miał w poprzedniej sieci. Także co do ogarnięcia HTTPS oraz Indy to może ktoś jeszcze coś doradzi. Ja napisałem to co wiem. Na koniec dodam, że może Orange ma gdzieś na stronie tej bramki jakąś dokumentacje lub API gdzie opisują w jakiś sposób korzystać z tej bramki z poza strony www?

0

Dzięki bardzo za odp. Będę kombinował z zapisem strony offline i WireShark - chciałem tego uniknąć - po prostu się na tym nie znam (na tym tzn. na protokołach sieciowych, tworzeniu stron, ciasteczkach i innych dupeszfancach). Nie upieram się przy Indy, wręcz przeciwnie - program będzie (w zasadzie już pracuje, tyle że bez funkcji wysyłania powiadomien sms) na komputerku typu mini-itx 666 MHz 256MB ram. Dlatego im czystszy i mniejszy kod tym dla mnie lepiej (TWebbrowser z tego powodu odpada - chodź wiem że to byłoby najprostsze rozwiązanie) Synapsa nie brałem z kolei pod uwagę, gdyż czytałem że nie obsługuje js - tak rozdymana strona jak orange.pl na pewno zawiera gdzies tam w kodzie js. Sprawdzę to jeszcze.

Odnośnie API - to byłoby najlepsze dla mnie rozwiązanie (takie jak np. w SMSAPI- metoda POST w synapsie rozwiązałaby problem) - niestety, tam trzeba prowadzić działalność by z tego skorzystać - pytałem, dzwoniłem, sprawdzałem wiele tego typu serwisów. Orange w Polsce nie prowadzi jeszcze swojego API (chodź skąd innąd wiem że prace nad tym są już podjęte).

0

Rozumiem. Ja też ogarniam temat tylko podstawowo. A protokół HTTP nie jest aż tak zaawansowany. Coż, pozostaje Tobie kombinowanie. Bo nie wiem czy jakiś debugger HTTP coś więcej pomoże, skoro jest do HTTP, jak sam nazwa wskazuje, a nie do szyfrowanej wersji protokołu. Można jeszcze spróbowac zajrzeć do źródła strony i tam zobaczyć jakie parametry są przesyłane do POSTowania. O ile będzie to widoczne. Ja osobiście wolę to sprawdzać pod WireSharkiem, bo na tyle słabo znam HTML, że gorzej mi się czyta źródlo strony niż podane na tacy wartości widoczne choćby w Snifferze. Natomiast z obsługa JS jest tak jak pisałem, z tego co się orientuje dobrze obsługują go tylko przeglądarki www. A i nie wiem, czy są jakieś darmowe komponenty, którymi byś to ogarnął.

2

Logowanie do Orange w Indy:

uses RegExpr; //modul do obslugi wyrazen regularnych do pobrania z:
              //http://www.regexpstudio.com/TRegExpr/TRegExpr.html

procedure TfrmMain.btnLoginClick(Sender: TObject);
const
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1';
  CONTENT_TYPE = 'application/x-www-form-urlencoded';
  LOGIN_URL = 'http://www.orange.pl/start.phtml';
var
  IdHTTP: TIdHTTP;
  RegEx: TRegExpr;
  postData: TStringStream;
  inStr, outStr: string;
begin
  IdHTTP:= TIdHTTP.Create;
  try
  try
  IdHTTP.HandleRedirects:= True;
  IdHTTP.Request.UserAgent:= USER_AGENT;
  outStr:= IdHTTP.Get(LOGIN_URL);
  RegEx:= TRegExpr.Create;
  try
  RegEx.Expression:= '<form id="loginForm" action="([^"]{1,})"';
  if not RegEx.Exec(outStr) then
    raise Exception.Create('Nie znaleziono formularza logowania.');
  inStr:= RegEx.Match[1];
  inStr:= StringReplace(inStr, 'https://', 'http://', []);
  postData:= TStringStream.Create('');
  try
  IdHTTP.Request.Referer:= LOGIN_URL;
  IdHTTP.Request.ContentType:= CONTENT_TYPE;
  postData.WriteString('_dyncharset=UTF-8');
  postData.WriteString('&/tp/core/profile/login/ProfileLoginFormHandler.value.login=LOGIN');
  postData.WriteString('&_D:/tp/core/profile/login/ProfileLoginFormHandler.value.login=+');
  postData.WriteString('&/tp/core/profile/login/ProfileLoginFormHandler.value.password=HASLO');
  postData.WriteString('&_D:/tp/core/profile/login/ProfileLoginFormHandler.value.password=+');
  postData.WriteString('&/tp/core/profile/login/ProfileLoginFormHandler.login=loguj');
  postData.WriteString('&_D:/tp/core/profile/login/ProfileLoginFormHandler.login=+');
  postData.WriteString('&_DARGS=/ocp/gear/infoportal/header/user-box.jsp');
  outStr:= IdHTTP.Post(inStr, postData);
  if Pos('edycja profilu', outStr) > 0 then
    ShowMessage('Zalogowany')
  else
    ShowMessage('Błąd logowania');
  finally
  postData.Free;
  end;
  finally
  RegEx.Free;
  end;
  Memo1.Text:= outStr;
  finally
  IdHTTP.Free;
  end;
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
0

Synapsa nie brałem z kolei pod uwagę, gdyż czytałem że nie obsługuje js - tak rozdymana strona jak orange.pl na pewno zawiera gdzies tam w kodzie js. Sprawdzę to jeszcze.

A Indy obsługuje? Nie.

debugger HTTP

... Sniffer.

Natomiast z obsługa JS jest tak jak pisałem, z tego co się orientuje dobrze obsługują go tylko przeglądarki www. A i nie wiem, czy są jakieś darmowe komponenty, którymi byś to ogarnął.

Pytanie brzmi po co to ogarniać? Dzięki użyciu czystego HTTP nie musimy pobierać żadnego JS ani obrazków które dla programu są nieistotne...

po prostu się na tym nie znam (na tym tzn. na protokołach sieciowych, tworzeniu stron, ciasteczkach i innych dupeszfancach).

Skoro teraz się tym zajmujesz to czas to zmienić.

Generalnie to przyda ci się Opera Dragonfly (jeżeli jesteś użytkownikiem jedynej słusznej przeglądarki, do innych masz jakieś dodatki etc.), może WireShark czy jakiś inny Sniffer HTTP. Jeżeli miałbym problem z HTTPS to pewnie bym znalazł miejsce w przeglądarce gdzie wysyła dane do szyfrowania i to zhookował żeby przy okazji podsyłało do mnie. Wystarczyłoby odpowiednio zmodyfikować kod @olesia który kiedyś opublikował od blokowania pewnych hostów... Ale tutaj pewnie też są gotowe rozwiązania, na 95% dragonfly będzie wystarczyć.

0

Dzięki wielkie za pomoc !!! :)

0
-123oho napisał(a):

debugger HTTP

... Sniffer.

Środowisko programistyczne - dziurkacz.

Żałosna istoto, dynamiczne strony chcesz debugować snifferami? I ty jeździsz na forum po wszystkich newbie którzy rozmijają się z sensownymi rozwiązaniami? :| Do takich rzeczy korzysta się z tego co oferują przeglądarki (ew. rozszerza pluginami). Firefox ma plugin Firebug, dla Chrome są Developer Tools, Opera ma Dragonfly w standardzie, etc. Kiedy tego typu narzędzia nie są do końca użyteczne wykorzystuje się burpa, Fiddlera albo Zapa, ale nigdy, cholera, nigdy jakiś tandetnych snifferów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1