web-dev-qa-db-ja.com

Facebook Graph API、ユーザーにメールを取得する方法は?

Graph APIを使用していますが、ログインユーザーのメールアドレスを取得する方法がわかりません。

Graphの紹介には、「Graph APIは、名前、メールアドレス、プロフィール写真、誕生日など、サイトのサインアップフォームで通常要求するすべての基本的なアカウント登録データへのアクセスを提供できます」と記載されています。

すべて順調ですが、その情報にアクセスするにはどうすればよいですか?

これは私がこれまでに持っているものです:

$json = $facebook->api('/me');

$first = $json['first_name']; // gets first name
$last = $json['last_name'];
79
kylex

ユーザーの電子メールアドレスを取得する唯一の方法は、電子メールフィールドの拡張アクセス許可を要求することです。ユーザーはこれを表示できるようにする必要があり、ユーザーの友人の電子メールアドレスを取得することはできません。

http://developers.facebook.com/docs/authentication/permissions

Facebook接続を使用している場合は、認証ダイアログへの呼び出しのget文字列でscope = emailを渡すことでこれを行うことができます。

File_get_contentsの代わりに SDK を使用することをお勧めします。これは Oauth 認証の実行がはるかに簡単になるためです。

70
Gazler
// Facebook SDK v5 for PHP
// https://developers.facebook.com/docs/php/gettingstarted/5.0.0

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.4',
]);

$fb->setDefaultAccessToken($_SESSION['facebook_access_token']);
$response = $fb->get('/me?locale=en_US&fields=name,email');
$userNode = $response->getGraphUser();
var_dump(
    $userNode->getField('email'), $userNode['email']
);
54
masakielastic

Base_facebook.phpを開き、関数getLoginUrl()にAccess_tokenを追加します

array_merge(array(
                  'access_token' => $this->getAccessToken(),
                  'client_id' => $this->getAppId(),
                  'redirect_uri' => $currentUrl, // possibly overwritten
                  'state' => $this->state),
             $params);

および電子メール許可の使用範囲

if ($user) {
   echo $logoutUrl = $facebook->getLogoutUrl();
} else {
   echo $loginUrl = $facebook->getLoginUrl(array('scope' => 'email,read_stream'));
}
19
Kaletha

ユーザーのメールを取得するには、email権限を使用して、Facebookアカウントでユーザーをログインする必要があります。そのために、次のようにFacebook PHP SDK( githubを参照 )を使用します。

最初に、ユーザーが既にログインしているかどうかを確認します。

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();
if ($user) {
    try {
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        $user = null;
    }
}

そうでない場合は、email許可を求めるログインリンクを表示できます。

if (!$user) {
    $args = array('scope' => 'email');
    echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
} else {
    echo '<a href="' . $facebook->getLogoutUrl() . '">Logout</a>';
}

彼がログインすると、電子メールは$user_profile配列で見つけることができます。

それが役立つことを願っています!

6
Quentin

ログインしているユーザーのプロファイルからメールアドレスを取得できます。これがコードスニペットです

<?php

    $facebook = new Facebook(array(
      'appId'  => $initMe["appId"],
      'secret' => $initMe["appSecret"],
    ));

    $facebook->setAccessToken($initMe["accessToken"]);
    $user = $facebook->getUser();

    if ($user) {
        $user_profile = $facebook->api('/me');
        print_r($user_profile["email"]);
    }
?>
5
Yash Kumar

ステータスの戻り時にこれらのコードブロックを追加し、クエリ文字列オブジェクト{}の受け渡しを開始します。 JavaScript開発者向け

SDKを初期化した後。

ステップ1://ログインステータスを取得する

$(document).ready(function($) {
    FB.getLoginStatus(function(response) {
        statusChangeCallback(response);
        console.log(response);
    });
  });

これにより、ドキュメントの読み込みが確認され、ユーザーがログインしている場合はログインステータスが確認されます。

次に、関数checkLoginStateが呼び出され、応答がstatusChangeCallbackに渡されます

function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

ステップ2:ステータスから応答データを取得します

function statusChangeCallback(response) {
    // body...
    if(response.status === 'connected'){
      // setElements(true);
      let userId = response.authResponse.userID;
      // console.log(userId);
      console.log('login');
      getUserInfo(userId);

    }else{
      // setElements(false);
      console.log('not logged in !');
    }
  }

これには、変数に設定されているseridもあります。その後、getUserInfo funcが呼び出され、Graph-apiを使用してユーザー情報を取得します。

function getUserInfo(userId) {
    // body...
    FB.api(
      '/'+userId+'/?fields=id,name,email',
      'GET',
      {},
      function(response) {
        // Insert your code here
        // console.log(response);
        let email = response.email;
        loginViaEmail(email);
      }
    );
  }

seridを引数として渡した後、関数はseridに関連するすべての情報をフェッチします。注:私の場合、メールでのみユーザーを記録できる機能を実行できるように、メールを探していました。

//メールでログイン

function loginViaEmail(email) {
    // body...
    let token = '{{ csrf_token() }}';

    let data = {
      _token:token,
      email:email
    }

    $.ajax({
      url: '/login/via/email',    
      type: 'POST',
      dataType: 'json',
      data: data,
      success: function(data){
        console.log(data);
        if(data.status == 'success'){
          window.location.href = '/dashboard';
        }

        if(data.status == 'info'){
          window.location.href = '/create-account'; 
        }
      },
      error: function(data){
        console.log('Error logging in via email !');
        // alert('Fail to send login request !');
      }
    });
  }
2
Delino

プロファイル内の電子メールは、拡張アクセス許可を使用して取得できますが、fbへのログインに使用する電子メールを取得することはできません。私のアプリでは、ユーザーの複数のFBアカウントをリストに表示したい、FBアカウントのログインメールをそれぞれのアカウントの一意の識別子として表示したいが、FBから取得できなかったユーザープロファイルのプライマリメールですが、私の場合、ログインメールとプライマリメールは異なります。

1
Karthik Sekar

https://graph.facebook.com/me

は現在ログインしているユーザーに関する情報を提供しますが、oauthトークンを提供する必要があります。見る:

http://developers.facebook.com/docs/reference/api/user

1
Bobby Jack

Facebookアプリケーションが公開されていることを確認してください。メール、public_profile、user_friendsのデータを受信するには、アプリを一般公開する必要があります。

開発目的で後から無効にして、電子メールフィールドを取得できます。

0
Didzis

APIのバージョン番号を、"v2.11"ではなく、"2.11"などのように完全に指定してください。

これが正しくない場合のデフォルト値はわかりませんが、vを忘れたときにメールを取得しようとすると、奇妙なエラーが発生しました。

0
Simon_Weaver

次のツールは、開発中に役立ちます。

アクセストークンデバッガー:詳細については、アクセストークンに貼り付けてください

https://developers.facebook.com/tools/debug/accesstoken/

Graph API Explorer:アクセストークンを貼り付けた後、グラフAPIへのテストリクエスト

https://developers.facebook.com/tools/Explorer

0
Simon_Weaver