Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

"Grab" tekst fra SHOUTcast Song History

1 view
Skip to first unread message

Ace

unread,
Jan 21, 2010, 3:42:56 AM1/21/10
to
Hejza

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

Martin

unread,
Jan 21, 2010, 1:15:25 PM1/21/10
to
On 21-01-2010 09:42, Ace wrote:
> $dom = new DomDocument();
> $dom->loadHTMLFile("http://78.157.97.206:8000/played.html");

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.

Ace

unread,
Jan 22, 2010, 3:20:53 AM1/22/10
to
Martin skrev:

> 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

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?

Martin Larsen

unread,
Jan 22, 2010, 4:12:10 AM1/22/10
to
Ace wrote:

> 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:

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

Martin Larsen

unread,
Jan 22, 2010, 4:13:21 AM1/22/10
to
Bem�rk at linje er brudt, det skal v�re �n lang linje

Martin Larsen

unread,
Jan 22, 2010, 4:13:49 AM1/22/10
to
Bem�rk at linje 2 er brudt, det skal v�re �n lang linje

Ace

unread,
Jan 22, 2010, 4:47:44 AM1/22/10
to
Martin Larsen skrev:

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

Martin Larsen

unread,
Jan 22, 2010, 5:38:10 AM1/22/10
to
Ace wrote:

> 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

Ace

unread,
Jan 22, 2010, 1:23:49 PM1/22/10
to
Martin Larsen skrev:

> 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?

Martin Larsen

unread,
Jan 23, 2010, 8:22:16 AM1/23/10
to
Ace wrote:

> 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


Chano Andersen

unread,
Jan 23, 2010, 1:46:40 PM1/23/10
to
Martin Larsen skrev:

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

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

Martin Larsen

unread,
Jan 23, 2010, 3:14:19 PM1/23/10
to
Du kan se det i aktion her:

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

0 new messages