Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysyłanie formularza na inną stronę
Forum PHP.pl > Forum > PHP
c4ld3ra
Witam, chciałbym wysłać na inną stronę uzupełniony formularz, problem mam w tym, że aby dokonać jakiś operacji na wysłanych danych na tą stronę trzeba być na niej zalogowanym, i mam pytanie czy istnieje jakieś sposób na dokonać takiego zabiegu, jakoś się za pomocą php zalogować czy coś.
Pozdrawiam
nospor
słowo klucz: cURL
c4ld3ra
Dzięki, temat do zamknięcia.

Mam problem, chce się zalogować do ryushare ( hosting plików ), z strony logowania wysyłane za 4 zmienne op, redirect, login i password, z czego dwie pierwsze jako ukryte formy. W sumie skrypt "działa" gdy przesyłam nieprawidłowe dane loginu i hasła to otrzymuje stronę z komunikatem o nie poprawnych lognie lub haśle, ale kiedy wysyłam poprawne dane to jako feedback nic nie otrzymuje, biała karta, nawet funkcje związane z blędami nic nie przekazują, i mam pytanie czy coś robię żle czy może serwer blokuje jakoś korzystanie z tej metody logowania. Pozdrawaim

  1. <?php
  2.  
  3. $login ="login";
  4. $password ="haslo";
  5. $op = "login";
  6. $redirect = urlencode("http://ryushare.com/");
  7.  
  8. $c = curl_init();
  9.  
  10. curl_setopt($c,CURLOPT_URL,"http://ryushare.com/");
  11. curl_setopt($c,CURLOPT_REFERER,"http://ryushare.com/login.python");
  12. curl_setopt($c,CURLOPT_POST,1);
  13. curl_setopt($c,CURLOPT_POSTFIELDS,"op=$op&redirect=$redirect&login=$login&password=$password");
  14. curl_setopt($c,CURLOPT_RETURNTRANSFER,1);
  15.  
  16. $ret=curl_exec($c);
  17.  
  18. if( curl_errno($c))
  19. {
  20. echo curl_error($c);
  21. }
  22.  
  23. curl_close($c);
  24.  
  25. echo $ret;
  26.  
  27. ?>
Crozin
Zapewne po poprawnym zalogowaniu strona serwuje pustą stronę, a w nagłówkach odpowiedzi jest przekierowanie.
1. Sprawdź jakie nagłówki HTTP są zawracane: curl_setopt($c, CURL_HEADER, true);.
2. Skonfiguruj cURL-a tak, by automatycznie podążał za przekierowaniami: curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);

Swoją drogą do budowana zwartości POSTFIELDS powinieneś użyć http_build_query - obecnie Twój kod nie będzie działał we wszystkich przypadkach (np. hasło zawierające znak "&").
c4ld3ra
Coś nie działa ten CURLOPT_FOLLOWLOCATION

Kod
PHP Error Message

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/a8236701/public_html/test.php on line 19

Free Web Hosting
HTTP/1.1 302 Found Status: 302 Moved Set-Cookie: aff=3734; domain=.ryushare.com; path=/; expires=Fri, 19-Oct-2012 11:06:16 GMT Set-Cookie: login=c4ld3ra; domain=.ryushare.com; path=/; expires=Mon, 18-Mar-2013 11:06:16 GMT Set-Cookie: xfss=atah4zvai0gmy4zo; domain=.ryushare.com; path=/; expires=Fri, 19-Oct-2012 11:06:16 GMT Date: Wed, 19 Sep 2012 11:06:16 GMT Location: http://ryushare.com/ Connection: close Transfer-Encoding: chunked Server: Ryushare Webserver


Znalazłem w sieci funkcjie umożliwiającą automatyczne przekierowania, po jej zastosowaniu nadal brak oczekiwanego efektu.
  1. <?php
  2. function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) {
  3. $mr = $maxredirect === null ? 5 : intval($maxredirect);
  4. if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
  5. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
  6. curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
  7. } else {
  8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
  9. if ($mr > 0) {
  10. $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
  11.  
  12. $rch = curl_copy_handle($ch);
  13. curl_setopt($rch, CURLOPT_HEADER, true);
  14. #curl_setopt($rch, CURLOPT_NOBODY, true);
  15. curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
  16. curl_setopt($rch, CURLOPT_RETURNTRANSFER, true);
  17. do {
  18. curl_setopt($rch, CURLOPT_URL, $newurl);
  19. $header = curl_exec($rch);
  20. if (curl_errno($rch)) {
  21. $code = 0;
  22. } else {
  23. $code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
  24. if ($code == 301 || $code == 302) {
  25. preg_match('/Location:(.*?)\n/', $header, $matches);
  26. $newurl = trim(array_pop($matches));
  27. } else {
  28. $code = 0;
  29. }
  30. }
  31. } while ($code && --$mr);
  32. curl_close($rch);
  33. if (!$mr) {
  34. if ($maxredirect === null) {
  35. # trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING);
  36. } else {
  37. $maxredirect = 0;
  38. }
  39. return false;
  40. }
  41. curl_setopt($ch, CURLOPT_URL, $newurl);
  42. }
  43. }
  44. return curl_exec($ch);
  45. }
  46.  
  47. $login ="login";
  48. $password = "haslo";
  49.  
  50. $op = "login";
  51. $redirect = urlencode("http://ryushare.com/");
  52.  
  53. $c = curl_init();
  54.  
  55. curl_setopt($c,CURLOPT_URL,"http://ryushare.com/");
  56. curl_setopt($c,CURLOPT_REFERER,"http://ryushare.com/login.python");
  57. curl_setopt($c,CURLOPT_POST,1);
  58. curl_setopt($c,CURLOPT_POSTFIELDS,"op=$op&redirect=$redirect&login=$login&password=$password");
  59. curl_setopt($c,CURLOPT_RETURNTRANSFER,1);
  60.  
  61.  
  62. $ret =curl_exec_follow($c);
  63.  
  64.  
  65.  
  66.  
  67.  
  68. curl_close($c);
  69.  
  70. echo $ret;
  71. # ok HTTP/1.1 200 OK Expires: Tue, 18 Sep 2012 11:01:13 GMT Date: Wed, 19 Sep 2012 11:01:13 GMT Content-Type: text/html; charset=UTF-8 Connection: close Server: Ryushare Webserver
  72.  
  73. ?>
  74.  
  75.  
Crozin
Cytat
[...] CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set [...]


W odpowiedzi dostałeś nagłówek informujący o statusie (302 Found) oraz nagłówek Location informujący o adresie na jaki powinieneś się przenieść (Location: http://ryushare.com/). CURL_FOLLOWLOCATION zrobiłoby to automatycznie, ale skoro nie możesz z tego skorzystać powinieneś samodzielnie wykonać jeszcze raz żądanie do strony głównej ryushare.com.
c4ld3ra
Jeśli dobrze zrozumiałem przekaz to sugerujesz powtórne wywołanie funkcji curl_exec, wtedy owszem pokazuje mi się ciało strony ale bez zalogowanego użytkownika.
Crozin
Ponieważ, żeby kolejne żądanie było powiązane z daną sesją musisz przesłać odpowiednie ciasteczka, a konkretniej to zawierające identyfikator sesji. Podtrzymywanie sesji przy użyciu cURL-a.
zegarek84
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
http://wortal.php.pl/Wortal/Artykuly/PHP/B...ol-HTTP/Ciastka
c4ld3ra
Zaczyna działać smile.gif, a mam jeszcze pytanie jak można przesłać metodą post informacje o kliknięciu na konkretny submit, ponieważ jest ich kilka w obrębie formularza i akcja związana z przesyłanymi zmiennymi jest podejmowana na podstawie konkretnego kliknięcia, a dołączanie nazwy submitu do przesyłanych zmiennych chyba nie jest odpowiednią metodą.
Crozin
Chyba każda przeglądarka posiada teraz wbudowane "narzędzia deweloperskie" (Firefox w postaci dodatku Firebug). Zobacz sobie jakie dane przesyła przeglądarka w momencie wysłania formularza - chodzi wyłącznie o obecność pewnych pól i ewentualnie ich wartość, nic więcej.
c4ld3ra
Zainstalowałem ten firebug pod chrome ale w okienku Network widzę jedynie jakie dokumenty zostały przesłane a nie jakie dane w zapytaniu.

Doszukałem się takiego sposobu link, ale na ryushare te submity nie mają pola name wiec odpada sad.gif.
Crozin
Chrome ma wbudowane narzędzia deweloperskie (F12 - chyba w każdej przeglądarce, nie tylko Chrome), a tam zakładkę Network, w której jest wszystko czego Ci potrzeba.
c4ld3ra
Mój poprzedni post odnosił się właśnie do taj opcji w Chrome, choć firebug też zainstalowałem, sam efekt jest widoczny na screenie

ale wg mnie niespecjalnie pomocny.
Crozin
No i masz. Pierwszy element - żądanie typu POST. Kliknij i zobacz jakie dane są w nim przesyłane.
c4ld3ra
Strona przesyla takie dane:


ja zaś to robię w ten sposób :
  1. $c = curl_init("http://http://ryushare.com/file-manager.python?op=my_files&fld_id=19689");
  2. curl_setopt($c,CURLOPT_URL,"http://ryushare.com/");
  3. curl_setopt($c,CURLOPT_REFERER,"http://ryushare.com/file-manager.python?op=my_files&fld_id=19689");
  4.  
  5. $op = "my_files";
  6. $fld_id="19689";
  7. $key="";
  8. $create_new_folder="";
  9. $file_id="5213749";
  10. $to_folder ="19690";
  11. $to_folder_copy=urlencode("Copy files");
  12.  
  13.  
  14.  
  15. curl_setopt($c,CURLOPT_COOKIEFILE,"cookies");
  16. curl_setopt($c,CURLOPT_RETURNTRANSFER, 1);
  17. curl_setopt($c,CURLOPT_POST,1);
  18. curl_setopt($c,CURLOPT_POSTFIELDS,"op=$op&fld_id=$fld_id&key=$key&create_new_folder=$create_new_folder&file_id=$file_id&to_folder&to-folder_copy=$to_folder_copy");
  19. $ret=curl_exec($c);
  20. curl_close($c);


jako wynik otrzymuję stronę z zalogowanym użytkownikiem ale z brakiem oczekiwanego efektu zrobienia kopii pliku do innego katalogu.
Crozin
1. Najpierw wykonaj zwykłe żądanie typu GET do strony z formularzem, by utworzyć sesję. Być może mają jakieś zabezpieczenie przed bezpośrednim wysłaniem formularza.
2. Poza COOKIEFILE powinieneś też ustawić COOKIEJAR.
3. "to_folder_copy", nie "to-folder_copy".
4. Do utworzenia ciągu ze zmiennymi skorzystaj z http_build_query.
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.