Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: "zaawansowane" zapytanie POST ze skryptu PHP
Forum PHP.pl > Forum > PHP
carambas
Witam,

to mój pierwszy post, dzień dobry.

Mam problem z zapytaniem POST. Chcę wysłać wiadomość MMS przez bramkę intellisoftware. Pod tym (http://www.intellisoftware.co.uk/sms-gateway/http-interface/send-mms/) linkiem jest dostępny opis formatu MMSa.

Przepiszę go tu dla leniwych:



CODE
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="username"
Content-Type: text/plain

YourUsername
--AaB03x
Content-Disposition: form-data; name="password"
Content-Type: text/plain

YourPassword
--AaB03x
Content-Disposition: form-data; name="to"
Content-Type: text/plain

0771012345
--AaB03x
Content-Disposition: form-data; name="from"
Content-Type: text/plain

0771054321
--AaB03x
Content-Disposition: form-data; name="type"
Content-Type: text/plain

5
--AaB03x
Content-Disposition: form-data; name="text"
Content-Type: text/plain

MMS Message Subject
--AaB03x
Content-Disposition: form-data; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x
Content-Disposition: form-data; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

...contents of file2.gif...
--AaB03x--


To jest zendowski dump mojego zapytania:
CODE
["zapytanie"] => array(1) {
["http"] => array(3) {
["method"] => string(4) "POST"
["header"] => string(52) "Content-Type: multipart/form-data; boundary=AaB03x
"
["content"] => string(5471) "--AaB03x
Content-Disposition: form-data; name="username"
Content-Type: text/plain

intelli_login
--AaB03x
Content-Disposition: form-data; name="password"
Content-Type: text/plain

intelli_password
--AaB03x
Content-Disposition: form-data; name="to"
Content-Type: text/plain

48608288403
--AaB03x
Content-Disposition: form-data; name="from"
Content-Type: text/plain

maciek
--AaB03x
Content-Disposition: form-data; name="type"
Content-Type: text/plain

5
--AaB03x
Content-Disposition: form-data; name="text"
Content-Type: text/plain

tematMMs
--AaB03x
Content-Disposition: form-data; filename="file1.txt"
Content-Type: text/plain

treasav
adfaf
aefafae
faefaefaefa


tttt

--AaB03x
Content-Disposition: form-data; filename="file2.gif"
Content-Type: image/gif
Content-Transfer-Encoding: binary

GIF89(...);
--AaB03x--"


Wyciąłem zawartość Gifa, żeby nie zaśmiecać tego tematu jeszcze bardziej.


Odpowiedź serwera to stale "request invalid". Hasło i login mam ok (jak zmienie, to krzyczy, że "login invalid"). Wydaje mi się, że zapytanie też mniej więcej ok.

Całe zapytanie wysyłam do severa w ten sposób:
CODE
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-Type: multipart/form-data; boundary=AaB03x'."\r\n",
'content' => $content
)
);

$context = stream_context_create($opts);
$fp = fopen('http://www.intellisoftware.co.uk/smsgateway/default.aspx', 'rb', false, $context);

$result = stream_get_contents($fp);


gdzie $content to jest to, co jest w tym dumpie jedną rubrykę wyżej.

Nie wysyłałem nigdy żadnego POSTa, więc nie mam pojęcia co może być nie tak.


Za wszelkie próby pomocy z góry dziękuję!
wookieb
Cytat(carambas @ 23.03.2009, 10:00:04 ) *
Przepiszę go tu dla leniwych:

Daruj sobie taki tekst

Nie szybciej i łatwiej wykorzystać do tego celu curla?
carambas
poszedłem za Twoją radą (dzięki za szybką podpowiedź)

Oto co przekazuję jako parametr do curl (dump z Zenda):
CODE
array(8) {
["from"] => string(4) "ktos"
["text"] => string(5) "adfaf"
["username"] => string(6) "intelli_login"
["password"] => string(6) "intelli_haslo"
["type"] => string(1) "5"
["to"] => string(11) "48501000000"
["plik1"] => string(32) "@./gifs/1237803240-zrobsobie.gif"
["plik2"] => string(17) "@./gifs/tresc_tmp"
}


text to tamat MMSa. W ".gifs/tresc_tmp" zapisuję treść główną MMS (intelli chce, żeby to było w pliku to robię w pliku, żeby curl mógł sobie z tym odpowiednio poradzić).

Polecenia curl:

CODE
$ch = curl_init('http://www.intellisoftware.co.uk/smsgateway/default.aspx');
//curl_setopt($ch, CURLOPT_CRLF, 1); // <- to jest zakomentowane
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);


jak widać szablonowe, ściągnięte z sieci, niby sprawdzone.

Ale nie działa. Dalej jest "request invalid".

W dodatku jak odkomentuję linijkę, która powyżej jest zaznaczona // treść linijki // to dostaję błąd "ERR: NO PASSWORD", chociaż hasło jest podawane.

Dodam, że nazwy elementów tablicy z dumpa powyżej odpowiadają nazwom pól, które są wymagane przez intelli.


Ktoś może wie co robię źle? Próbowałem znaleźć sposób, żeby zobaczyć co wysyła curl, ale nie znalazłem takiej opcji.

Pozdrawiam
wookieb
Zobacz sobie opcje
CURLOPT_HTTPHEADER na http://pl.php.net/curl_setopt

A zobaczysz co ci wysyła curl robiąc sobie plik testowy mniej więcej o takiej treści
  1. <?php
  2. print_r($_SERVER);
  3. ?>

I curlem możesz go wywoływać.
carambas
Dzięki za podpowiedź z plikiem. Świetny sposób testowania. Dzięki temu już wiem, że jak ustawię CURLOPT_CRLF to czyści mi zapytanie zupełnie.



Zapytanie, które wysyłam w postaci tabelki:
CODE

array(8) {
["from"] => string(5) "adfaf"
["text"] => string(5) "fafaf"
["username"] => string(6) "intelli_login"
["password"] => string(6) "intelli_haslo"
["type"] => string(1) "5"
["to"] => string(11) "48555433222"
["plik1"] => string(71) "@/var/www/eworkspace/crmsms/trunk/public//gifs/1237805374-zrobsobie.gif"
["plik2"] => string(55) "@/var/www/eworkspace/crmsms/trunk/public/gifs/tresc_tmp"
}



Wynik, który otrzymuję w pliku test.php (print_r($_POST); print_r($_FILES)winksmiley.jpg
CODE

Array ( [from] => adfaf [text] => fafaf [username] => intelli_login [password] => intelli_haslo [type] => 5 [to] => 48555433222 )
Array ( [plik1] => Array
( [name] => 1237805374-zrobsobie.gif [type] => image/gif [tmp_name] => /tmp/php4JB5pM [error] => 0 [size] => 4637 )
[plik2] => Array
( [name] => tresc_tmp [type] => application/octet-stream [tmp_name] => /tmp/phpfYOKLs [error] => 0 [size] => 41 )
)


Jak widać, wygląda to zupełnie poprawnie.

Odpowiedź tego cholernego intelli:
ERR:INVALID_REQUEST


Kod, którym wysyłam

CODE

$ch = curl_init('http://localhost/test.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
$ch = curl_init('http://www.intellisoftware.co.uk/smsgateway/default.aspx');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
if (curl_errno($ch)) {
echo 'Błąd #' . curl_errno($ch) . ': ' . curl_error($ch);
}


Kod wręcz zdublowany. curl_errno() nie zwraca błędów.


Wysyłał ktoś kiedyś mmsy przez intelli? SMSy działają jak trzeba.

Pzdr!
wookieb
Zobacz jeszcze te nagłówki co pisałem. Może w nagłówkach im coś nie pasuje.
A jeżeli to nie pomoże to pisz do nich smile.gif
Sproóbuj jeszcze dac
Kod
curl_setopt($ch, CURLOPT_HTTPHEADERS,array('Content-Type: multipart/form-data'));
carambas
aha, nagłówki.

Nie napisałem, że znalazłem informację, jak wyświetlić część zapytania wysłanego przez curl (nagłówki właśnie).

Służy do tego funkcja
curl_getinfo($ch, CURLINFO_HEADER_OUT)
ale przed wykonaniem curl_exec($ch) należy umieścić jeszcze:
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

(oczywiście nie ma tego w dokumentacji na php.net, jest w komentarzach użytkowników pod nią;]).

Wg tychże nagłówków content-type jest dobry, oto dump z niego:
CODE
POST /smsgateway/default.aspx HTTP/1.1
Host: www.intellisoftware.co.uk
Accept: */*
Content-Length: 5617
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------d8846e12d61c



Nie pozostaje mi nic innego jak ścigać intelli. Wystosowałem do nich gniewną notę z opisem moich katuszy nad tym elementem i zobaczymy.

Dzięki za szybkie i sprawne podrzucanie pomysłów.

ADDED:

zmieniłem podtytuł tematu, żeby łatwiej potem było szukać komuś z podobnymi problemami. Choć wątpię, żeby dużo osób używało Intelli.
wookieb
Cytat(carambas @ 23.03.2009, 12:34:56 ) *
Wystosowałem do nich gniewną notę z opisem moich katuszy nad tym elementem i zobaczymy.


A na końcu może się okazać, że czegoś nie doczytałeś więc ten gniew warto zostawić na sam koniec.
carambas
temat można zamknąć.

ROZWIĄZANIE:

zapytania prawdopodobnie wysyłałem prawidło za każdym razem. Konto było nie tego typu...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.