Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zdalne logowanie poprzez CURL
Forum PHP.pl > Forum > Przedszkole
rob_roy
Witam,

Niech mnie ktoś nakieruje jak może. Chcę się łączyć z serwerem vimeo i pobierać satystyki oglądanych filmów. Aby móc oglądać statystyki 3ba się jednakże zalogować. Chcę aby skrypt się logował robił to wszystko, mam zamiar go wrzucić w crona.

Do rzeczy


Problem dalej aktualny. Zastosowałem się do wskazówek mortus'a oraz lobopol'a.
Obecna wersja wygląda tak:

  1.  
  2. $log ='login';
  3. $pass='hasło';
  4.  
  5.  
  6. $login_url = 'http://vimeo.com/log_in/';
  7. $url = 'http://vimeo.com/stats/video/25793678';
  8.  
  9. $CNF['cookie_file']='cookie.txt';
  10. $CNF['user_agent']='Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30';//$_SERVER["HTTP_USER_AGENT"];
  11. $CNF['referer']='http://vimeo.com/';
  12.  
  13. $agent = $_SERVER["HTTP_USER_AGENT"];
  14. //$header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,;q=0.5";
  15. $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
  16. $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  17. $header[] = "Cache-Control: max-age=0";
  18. $header[] = "Connection: keep-alive";
  19. $header[] = "Keep-Alive: 300";
  20. $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
  21. $header[] = "Accept-Language: en-us,en;q=0.5";
  22. $header[] = "Pragma: ";
  23.  
  24. foreach ($header as $key => $value)
  25. {
  26. $headers[] = $key.': '.$value;
  27. }
  28.  
  29. //var_dump($_SERVER["HTTP_USER_AGENT"],$headers);
  30.  
  31. //sleep(10);
  32. $ch = curl_init();
  33. # Set some default CURL options
  34. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  35. curl_setopt($ch, CURLOPT_HEADER, true);
  36. curl_setopt($ch, CURLOPT_REFERER, 'http://vimeo.com/');//ze niby przyszedlem z vimeo
  37. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  38. curl_setopt($ch, CURLOPT_URL, $login_url);
  39. curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  40. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  41. curl_setopt($ch, CURLOPT_COOKIEFILE, $CNF['cookie_file']);
  42. curl_setopt($ch, CURLOPT_COOKIEJAR, $CNF['cookie_file']);
  43.  
  44. $page = curl_exec($ch);
  45. $page = strip_tags($page,'<input>');
  46. preg_match('<input type="hidden" id="xsrft" class="xsrft" name="token" value="([a-z|0-9]+)?" />',$page,$token);//znajdz tokena
  47. $query = "sign_in[email]=".$log."&sign_in[password]=".$pass."&token=".$token[1];//zbuduj post query
  48.  
  49. curl_setopt($ch, CURLOPT_POSTFIELDS, $query);//ustawy dane w poscie
  50.  
  51.  
  52. curl_setopt($ch, CURLOPT_REFERER, 'http://vimeo.com/log_in');// a teraz dane poszly z login site'u
  53. curl_setopt($ch, CURLOPT_URL, $url);
  54.  
  55. $content = curl_exec($ch);
  56.  
  57.  
  58. curl_close($ch);
  59. //$content = get_web_page($url);
  60. var_dump($content);


Coraz bliżej z tą różnicą, że mechniz wie, że próbuję oszukiwać, oprócz komunikatu, że Unauthorized to odesłany nagłówek wygląda tak:

  1. HTTP/1.0 401 Unauthorized Date: Thu, 30 Jun 2011 17:01:52 GMT
  2. Server: Apache X-Powered-By: PHP/5.3.5-0.dotdeb.0
  3. Expires: Thu, 30 Jun 2011 05:01:52 GMT
  4. Cache-Control: no-store, no-cache, must-revalidate
  5. Cache-Control: post-check=0, pre-check=0
  6. Set-Cookie: uid=0; expires=Sun, 27-Jun-2021 17:01:52 GMT; path=/; domain=.vimeo.com
  7. Vary: Accept-Encoding
  8. Connection: close Content-Type: text/html; charset=UTF-8


Hmm martwi mnie ten czas... oraz ten cache-control

Any IDEAS?
mortus
A co z ukrytym polem token w formularzu logowania? Może w tym problem?
rob_roy
Cytat(mortus @ 30.06.2011, 11:03:21 ) *
A co z ukrytym polem token w formularzu logowania? Może w tym problem?


Hmm, też nad tym właśnie myśle... Zaraz spróbuje. Chociaż w POST go nie widziałem ale może java script go jakoś tam pobiera i przesyła. Dzieki za tip'a. Dam znać jak się uda.
Pzdr


Problem dalej aktualny. Zastosowałem się do wskazówek mortus'a.
  1. $log ='moj login';
  2. $pass='moje haslo';
  3.  
  4.  
  5. $login_url = 'http://vimeo.com/log_in/';
  6. $url = 'http://vimeo.com/stats/video/25793678';
  7. $page = strip_tags(file_get_contents($login_url),'<input>');
  8.  
  9. preg_match('<input type="hidden" id="xsrft" class="xsrft" name="token" value="([a-z|0-9]+)?" />',$page,$token);//znajdz tokena
  10.  
  11. $query = "sing_in[email]=".$log."&sign_in[password]=".$pass."&token=".$token[1];//zbuduj post query
  12. $ch = curl_init();
  13. curl_setopt($ch, CURLOPT_URL, $login_url);//wyslij postem dane
  14. curl_setopt($ch, CURLOPT_POST, 1);
  15. curl_setopt($ch, CURLOPT_POSTFIELDS,$query);
  16. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  17. curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
  18. $data = curl_exec($ch);
  19. curl_close($ch);
  20.  
  21. var_dump($query);


dalej to samo...


Problem dalej aktualny. Zastosowałem się do wskazówek mortus'a.
  1. $log ='moj login';
  2. $pass='moje haslo';
  3.  
  4.  
  5. $login_url = 'http://vimeo.com/log_in/';
  6. $url = 'http://vimeo.com/stats/video/25793678';
  7. $page = strip_tags(file_get_contents($login_url),'<input>');
  8.  
  9. preg_match('<input type="hidden" id="xsrft" class="xsrft" name="token" value="([a-z|0-9]+)?" />',$page,$token);//znajdz tokena
  10.  
  11. $query = "sing_in[email]=".$log."&sign_in[password]=".$pass."&token=".$token[1];//zbuduj post query
  12. $ch = curl_init();
  13. curl_setopt($ch, CURLOPT_URL, $login_url);//wyslij postem dane
  14. curl_setopt($ch, CURLOPT_POST, 1);
  15. curl_setopt($ch, CURLOPT_POSTFIELDS,$query);
  16. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  17. curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
  18. $data = curl_exec($ch);
  19. curl_close($ch);
  20.  
  21. var_dump($query);


dalej to samo...

Problem dalej aktualny. Zastosowałem się do wskazówek mortus'a.
  1. $log ='moj login';
  2. $pass='moje haslo';
  3.  
  4.  
  5. $login_url = 'http://vimeo.com/log_in/';
  6. $url = 'http://vimeo.com/stats/video/25793678';
  7. $page = strip_tags(file_get_contents($login_url),'<input>');
  8.  
  9. preg_match('<input type="hidden" id="xsrft" class="xsrft" name="token" value="([a-z|0-9]+)?" />',$page,$token);//znajdz tokena
  10.  
  11. $query = "sing_in[email]=".$log."&sign_in[password]=".$pass."&token=".$token[1];//zbuduj post query
  12. $ch = curl_init();
  13. curl_setopt($ch, CURLOPT_URL, $login_url);//wyslij postem dane
  14. curl_setopt($ch, CURLOPT_POST, 1);
  15. curl_setopt($ch, CURLOPT_POSTFIELDS,$query);
  16. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  17. curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
  18. $data = curl_exec($ch);
  19. curl_close($ch);
  20.  
  21. var_dump($query);


dalej to samo...
lobopol
Jak zaciągniesz stronę fileget contents a następnie połączysz się curlem to token będzie już inny. Połącz się curlem i nie przerywaj sesji i curlem zaciągnij kod strony i z niego wyciągnij tokena. Dalej nie przerywając sesji wykonuj kolejne działania.
Sephirus


Zhackowane wink.gif cały bajer na przesyłaniu odrazu ciasteczka z tym tokenem - prawdopodobnie ustawiają z Javascript wink.gif


  1. function zaloguj_mnie($login_url)
  2. {
  3. global $log,$pass,$plik;
  4.  
  5. $ch = curl_init();
  6. curl_setopt($ch, CURLOPT_URL, $login_url);
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8. curl_setopt($ch, CURLOPT_COOKIEFILE, $plik);
  9. curl_setopt($ch, CURLOPT_COOKIEJAR, $plik);
  10. curl_setopt($ch, CURLOPT_REFERER, 'http://vimeo.com/');
  11. curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  12. $data = curl_exec($ch);
  13. curl_close($ch);
  14.  
  15. $page = strip_tags($data,'<input>');
  16.  
  17. preg_match('/<input\stype="hidden"\sid="xsrft"\sclass="xsrft"\sname="token"\svalue="([^"]+)"\s\/>/si',$page,$token);//znajdz tokena
  18. //echo $token[1]."\n\n\n".$data; die;
  19.  
  20. $query = "sign_in[email]=".$log."&sign_in[password]=".$pass."&token=".$token[1];//zbuduj post query
  21. $ch = curl_init();
  22. curl_setopt($ch, CURLOPT_URL, $login_url);
  23. curl_setopt($ch, CURLOPT_POST, 1);
  24. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
  25.  
  26. curl_setopt($ch, CURLOPT_POSTFIELDS,$query);
  27. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  28. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  29. curl_setopt($ch, CURLOPT_COOKIE, 'xsrft='.$token[1]);
  30. curl_setopt($ch, CURLOPT_COOKIEJAR, $plik);
  31. curl_setopt($ch, CURLOPT_REFERER, $login_url);
  32. curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  33. $data = curl_exec($ch);
  34. curl_close($ch);
  35.  
  36. return $data;
  37. }
  38.  
  39. function pobierz_dane($url)
  40. {
  41. global $plik;
  42.  
  43. $ch = curl_init();
  44. curl_setopt($ch, CURLOPT_URL, $url);
  45. curl_setopt($ch, CURLOPT_POST, 1);
  46. curl_setopt($ch, CURLOPT_COOKIEFILE, $plik);
  47. curl_setopt($ch, CURLOPT_COOKIEJAR, $plik);
  48. curl_setopt($ch, CURLOPT_REFERER, 'http://vimeo.com/');
  49. curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  50. $data = curl_exec($ch);
  51. curl_close($ch);
  52.  
  53. return $data;
  54. }
  55.  
  56. $log ='login';
  57. $pass='hasło';
  58.  
  59. $login_url = 'http://vimeo.com/log_in/';
  60. $url = 'http://vimeo.com/stats/video/25793678';
  61.  
  62. $plik = 'c:/wamp/www/cookie.txt';
  63.  
  64. $po_logowaniu = zaloguj_mnie($login_url);
  65.  
  66. $dane = pobierz_dane($url);
  67. echo $dane;


HTH! wink.gif

EDIT: Pierwsze wywołanie curla w funkcji zaloguj_mnie() można w sumie śmiało zastąpić file_get_contents()
EDIT: Co do funkcji strip_tags to też jest tutaj zbędna bo jest tylko jeden taki input - w ogóle uważałbym z tą funkcją bo może zgłupiec gdy na stronie są błędy (niedomknięte tagi itp..)
rob_roy
YES!!


Sephirus ogarnął sprawę w 100%, zalogowało mnie.
W końcu mogę się dobrać do tych statystyk.
Dzięki Tobie zaoszczędziłem prawdopodobnie 3-4 dni kombinowania z tym xrsft ciachem... Tak szybko bym na to nie wpadł.
Podoba mi się jeszcze preg z \s white spaces. To sobie zapamiętam.
Dziękuje. biggrin.gif
Masz u mnie piwo i oczywiście skromny "pomógł".

SOLVED.
Topic do zamknięcia.

Pozdrawiam.
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.