Jak za pomocą PHP pobrać źródło strony stworzonej w AJAX

0

Witam

Potrzebuję pobrać za pomocą skryptu PHP źródło strony, która jest napisana w AJAX-ie.
CURL i FILE_GET_CONTENTS nie zdają egzaminu, ponieważ pobierają źródło strony, które zostało wygenerowane przez serwer a ja chcę pobrać źródło tego co jest wyświetlane przez przeglądarkę.
Dla przykładu:

Dane, które otrzymuję po użyciu zarówno CURL jak i GET_FILE_CONTENTS wyglądają tak:

Natomiast wynik wyświetlany w przeglądarce wygląda tak:

236

i właśnie ten drugi próbuję bezskutecznie otrzymać.
Za wszelką pomoc będę wdzięczny.

0

sprawdź jakimś frebugem czy czymś innym jakie żadanai wysyła strona i pod jaki adres, i curlem lub file_get_contents wyślij takie same i je odbierz, tylko pewnie będzie to czysty text bez html, ewentualnie będą w formie xml lub json, ale jeżeli ten przykład co podałeś jest prawdziwy to raczej to będzie czysty tekst ;)

0

podaj adres strony jak już totalnie bedziesz bezradny

0

Jestem totalnie bezradny, więc podam :)

http://clan.z8games.com/charstat_cf.aspx?usn=12093382

Tworzę statystyki i muszę pobrać dane ze strony. Wcześniej robiłem to bez problemu ale ostatnio admin strony przeszedł na ajaxa i się wszystko sypnęło.
Chodzi mi o to żeby wyciągnąć np. liczbę headshotów, która wyświetla się jako 8569 a w kodzie źródłowym jest jako id="td_headshots". Nie wiem jak ustanowić zapytanie żeby powiązać te dwie rzeczy w jedno i w wyniku otrzymać liczbę zamiast id.

0

Ja bym poszedł w kierunku czegoś w stylu http://search.cpan.org/~slanning/Mozilla-Mechanize-0.06/lib/Mozilla/Mechanize.pm , może to perl, ale chyba rozumiesz o co mi chodzi (a jak nie, to chodzi mi o wykorzystanie silnika istniejącej przeglądarki do poradzenia sobie z AJAXem).

0

Zjarek, przerzuciłeś się na heroinę? Po co embedować silnik przeglądarki żeby przeparsować JSON?! Asynchroniczne requesty na stronie przyjmują i zwracają dane w tym formacie.

http://pl.php.net/json_decode

Zapytanie:
{"usn":12093382}

Odpowiedź:
{"d":"{\"usn\":12093382,\"nick\":\"TomTheMad\",\"lev\":25,\"playCnt\":2684,\"winCnt\":1340,\"loseCnt\":1359,\"enemyKillCnt\":36117,\"deathCnt\":26803,\"exp\":273968,\"headshotKillCnt\":8569,\"friendKillCnt\":73,\"escapeCnt\":236,\"regDate\":\"2011\",\"lastPlayDate\":\"2011-09-22\",\"guildid\":2590,\"clanName\":\"PolishElite™\",\"memberType\":null,\"gcClanID\":54996}"}

0

dokładnie tak jak napisał Demonical Monk:

wysyłasz POSTem takie dane:
{"usn":12093382} lub w php: json_encode(array("usn" => 12093382))
na adres
http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo

i odebrany tekst przetwarzasz tak:
$odebranytekst = ...; // tutaj dane odczytane curlem
$dane = json_decode($odebranytekst,true);
$headshoty = $dane["d"]["headshotKillCnt"];
nie jestem pewien czy tego $dane["d"] czasem nie trzeba drugi raz dekodować, a już późno i nie chce mi sie myslec.

0

No właśnie największy problem sprawia mi to wysłanie danych "usn":12093382 na stronę http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo . Jak już to zrobię to z dalszą częścią powinienem już sobie poradzić.

0
tomtheman napisał(a)

No właśnie największy problem sprawia mi to wysłanie danych "usn":12093382 na stronę http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo . Jak już to zrobię to z dalszą częścią powinienem już sobie poradzić.

Może pomóc też biblioteka cURL: http://pl2.php.net/curl
Tutoriali i przykładów użycia jest mnóstwo zarówno w komentarzach jak i w google.

0

Próbuję coś wykombinować ale coś kiepsko mi idzie. Ciągle dostaję komunikat, że strona nie istnieje.
Pewnie złapiecie się za głowę, że ktoś mógł takie bzdury stworzyć.

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo?usn=12093382");
$dane = curl_exec($ch);
$odebranytekst = json_decode($dane,true);
$headshoty = $dane["d"]["headshotKillCnt"];
echo $headshoty;
0

Masz przesłać JSON, metodą POST. Ty robisz GETa po prostu...
Zresztą danych bodajże żadnych nie odbierzesz jeśli nie ustawisz opcji CURLOPT_RETURN_TRANSFER.
Odsyłam do przykładów w manualu PHP.

0

Już trochę poprawiłem ale dalej nie działa.

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, 'usn=12093382'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$dane = curl_exec($ch); 
curl_close($ch);
$odebranytekst = json_decode($dane,true);
$headshoty = $dane["d"]["headshotKillCnt"];
echo $headshoty;
?>
0

To ma być format JSON, a nie RAW POST :|

curl_setopt($ch, CURLOPT_POSTFIELDS, '{"usn":12093382}');

Nie przekształcaj danych które masz pod nosem.

0

Zmieniłem ale nic mi nie drukuje. Pisaliście coś wyżej o podwójnym kodowaniu. Może to właśnie przez to?

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"usn":12093382}'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$odebranytekst = curl_exec($ch); 
curl_close($ch);
$dane = json_decode($odebranytekst,true);
$headshoty = $dane["d"]["headshotKillCnt"];
echo $headshoty;
?>
0

Dowiedz się jak wyglądają dane po zdekodowaniu. Za linijką z 'json_decode' daj:

var_dump($dane);
0

po zdekodowaniu dostaję NULL

0

No to zajrzyj do dokumentacji dla json_decode i przeczytaj kiedy zwraca NULL...

0

Jest napisane, że NULL zwraca jak json nie może być zdekodowany lub gdy dane są głębiej niż limit rekurencji.
Czyli w tym przypadku oznacza to, że nie da się wyciągnąć danych czy trzyba użyć innego sposobu?

0

Masz:

<?php
  $usn = 12093382;
  
  $useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2';
  $accept = 'application/json, text/javascript, */*; q=0.01';
  $contenttype = 'application/json; charset=utf-8';
  $xrequestedwith = 'XMLHttpRequest';

  // pobranie cookies - czyli udawanie ze wchodzisz na ta strone z linka
  $ckfile = tempnam("/tmp", "CURLCOOKIE");
  $ch = curl_init("http://clan.z8games.com/charstat_cf.aspx?usn=" . $usn);
  curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);

  // udawanie ze wysylasz zapytanie przez XMLHttpRequest
  $ch = curl_init('http://clan.z8games.com/clanServices.asmx/getPlayerPublicInfo');
  curl_setopt($ch,CURLOPT_HTTPHEADER,
      array
        (
          "Accept: " . $accept,
          "X-Requested-With: " . $xrequestedwith,
          "Content-Type: " . $contenttype
        ));
  curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_REFERER, "http://clan.z8games.com/charstat_cf.aspx?usn=" . $usn); 
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("usn"=>$usn))); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);

  // przetworzenie wynikow
  $responsearray = json_decode($response,true);
  $data = json_decode($responsearray["d"],true);

  // wyciagniecie interesujacych danych
  $headshots = $data["headshotKillCnt"];

  // wypisanie shitu
  echo $headshots;
?>

mozesz sprawdzic czy bez czesci z cookies tez pojdzie, bo na pewno nie dzialalo jak sie nie ustawilo dodatkowych naglowkow (nie sprawdzalem dokladnie ktorych - po prostu zasymulowalem jak robi mozilla)

0

Dzięki mistrzu :)
Ja pewnie jeszcze z miesiąc bym nad tym siedział a ty napisałeś to w ciągu kilku minut.
Zdecydowanie muszę się jeszcze duuuużo nauczyć.
Pozdrawiam

ps. podziękowania również dla Demonical Monk

0

Sorry za odgrzewanie tematu ale mam podobny problem (z tą samą stroną)

Jak otrzymać dane poszczególnych graczy w przypadku jak każdy gracz jest zapisany jako rekord w tablicy?

Dane są na stronie:

http://clan.z8games.com/clanstat_cf.aspx?guildid=179955

W tym przypadku zapytanie wysyłam pod adres:

http://clan.z8games.com/clanServices.asmx/getClanMembers

postem wysyłam dane:

{"clanid":"179955"}

a otrzymuję:

{"d":"[{"usn":7742375,"nick":"Gianni94","lev":17,"clan_points":130,"memberType":"9"},{"usn":8657341,"nick":"bobydick105","lev":17,"clan_points":110,"memberType":"8"},{"usn":12927224,"nick":"c0munista","lev":8,"clan_points":21,"memberType":"0"},{"usn":13227749,"nick":"LostNemesis","lev":6,"clan_points":13,"memberType":"0"},{"usn":9423004,"nick":"Italiano17","lev":4,"clan_points":4,"memberType":"0"}]"}

W poprzednim przypadku nie ma problemu bo jest tylko jeden gracz z unikatowymi danymi ale tutaj jest już tablica graczy. Co zrobić żeby osobno otrzymać dane każdego gracza?

Próbowałam czegoś takiego (wzorowałam się na pierwszym przykładzie):

<?php
$useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2';
$accept = 'application/json, text/javascript, */*; q=0.01';
  $contenttype = 'application/json; charset=utf-8';
  $xrequestedwith = 'XMLHttpRequest';
  
	$clanid = "179955";
 
  $ckfile = tempnam("/tmp", "CURLCOOKIE");
  $ch = curl_init("http://clan.z8games.com/clanstat_cf.aspx?guildid=" . $clanid);
  curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);
 
  $ch = curl_init('http://clan.z8games.com/clanServices.asmx/getClanMembers');
  curl_setopt($ch,CURLOPT_HTTPHEADER,
      array
        (
          "Accept: " . $accept,
          "X-Requested-With: " . $xrequestedwith,
          "Content-Type: " . $contenttype
        ));
  curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_REFERER, "http://clan.z8games.com/clanstat_cf.aspx?guildid=" . $clanid); 
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("clanid"=>$clanid))); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);
 
  $responsearray = json_decode($response,true);
  $data = json_decode($responsearray["d"],true);
  
  $usn=$data['usn'];
  echo $usn;
  ?>

W którym miejscu robię błąd?

0

Ok. Już sama do tego doszłam. Nie było pytania :)

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