Wymiana wiadomości między programem napisanym w delphi a skryptem php

0

Wiem, wiem... było. Na prawdę czytałem wszystkie te tematy. Przestudiowałem 11 rozdział książki pana Adama, i za nic nie mogę wysłać wartości typu string do skryptu php. Używam komponentu TidHTTP od Indy.

var
  StreamIn, StreamOut : TStringStream;
begin
  HTTP.Host := 'mojhosting.boo.pl';
  HTTP.Connect;
  StreamIn := TStringStream.Create('');
  StreamOut := TStringStream.Create('');
  try
    try
      StreamIn.WriteString('wartosc1=' + edtMsg.Text);
      HTTP.Post('http://mojhosting.boo.pl/delphi.php', StreamIn, StreamOut);
    except
      raise Exception.Create('Nie można połączyć się z serwerem!');
    end;
  finally
    StreamIn.Free;
    StreamOut.Free;
    HTTP.Disconnect;  // rozłączenie
  end;
<?php
  mail("[email protected]", "test", 
  $wartosc1, "From: test");
?>

Jak wywołuje ten kod (delphi) to wywala mi "Network is down" i zaznacza na niebiesko linijkę pod HTTP.Connect;.
Głównie zależy mi na tym, by skrypt otrzymał wartość i odesłał programowi (napisanemu w delphi) inny.

PS; Słyszałem o Delphi for Php ale nie chce niczego ściągać i instalować.

0

Nie znam się na Indy. Ale od postów ludzi tutaj wiem, że są problemy z POSTowaniem. Jedyne co mogę doradzić to skorzystać z Synapse i pod nim powinno się to udać. Tylko poamiętaj żeby MimeType ustawić na 'application/x-www-form-urlencoded'; A jak wysyłać dane ze zmiennej string metodą POST na przykład tak:

uses
  httpsend;
//...
const
  ToPost_MimeType = 'application/x-www-form-Urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.8.131 Version/11.10';
var
  SynHttp : THttpSend;
begin
//...
    SynHttp := THttpSend.Create;
    SynHttp.KeepAlive := True;
    SynHttp.Protocol := '1.1';
    SynHttp.MimeType := ToPost_MimeType;
    SynHttp.UserAgent := Opera_UserAgent;
    UrlData := 'login=' + AUserName + '&pass=' + APassword + '&action=zaloguj';
    SynHttp.Document.Write(Pointer(UrlData)^, Length(UrlData));
    SynHttp.HTTPMethod('POST', 'http://adres-twojej-strony.net/cosik.php');
//...
    SynHttp.Free;
0

Kilka (naście) dni temu podawałem przykład jak zalogować się do forum phpBB2 by Przemo za pomocą Indy 10 (nie wiem czy zadziała w Indy 9) to możesz zrobić wg. tego przykładu.

const
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0';
  URL = 'TU ADRES FORUM/login.php';
var
  sl: TStringList;
begin
  IdHTTP1.HandleRedirects:= True;
  IdHTTP1.Request.UserAgent:= USER_AGENT;
  IdHTTP1.Get(URL); //tylko po to aby pobrać ciacha
  IdHTTP1.Request.Referer:= URL; //może by wymagany
  IdHTTP1.Request.ContentType:= 'application/x-www-form-urlencoded';
  sl:= TStringList.Create;
  try
  sl.Add('username=TU LOGIN');
  sl.Add('password=TU HASŁO');
  sl.Add('redirect=');
  sl.Add('login=Zaloguj');
  Memo1.Text:= IdHTTP1.Post(URL, sl);
  finally
  sl.Free;
  end;
end;

Ogólnie polecam zmianę Indy z 9 na 10 mino, że to Beta to na pewno wiele z błędów 9 jest naprawionych przynajmniej podczas "zabawy" z HTTP, FTP, POP3 i SMTP nie ma większych problemów. Oficjalna (nie Beta) wersja Indy 10 chyba już nie wyjdzie.

0
kAzek napisał(a)

Ogólnie polecam zmianę Indy z 9 na 10 mino, że to Beta to na pewno wiele z błędów 9 jest naprawionych przynajmniej podczas "zabawy" z HTTP, FTP, POP3 i SMTP nie ma większych problemów. Oficjalna (nie Beta) wersja Indy 10 chyba już nie wyjdzie.

czyżby taki cudowny i zajebisty pakiet umarł?

0

A kto powiedział że jest (był) cudowny i zajebisty? Nigdy tak nie twierdziłem co najwyżej kilka razy wykazywałem, że to że coś nie działa to nie wina pakietu (jak się okazywało) tylko umiejętności programisty. No i nie ma oficjalnego info o zamknięciu projektu to tylko domysły po tym kiedy ukazała się ostatnia wersja.

0

@kAzek:
To nie jest forum tylko server ftp, a chce wysłać dane do pojedynczego dokumentu *.php.
Tak jak olesio wysłał do

'http://adres-twojej-strony.net/cosik.php'
0
TomRiddle napisał w komentarzu napisał(a)

Co mam podać w AUserName i w APassword? I gdzie jest zadeklarowana ta UrlData?

No proszę Cie nie kompromituj się TomRiddle ;/ Co pierwszy dzień Delphi na oczy widzisz? Przeciez to tylko >>>PRZYKŁAD<<<! UrlData to wiadomo przecież, że to zmienna typu string. Może być zadeklarowana lokalnie. A taka konstrukcja jest spodziewana na innej stronie, u siebie podaj to co wiesz, że skrypt php w POSTcie oczekuje czyli chyba wartosc1=.... Zmienne z nazwą usera i hasłem też są typu string. Ech. Przecież nie muszę Tobie chyba takich rzeczy pisać ;/

0

Czyli tak:

    UrlData := 'wartosc1=' + edtWartosc1.Text;
    SynHttp.Document.Write(Pointer(UrlData)^, Length(UrlData));
    SynHttp.HTTPMethod('POST', 'http://mojhosting/test.php');

??

Myślałem że to muszą być jakieś konkretne wartości, sorry.

0

Tyle kombinacji a wystarczyło wywalić ten Connect ;-P

0

A przy okazji jak mogę z zażądać odpowiedzi od skryptu php, lub wysłac odpowiedzieć ze skryptu?

0

Niebardzo rozumiem o co Tobie chodzi. Przecież własnośc THttpSend o nazwie Document (TMemoryStream) będzie zawierała zwrócony kod html. To jest chyba ta odpowiedź, której oczekujesz.

0

No to tak, podsumowując:
@olesio używając Twojego sposobu program myślał przez 3-10sek potem (jeżeli chciałem wysłać wartość wartosc1=ok, zwracał wartosc=ok czyli dokłądnie to co wysłałem)

@kAzek po użyciu Twojego kodu, wywołanie procedury kończy się błędem, mimo jednak że skrypt wysłał mi pustego maila, po czym wnoszę że ta wartosc1 nie dotarła do niego.
user image
Jednakowoż jeżeli usunę linijkę Memo1.Text := IdHTTP1.Post(URL, sl); błędu nie ma :)

0

jaja robicie w tym temacie... :D pisze Ci wyraźnie powód błędu, weź zobacz na tłumaczu, wpisz w google treśc, cokolwiek.

Musisz obsłużyć przekierowanie, coś w stylu handleredirecting. Z tego co wiem to w synapse tego nie ma, trzeba to obsłużyć ręcznie.
Wysyłanie zmiennej postem to jeden z łatwiejszych sposobów, jeżeli rzeczywiście z głową przestudiowałbyś 11 rozdział, to z pewnością bez najmniejszych problemów wysłał byś POST-a. Rusz trochę głową.

@olesio, jak jesteś zadowolony z nakłaniania na synapse to może napiszesz w wolnych chwilach jakiś ciekawy artykuł, po co za każdym razem tłumaczyć każdemu, możesz im pokazać swój artykuł ;)

0

Nie znam dobrze PHP ale powinno być coś w stylu:

<?php
  $wartosc1 = $_POST['body']; //coś musi odebrać dane które wysyłasz
  mail("[email protected]", "test", 
  $wartosc1, "From: test");
?>

i w Indy (na szybko bez kompilatora więc może być jakiś drobny błąd):

const
  USER_AGENT = 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0';
  URL = 'http://adres/nazwapliku.php';
var
  sl: TStringList;
  body: string;
begin
  body:= 'to jest testowa treść maila';
  IdHTTP1.HandleRedirects:= True;
  IdHTTP1.Request.UserAgent:= USER_AGENT;
  IdHTTP1.Request.ContentType:= 'application/x-www-form-urlencoded';
  sl:= TStringList.Create;
  try
  sl.Add('body=' + body);
  IdHTTP1.Post(URL, sl); //wyslesz i mail powinien zostać wysłany pod warunkiem że funkcja mail działa na tym serwerze
  finally
  sl.Free;
  end;
end;
0

Poradziłem sobie inaczej, ale pomysł kAzka mnie zainspirował. Przerobiłem mój stary kod, ale i tak dzięki wszystkim.

 <?php
  $wartosc1 = $_GET['body'];
  mail("[email protected]", "test",
  $wartosc1, "From: test");
 ?>
var
  StreamOut : TStringStream;
  Url : String;
begin
  HTTP.Host := edtIP.Text;
  StreamIn := TStringStream.Create('');
  try
    HTTP.Get(URL + '?' + 'body=' + edtMsg.Text, StreamOut);
    ShowMessage('Wyslano');
  finally
    StreamOut.Free;
  end;
end;

Sorry że znowu, ale wie ktoś może czemu to tak długo trwa? 1-2sek.Chciałbym żeby to było tak: Klik i już.

0

normalka, zależy szybkości od łącza internetowego. Jeżeli nie chcesz wieszania programu, musisz obsłużyć wątki. Na 4p jest o tym kilka porządnych artykułów.

0

Sorry że odświeżam temat, ale cały czas była mowa o tym że delphi wysyła zaptyanie do skryptu a skrypt odpowiada. A jak zrobić takie coś że skrypt sam wysyła jakąś wartość? Zgaduję że będę musiał mieć stałe ip.

0

Jeżeli dobrze zrozumiałem, skrypt ma wysyłać wartośc do...? Twojego programu? Mógłbyś przy pomocy Indy lub Synapse postawić serwer http, ważne tylko żeby mieć dostęp do portów z zewnątrz czyli przekierowanie na ewentualnym ruterze lub ustawienie DMZ i ewentualnego firewalla jak należy. Później Twoj program mógłby na starcie uruchamiając serwer sprawdzić Twoje IP (nie musi być stałe, byle byś nie był za NATem bez możliwości przekierowań portow) na przykład na stronie http://dynupdate.no-ip.com/ip.php - później wysłać to IP do skryptu ktory rozumiem jest na serwerze ze stałym adresem i wtedy skrypt php móglby już wysyłać GET'em lub POSTem jakieś dane, które obsłużył by Twój serwer www postawiony na localhostcie i napisany w Delphi. Od strony PHP nie wiem jak to zrobić. Do Indy jest przykład w demach serwera www. Po stronie php jak przechwycony na przykład POSTem jako parametr Twoj adres IP obsłużyć oraz wysyłać do niego jakieś zapytanie po HTTP to niebardzo wiem, ale powinno być to porstsze niż napisanie client - server, jeżeli dysponuje się tylko stroną z obsługą PHP, a nie ma możliwości napisania serwera tak aby działał na zdalnym komputerze. Jeżeli nie o to chodzi to nie wiem, sprecyzuj.

0

Tak, mniej więcej o to mi chodzi. A teraz postaram się przybliżyć o co mi dokładnie chodzi.
Program napisany w delphi, (mój program) wysyła metodą GET zapytanie do skryptu *.PHP będącego na serverze FTP.
Skrypt odbiera zapytanie i sprawdza czy jest "dobre", jeżeli tak to rozsyła je dalej do wszystkich uruchomionych programów, napisanych przeze mnie.

Myślałem najpierw żeby każde nowe "dobre" zapytanie zapisywać do pliku na serverze, a każdy program co 3 sek. wysyłał zapytanie do skryptu z prośbą o zwrócenie całego pliku.

@olesio Nie za bardzo wiem jak Twoja idea ma działać. Możesz trochę bardziej wytłumaczyć?

PS; Od razu mówię że mam (chyba) stałe IP, ale nie publiczne. Za każdym razem jak sprawdzam ip (czy to przez cmd, czy przez jakiś zewn. server) to jest takie same. Natomiast myślę że mój komputer znajduje się w radiowej sieci WLAN, i chyba operator nie obługuje przekierowania portów. W firewalla nigdy nie ingerowałem (nawet nie wiem czy takowy posiadam). Wiem że mam antywirusa od Microsoftu.

0

Ja nie wiem w czym macie problem jak pobierasz sobie synapse to masz tam magiczny katalog Demo(s) w którym są tak zwane przykłady jedynie co ty masz zrobić to Ctrl+c Ctrl+v i przerobić by wysyłało ci dane LOL

0

@proqix: ja nie mam problemu, podałem tylko TomRiddle jedno z możliwych rozwiązań jeżeli nie chce pisac klient - server, bo jako serwer ma działać skrypt php uruchomiony na serwerze http://dynupdate.no-ip.com/ip.phpdziło mi o komunikację programu poprzez Internet. Jednak do postawienia serwera u siebie potrzeba przekierowanych portów przynajmniej. Najlepiej sobie TomRiddle sprawdź IP http://dynupdate.no-ip.com/ip.php i postaw na nim na chwilę jakiś serwer FTP na porcie 21 i spróbuj się po IP połączyć to będziesz wiedział czy na pewno jesteś za NAT'em czy nie albo sprawdź w google strony do ustalania czy dany port jest otwarty, jak nie masz innej możliwości sprawdzenia z zewnątrz. I wracając do rozwiązania, to nie znam się prawie w ogóle na PHP, ale pewnie da się zrobić coś takiego przy użyciu Synapse, że przy uruchomieniu Twój program łączy się z Twoją stroną http://pl.wikibooks.org/wiki/PHP/Sesjeskrypt identyfikuje jakoś program na podstawie ciasteczek i wysyła mu odpowiednie dane, co jakiś czas, które program odbiera, ale nie wiem czy ro wyjdzie w intervale czasowym. Musiał by skryp php zwracać w jakiejś wartości odczekaj=X i wtedy robisz w wątku Sleep(X * 1000) na przykład albo jak X jest w milisekundach to Sleep(X) i odbierać kolejne dane. Może to mozna zrobić jakoś inaczej lub prościej, ale tak jak wspomniałem na PHP się nie znam, ale może to się da zrobić samym PHP, bo nie wiem czy do dynamicznej zmiany zawartości strony wystarczy co jakiś czas i aktualizacji tego przez Synapse samo PHP wystarczy czy nie potrzeba JavaScriptu. To już ktoś bardziej zaawansowany w tworzeniu przy użyciu PHP musiał by Ciebie naprowadzić. Bo może da się bez posiadania przekierowanych portów, jedynie łącząc się po protokole HTTP z wykorzystaniem Synapse oraz skryptu PHP na serwerze. Albo może i naet żadne niekreślone Sleepy nie będą potrzebne tylko co stały okres czasu łączyć się ze skryptem PHP przez Get a skrypt identyfikował by klientów na podstawie SESSION ID. Jest o tym sporo informacji w google, na przykłado sesjach po polsku na: http://pl.wikibooks.org/wiki/PHP/Sesje

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