opzione javascript o PHP per rilevare lo stato AIM
-
06-07-2019 - |
Domanda
Il sito web è http://www.ipalaces.org/support/
Il codice che uso per gli indicatori di stato è
<img src="http://big.oscar.aol.com/imperialpalaces?on_url=http://www.ipalaces.org/support/widget/status_green.gif&off_url=http://www.ipalaces.org/support/widget/status_offline.gif">
che è una cosa ordinata che big.oscar.aol.com ti consente di fare, lo reindirizza a qualsiasi immagine che hai impostato per on_url se sono online, e lo stesso vale per off_url per offline. Tuttavia, voglio usarlo in un'istruzione if in PHP o javascript per visualizzare cose diverse. Attualmente sto usando questo:
function getaim($screenname) {
$ch = curl_init();
$url = "http://big.oscar.aol.com/$screenname?on_url=true&off_url=false";
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// added to fix php 5.1.6 issue:
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
curl_close($ch);
if(eregi("true",$result)) {
return true;
} else {
return false;
}
}
If (getaim("ImperialPalaces")) { print "Online"; } else { print "Offline"; }
Il problema con questo codice è che per qualche motivo, in momenti casuali, possono essere necessari fino a 12 secondi per recuperare effettivamente i risultati. Considerando che il trucco img standard è quasi istantaneo.
Esiste un problema noto con l'arricciatura? C'è un modo più veloce?
Ho visto qualcuno provare a leggere il .src del tag img e fare un'istruzione if come quella, ma non sono riuscito a farlo funzionare.
Soluzione
Per evitare di aspettare una dozzina di secondi quando le cose non vanno bene, puoi impostare un paio di opzioni in più, come (vedi curl_setopt
):
-
CURLOPT_CONNECTTIMEOUT
: il numero di secondi di attesa durante il tentativo di connessione. Usa 0 per attendere indefinitamente.- impostarlo su un paio di secondi sarebbe sufficiente
-
CURLOPT_TIMEOUT
: il numero massimo di secondi per consentire l'esecuzione delle funzioni cURL.- lo stesso per questo
-
CURLOPT_DNS_CACHE_TIMEOUT
: il numero di secondi per conservare le voci DNS in memoria. Questa opzione è impostata su 120 (2 minuti) per impostazione predefinita.- Probabilmente potresti impostarlo su un valore più alto
Se gli utenti del tuo sito Web rimangono generalmente su di esso per più di una o due pagine, potrebbe essere interessante archiviare tali informazioni in $_SESSION
e recuperarle solo una volta ogni tanto.
Ad esempio, potresti recuperarlo solo se il valore memorizzato nella sessione è stato recuperato più di 5 minuti fa. Probabilmente salverebbe un paio di chiamate :-)
Un altro modo potrebbe essere quello di farlo sul lato client:
- recupera l'immagine con il
<img>
tag - in caso di " online " usa un'immagine che carica OK
- collega un gestore al "
load
" anche dell'immagine, per sostituirla con del testo
- collega un gestore al "
- in caso di " offline " ;, usa un'immagine che si trova in 404
- collega un gestore al "
error
" anche dell'immagine, per sostituirla con del testo
- collega un gestore al "
Non è molto carino (è una specie di " hacky " ;, nel modo sbagliato), ma dovrebbe funzionare ;-)
La tua immagine sarebbe così:
<div id="arround-1">
<img id="img-1" src="http://big.oscar.aol.com/imperialpalaces?on_url=http://www.ipalaces.org/support/widget/status_green.gif&off_url=http://this.is-a-404-error.com"
onload="replace_img_status(1, 1);"
onerror="replace_img_status(1, 0);"
/>
</div>
Si vede che, se l'utente è connesso, status
porta infine a un'immagine esistente; quindi, " 1
" anche sarà licenziato.
E, nel caso in cui l'utente non sia connesso, <=> alla fine porterà a un'immagine che non esiste (sta dando un errore 404) ; quindi, " <=> " l'evento verrà generato.
Ora devi occuparti di questi due casi, con qualcosa del genere:
<script type="text/javascript">
var replace_img_status = function (num, status) {
var div = document.getElementById('arround-' + num);
if (div) {
if (status == 1) {
div.innerHTML = 'Online';
} else {
div.innerHTML = 'Offline';
}
}
};
</script>
Se <=> è <=>, visualizziamo " Online " ;, e, nell'altro caso (" errore "), visualizziamo quot; Offline <> quot!; : -)
Ma, anche se sembra funzionare, non mi piace molto quella soluzione ^^
Altri suggerimenti
+1 a Pascal per questo, ma per chiunque lo desideri in PHP, ed è ancora interessato, ho realizzato un piccolo script che gestisce la posizione dell'intestazione (che ritorna offline / online o qualunque cosa tu abbia messo alla fine di l'URL (ad esempio, on_url = 1, nell'intestazione restituirà Location: 1)
<?php
Define('Username', $_GET['sn']);
Define('URL', 'http://big.oscar.aol.com/' . Username . '?on_url=online&off_url=offline');
Define('Online', 'Location: online'); // Change online to whatever you have for on_url
Define('Offline', 'Location: offline'); // Change offline to whatever you have for off_url
$Response = Get_Headers(URL);
If(In_Array(Online, $Response)){
Echo UCWords(StrToLower(Username)) . ' is currently online.';
}
ElseIf(In_Array(Offline, $Response)){
Echo UCWords(StrToLower(Username)) . ' is currently offline, or has set their privacy settings.';
}
?>