web-dev-qa-db-ja.com

Facebook User-Agentを認識する方法

FBで自分のページの1つを共有するとき、何か別のものを表示したい。問題は、og:要素を使用するのではなく、FBユーザーエージェントを認識することです。

それは何ですか?見つかりません。

52
Himberjack

ユーザーエージェント文字列のリストについては、 here を参照してください。 2015年9月現在、最も使用されているのはfacebookexternalhit/*およびFacebot。あなたがユーザーエージェントを認識しようとしている言語を述べていないので、私はあなたにもっと情報を伝えることができません。 PHPでFacebookボットを認識したい場合は、

if (
    strpos($_SERVER["HTTP_USER_AGENT"], "facebookexternalhit/") !== false ||          
    strpos($_SERVER["HTTP_USER_AGENT"], "Facebot") !== false
) {
    // it is probably Facebook's bot
}
else {
    // that is not Facebook
}

[〜#〜] update [〜#〜]:Facebookは、可能なユーザーエージェント文字列のリストにFacebotを追加しました。変更を反映するようにコードを更新しました。また、コードは、将来の変更の可能性をより予測しやすくなりました。

103
Martin.

「Facebookのユーザーエージェント文字列はfacebookexternalhit/1.1(+ http://www.facebook.com/externalhit_uatext.php )...」

こんにちは

小さいながらも重要な修正-> Facebook外部ヒットは、2つの異なるユーザーエージェントを使用します。

facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) 

フィトラーを1.1のみに設定すると、1.0バージョンでフィルタリングの問題が発生する可能性があります。

Facebookボット(およびその他のボット)の詳細については、 Botopedia.org -Incapsulaを使用したコミュニティソースのボットディレクトリを参照してください。

ユーザーエージェントデータに加えて、ディレクトリにはIP検証オプションもあり、IP /ユーザーエージェントを相互検証できるため、なりすましの試みを防ぐことができます。

16
Igal Zeifman

Facebookクローラーユーザーエージェントは次のとおりです。

FacebookExternalHit/1.1
FacebookExternalHit/1.0

または

facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)

バージョン番号が変更される可能性があることに注意してください。そのため、正規表現を使用してクローラー名を見つけ、コンテンツを表示します。

更新

このコードをPHPで使用して、Facebook User Agentを確認できます。

if(preg_match('/^FacebookExternalHit\/.*?/i',$agent)){
    print "Facebook User-Agent";
    // process here for Facebook
}

ASP.NETコードは次のとおりです。この関数を使用して、userAgentがFacebookのuseragentであるかどうかを確認できます。

public static bool IsFacebook(string userAgent)  
{  
    userAgent = userAgent.ToLower();  
    return userAgent.Contains("facebookexternalhit");  
}  

注意:

なぜそれをする必要があるのですか? Facebookでサイトへのリンクを共有すると、facebookはそれをクロールして解析し、ページからサムネイル、タイトル、およびコンテンツを表示するためのデータを取得しますが、リンクはサイトに戻ります。

また、これはサイトのクローキング、つまりユーザーとクローラーに異なるデータを表示することにつながると思います。クローキングはグッドプラクティスとは見なされず、検索エンジンとサイトがそれに気付く場合があります。

更新:Facebookも2014年5月28日から新しいユーザーエージェントを追加しました

Facebot

Facebookクローラーの詳細については、 https://developers.facebook.com/docs/sharing/webmasters/crawler をご覧ください。

14
Virendra

時々エージェントはvisionutils/0.2。あなたもそれを確認する必要があります。

4
Luchezar

簡単な解決策は、パターンをチェックすることであり、毎回すべての混乱をユーザーにロードすることではありません

<?php
    # Facebook optimized stuff
    if(strstr($_SERVER['HTTP_USER_AGENT'],'facebookexternalhit')) {
        $buffer.='<link rel="image_src" href="images/site_thumbnail.png" />';
    }
?>
3
Alex Khimich

FB側でのユーザーエージェントの変更の観点では、次のような正規表現を使用する方が安全です。

<?php
if (preg_match("/facebook|facebot/i", $_SERVER['HTTP_USER_AGENT'])){
   do_something();
}
?>

Facebookクローラーの詳細については、ドキュメントをご覧ください: https://developers.facebook.com/docs/sharing/webmasters/crawler

1
betelgeuz

また、facebookボットがWebサイトにアクセスするのをブロックする場合(Apacheを使用している場合)、これを.htaccessファイル:

<Limit GET POST>
BrowserMatchNoCase "Feedfetcher-Google" feedfetcher
BrowserMatchNoCase "facebookexternalhit" facebook
order deny,allow
deny from env=feedfetcher
deny from env=facebook
</Limit>

また、安価なDDoSingにも使用できるgoogleのfeedfetcherをブロックします。

1
Juribiyan

Facebookユーザーエージェントは次のとおりです。

FacebookExternalHit/1.1
FacebookExternalHit/1.0
facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.0 (+https://www.facebook.com/externalhit_uatext.php)
facebookexternalhit/1.1 (+https://www.facebook.com/externalhit_uatext.php)

以下のコードを使用してPHPでFB User-Agentを検出していますが、意図したとおりに動作します。

$agent = $_SERVER['HTTP_USER_AGENT'];
if(stristr($agent, 'FacebookExternalHit')){
    //Facebook User-Agent
}else{
    //Other User-Agent
}
1
Pedro Lobito

まず、サブセットだけでなく完全なユーザーエージェントが必要になるため、in_arrayを使用しないでください。したがって、変更ですぐに中断します(つまり、現在の優先回答に従う場合、facebookのバージョン1.2は機能しません)。また、正規表現パターンを使用するよりも、配列を反復処理する方が遅くなります。

間違いなく後でもっと多くのボットを探したいと思うので、パイプでパターンに分割された2つのボット名の例を以下に示します。シンボル。末尾の/ iは、大文字と小文字を区別しません。

また、$ _ SERVER ['HTTP_USER_AGENT']を使用しないでください。ただし、誰かがそこに少し厄介なものが存在する場合に備えて、最初にフィルタリングする必要があります。

$pattern = '/(FacebookExternalHit|GoogleBot)/i';
$agent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_ENCODED);
    if(preg_match($pattern,$agent)){
      echo "found one of the patters"; 
   }

より安全で高速なコード。

1
Andrew Killen

PHPの別の一般的なアプローチ

$agent = $_SERVER['HTTP_USER_AGENT'];
$agent = trim($agent);
$agent = strtolower($agent);
if (
strpos($agent,'facebookexternalhit/1.1')===0
|| strpos($agent,'facebookexternalhit/1.0')===0
){
    //probably facebook
}else{
    //probably not facebook
}
0
Timo Huovinen

上記のFacebookの回答は既にありますが、ユーザーエージェントを取得する方法の1つは、サイトにアクセスするとメールを送信するスクリプトをサイトに配置することです。たとえば、 https://example.com/user-agent.php のドメインでこのファイルを作成します。

<?php
    mail('[email protected]', 'User Agent', $_SERVER['HTTP_USER_AGENT']);

次に、Facebookにアクセスし、そこでスクリプトへのリンクを入力して、スペースバーを押します。実際に何も共有する必要はありません。リンクを入力するだけで、スペースがあればFacebookがプレビューを取得します。その後、Facebookのユーザーエージェントにメールを送信する必要があります。


Enter the link on Facebook

Get an email with the user agent