Jeg har f�r skrevet herinde og spurgt til forskellige m�der
hvorp� man kan "grabbe" tekst fra andre sider via PHP, og I har
hver gang form�et at hj�lpe mig til fulde :) Jeg er dog nu igen
st�dt p� en tricky en...
Jeg kunne godt t�nke mig at grabbe teksten, der st�r som "Current
Song", p� http://78.157.97.206:8000/played.html
Jeg har fors�gt mig med f�lgende php-script:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div"><?php
$dom = new DomDocument();
$dom->loadHTMLFile("http://78.157.97.206:8000/played.html");
$song = $dom->getElementsByTagName("td");
print $song->item(15)->textContent; ?></div>
</body>
</html>
. men resultatet af dette bliver bare:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div">div>
</body>
</html>
. alts� lykkes det �jensynligt ikke scriptet, at grabbe noget
som helst :(
Jeg ved selvf�lgelig ikke om der, p� SHOUTcast's Song History, er
en eller anden foranstaltning, der forhindrer den her slags
grab-metode. Men hvis der er �n af jer, som kan gennemskue
hvordan dette kan g�res, vil jeg v�re taknemmelig.
Venligst
Ace
--
Vil du l�re at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- P�dagogiske tutorials p� dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
Det er altid en god id� at fejls�ge f�rst ;-)
$html = $dom->loadHTML.....
var_dump($html);
exit;
// Returns
Warning:
DOMDocument::loadHTMLFile(http://78.157.97.206:8000/played.html)
[domdocument.loadhtmlfile]: failed to open stream: HTTP request failed!
ICY 404 Resource Not Found in D:\wwwroot\localhost\www\grab.php on line 5
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: I/O
warning : failed to load external entity
"http://78.157.97.206:8000/played.html" in
D:\wwwroot\localhost\www\grab.php on line 5
bool(false)
Dette er fordi PHP ikke kan l�se fra en anden port end port 80 af...
S� du skal have fat i cURL istedet...
$ch = curl_init("http://78.157.97.206/played.html");
// Bem�rk ingen port i URL'en !
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
// Her s�tter vi f�rst porten
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
var_dump($content);
exit;
En fandens masse HTML f�r du s� retur...
Nu kan du s� loade HTML'en ind i DOMDocument
$dom = new DomDocument();
$debug = $dom->loadHTML($content);
var_dump($debug); // f�r vi det rigtige retur?
Som jeg lige hurtigt har gennemskuet DOMen s� ser det ud til at der
mangler at blive afsluttet en <font> s� jeg tror du f�r en lille fejl.
> Det er altid en god id� at fejls�ge f�rst ;-)
Ja det har selvf�lgelig ret i :) Desv�rre er jeg oprigtig talt bare en
knallert til det her med PHP, s� var desv�rre ikke engang klar over hvordan
jeg skulle b�re mig ad med en umiddelbar fejls�gning :)
> En fandens masse HTML f�r du s� retur...
> Nu kan du s� loade HTML'en ind i DOMDocument
Vil det s� sige, at scriptet skal se s�dan ud?:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div"><?php
$ch = curl_init("http://78.157.97.206/played.html");
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
var_dump($content);
exit;
$dom = new DomDocument();
$debug = $dom->loadHTML($content);
var_dump($debug);
$song = $dom->getElementsByTagName("td");
print $song->item(15)->textContent;?></div>
</body>
</html>
> Som jeg lige hurtigt har gennemskuet DOMen s� ser det ud til at der
> mangler at blive afsluttet en <font> s� jeg tror du f�r en lille fejl.
Med scriptet sat sammen, som det st�r ovenfor, kan siden ganske enkelt ikke
vises i hverken IE eller Firefox :( Beklager hvis det er mig der overser
noget totalt indlysende, men ville du evt. have noget i mod, at sammens�tte
scriptet for mig, s� det kan vises i browseren?
> Med scriptet sat sammen, som det st�r ovenfor, kan siden ganske enkelt ikke
> vises i hverken IE eller Firefox:( Beklager hvis det er mig der overser
> noget totalt indlysende, men ville du evt. have noget i mod, at sammens�tte
> scriptet for mig, s� det kan vises i browseren?
Shoutcast synes at foresp�rgslen fra cUrl ser mist�nkelig ud, s� vi skal
have cUrl til at forkl�de sig som fx Firefox:
curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows;
U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7:
1.0');
Der ud over er html'en fra Shoutcast ukorrekt, og det giver problemer
for Dom.
Enten skal du bruge Tidy til at korrigere html'en, eller du kan bruge
regex. Jeg foresl�r det sidste i dette tilf�lde.
S� ser koden s�dan ud:
$ch = curl_init("http://78.157.97.206/played.html");
curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows;
U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7:
1.0');
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
preg_match('|<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>|is', $content, $matches);
$current = $matches['current'];
echo $current;
Hilsen
Martin
> Bem�rk at linje 2 er brudt, det skal v�re �n lang linje
Yes, jeg tog h�jde for at linjen var brudt, men det lader
desv�rre stadig ikke til at fungere :(
Test:
http://clubace.dk/CAplayer/on_kristennetradio_rawSource.php
I ovenst�ende php-dokument ser koden s�ledes ud:
<html>
<head>
<script type="text/javascript">
setTimeout('location.reload(true)',1000);
</script>
</head>
<body>
<div id="on_air" class="div"><?php
$ch = curl_init("http://78.157.97.206/played.html");
curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0
(Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909
Firefox/1.5.0.7: 1.0');
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_PORT,8000);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content = curl_exec ($ch);
preg_match('<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>is', $content, $matches);
$current = $matches['current'];
echo $current; ?></div>
</body>
</html>
. browseren kan tilsyneladende stadig vise siden.
Nu er jeg som sagt total novice hvad dette ang�r, s� mit f�lgende
sp�gsm�l vil sikkert f� �n til at ryste p� hovedet i
fortvivlelse.. men skal man s�tte sin computer op til at kunne
afvikle cURL, eller s�dan noget? Jeg har p� nuv�rende tidspunkt
blot installeret Apache og PHP5.
> browseren kan tilsyneladende stadig vise siden
Du har ikke kopieret min kode korrekt ind!
Linjen med preg_match() skal v�re:
preg_match('|<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>|is', $content, $matches);
Du har af en eller anden grund fjernet de to lodrette streger, og den
g�r alts� ikke! :-)
> men skal man s�tte sin computer op til at kunne
> afvikle cURL, eller s�dan noget? Jeg har p� nuv�rende tidspunkt
> blot installeret Apache og PHP5
Ja, det skal man.
Hvis det er Windows, skal du finde din php.ini og lede efter f�lgende linje:
extension=php_curl.dll
Hvis der st�r et semikolon foran skal du fjerne det. Og s� skal du sikre
dig at php_curl.dll findes i mappen ext.
Er det Linux, afh�nger det lidt af din disto.
Men m�ske er curl allerede aktivt. Pr�v at lave en fil med <?php
phpinfo(); ?> i og se hvad outputter er. S�g efter "curl" i browseren.
Hilsen
Martin
> Du har ikke kopieret min kode korrekt ind!
Okay, lyder lidt m�rkeligt.. jeg markerede ellers bare din kode, og satte den
direkte ind i mit php-dokument :S
> Linjen med preg_match() skal v�re:
>
> preg_match('<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
> Song</b></td>\s*</tr>is', $content, $matches);
>
> Du har af en eller anden grund fjernet de to lodrette streger, og den
> g�r alts� ikke! :-)
Undskyld, men hvilke to lodrette streger referer du til?
> Hvis det er Windows, skal du finde din php.ini og lede efter f�lgende linje:
>
> extension=php_curl.dll
>
> Hvis der st�r et semikolon foran skal du fjerne det. Og s� skal du sikre
> dig at php_curl.dll findes i mappen ext.
Ja, det er Windows jeg bruger, og jeg har nu fjernet semikolonet der stod foran
extension=php_curl.dll i min php.ini, og sikret mig at php_curl.dll ligger i
ext-mappen :) Skulle min computer s� v�re sat op til cURL?
> Undskyld, men hvilke to lodrette streger referer du til?
Det kunne se ud som om dit mailprogram simpelthen fjerner de to lodrette
streger. For de er v�k n�r du citerer linjerne! Her er to lodrette
streger mellem udr�bstegnene, ser du dem? !||!
N�, men s� bruger vi bare et andet tegn, fx nummertegn ##, og linjen ser
da s�dan du:
preg_match('#<tr>.*<td>(?P<current>.*)(?:</td>)?\s*<td><b>Current
Song</b></td>\s*</tr>#is', $content, $matches);
> Ja, det er Windows jeg bruger, og jeg har nu fjernet semikolonet der stod foran
> extension=php_curl.dll i min php.ini, og sikret mig at php_curl.dll ligger i
> ext-mappen :) Skulle min computer s� v�re sat op til cURL?
Ja.
Men du skal genstarte Apache f�r det virker.
Hilsen
Martin
Alternativt skal man i stedet loade XML status filen fra Shoutcast
serveren. Den findes i dette tilf�lde p�:
http://78.157.97.206:8000/admin.cgi?pass=yourpass&mode=viewxml&page=0
yourpass skal naturligvis erstattes med admin passwordet.
- Chano Andersen
http://kreacom.dk/files/shoutcast.php
Og kildeteksten her:
http://kreacom.dk/files/shoutcast.txt
S� skulle der ikke v�re problemer med manglende tegn :-)
Hilsen
Martin