AIMステータスを検出するjavascriptまたはPHPオプション
-
06-07-2019 - |
質問
ウェブサイトは http://www.ipalaces.org/support/
です。ステータスインジケータに使用するコードは
です<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">
これは、big.oscar.aol.comでできることです。on_urlがオンラインの場合は設定したイメージにリダイレクトし、off_urlもオフラインの場合と同じようにリダイレクトします。ただし、PHPまたはjavascriptのifステートメントでこれを使用して、さまざまなものを表示したいと思います。現在、私はこれを使用しています:
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"; }
このコードの問題は、何らかの理由で、ランダムに結果を実際に取得するのに最大12秒かかる場合があることです。一方、標準のimgトリックはほとんど瞬時です。
curlに既知の問題はありますか?もっと速い方法はありますか?
誰かがimgタグの.srcを読み、そのようなifステートメントを実行しようとするのを見たことがありますが、動作させることができませんでした。
解決
物事がうまくいかないときに数十秒間待つことを避けるために、次のようないくつかのオプションを設定できます( curl_setopt
):
-
CURLOPT_CONNECTTIMEOUT
:接続の試行中に待機する秒数。 0を使用して無期限に待機します。- 数秒に設定するだけで十分です
-
CURLOPT_TIMEOUT
:cURL関数の実行を許可する最大秒数。- これと同じ
-
CURLOPT_DNS_CACHE_TIMEOUT
:DNSエントリをメモリに保持する秒数。このオプションは、デフォルトで120(2分)に設定されています。- おそらくこれをより高い値に設定できます
ウェブサイトのユーザーが通常1ページまたは2ページ以上しかアクセスしない場合、その情報を$_SESSION
に保存し、たまに一度だけ取得するのは興味深いかもしれません。
たとえば、セッションに保存された値が5分以上前に取得された場合にのみ取得できます。おそらく、:-)
の呼び出しを数回保存しますもう1つの方法は、クライアント側でそれを行うことです。
-
<img>
タグで画像を取得 - <!> quot; online <!> quot;の場合、OKを読み込む画像を使用します
- <!> quot;
load
<!> quot;のハンドラを接続します。画像であっても、テキストに置き換えます
- <!> quot;
- <!> quot; offline <!> quot;の場合、404にある画像を使用します
- <!> quot;
error
<!> quot;のハンドラを接続します。画像であっても、テキストに置き換えます
- <!> quot;
それはあまり良いことではありませんが(<!> quot; hacky <!> quot;のようなものですが、間違った方法で)、動作するはずです;-)
あなたの画像は次のようになります:
<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>
ユーザーが接続されている場合、status
が最終的に存在する画像につながることがわかります。したがって、<!> quot; 1
<!> quot;でも解雇されます。
そして、ユーザーが接続されていない場合、<=>は最終的に存在しない画像になります(404エラーを返します);したがって、<!> quot; <=> <!> quot;イベントが発生します。
次のようにして、これら2つのケースを処理する必要があります。
<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>
<=>が<=>の場合、<!> quot; Online <!> quot;を表示し、他の場合(<!> quot; error <!> quot;)には<! > quot;オフライン<!> quot; :-)
しかし、機能しているように見えても、私はその解決策があまり好きではありません^^
他のヒント
+1しますが、PHPでこれを望み、まだ興味がある人のために、ヘッダーの場所を処理する小さなスクリプトを作成しました(オフライン/オンライン、またはURL(たとえば、ヘッダーのon_url = 1、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.';
}
?>