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


86

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

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

すべてうまくいっていますが、どうすればその情報にアクセスできますか?

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

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

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

3
何をしてvar_dump($obj);出力?
Jayrox 2010

回答:


76

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

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

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

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


さて、file_get_contentsを変更しました。しかし、req_perms = emailをどこに渡すかについて少し混乱しています。
kylex 2010

10
気にしないでください、私はそれを理解しました:$ facebook-> getLoginUrl(array( 'req_perms' => 'email'))
kylex 2010

14
この回答に基づいて、私には完全には明らかではありませんでした... JavaScript APIを使用している場合は、使用したいFB.api('/me?scope=email', function(apiResponse) { ... });
Olson.dev 2013年

58
// 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']
);

2
/meルートを説明するリファレンスページはどこかにありますか?Graph APIでページを閲覧し続けていますが、どこにも見つかりません:(
Radu Murzea 2017年

3
/ me?locale = en_US&fields = name、emailは、メールアドレスを返すために私が理解できる唯一の方法でした。このオンラインへの他の参照は見つかりませんでした
Ashley

ここにドキュメントがあります-developers.facebook.com/docs/graph-api/reference/user@RaduMurzea
arku

1
:シンプルな説明はここで見つけることができるが、これは、正しい答えであるstackoverflow.com/questions/37349618/...
HoldOffHunger

これをありがとう..これ以外は何も機能しませんでした。今では正常に動作しています!:)
スーパーサン

19

base_facebook.phpを開きます関数でAccess_tokenを追加します getLoginUrl()

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'));
}

6

ユーザーの電子メールを取得するには、emailアクセス許可を使用してFacebookアカウントでユーザーにログインする必要があります。そのためにFacebookPHP 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

ステータスが戻ったときにこれらのコードブロックを追加し、クエリ文字列オブジェクト{}の受け渡しを開始するだけです。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 !');
    }
  }

これには、変数に設定されているユーザーIDも含まれています。次に、getUserInfo関数が呼び出され、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);
      }
    );
  }

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

//メールでログイン

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 !');
      }
    });
  }

こんにちは@Pang、あなたは今チェックすることができます、私はこれが役立つかもしれないと思います。しかし、さらに良いことに、さらに多くの問題にコメントすることができます。
デリノ2018年

+だけのために英雄のステータス「/」+のuserId +「/フィールド= ID、名前、電子メール?」マニュアルに指定されていない
therightstuff

5

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

<?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"]);
    }
?>

4
これは私にはうまくいきません。$user_profileメールは含まれていません
zed Blackbeard 2016

3

ユーザーがアプリからログインしたときにメールのアクセス許可をリクエストし、有効なトークンを持っていると仮定すると、

APIをフェッチあなただけのことができます

const token = "some_valid_token";
const response = await fetch(
        `https://graph.facebook.com/me?fields=email&access_token=${token}`
      );
const result = await response.json();

結果は次のようになります。

{
    "id": "some_id",
    "email": "name@example.org"
}

とにかくidが返されます。

フィールドにクエリパラメータにさらに多くのものを追加できますが、それらがパブリックプロファイルにない場合(名前はパブリック)、それらの権限が必要です。

?fields=name,email,user_birthday&token=

https://developers.facebook.com/docs/facebook-login/permissions


不要なSDKの使用を想定していない回答が大好きです。
リルマン

1

https://graph.facebook.com/me

現在ログインしているユーザーに関する情報が表示されますが、oauthトークンを指定する必要があります。見る:

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


13
延長された許可なしにそれを取得することはできません。
グレイガー2010

またはフィールドのパラメータを指定せずにマニュアルで指定されていない「/ ME /フィールド= ID、名前、電子メール?」
therightstuff

1

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


0

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

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



0

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

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


0

私にとって、PHP側(getGraphUser()メソッド)でユーザーの電子メールアドレスを収集する際の問題は、Facebookでレンダリングされたボタン(WEBSIDE側で、xfbml = 1で作成)のデフォルトの動作が、FB.login()を暗黙的に呼び出すことでした。 「電子メール」を含まないスコープ。

つまり、次のことを行う必要があります。

1)電話

FB.login(....、{スコープ:メール})

明らかに、ログインプロセスを開始するための独自のボタンを作成します

または

2)scope = "email"属性をxfbmlボタンに追加します

<div class = "fb-login-button" data-size = "large" data-button-type = "continue_with" data-
layout = "rounded" data-auto-logout-link = "false" data-use-continue-as = "true" data-
width = "1000px" scope = "email"> </ div>

PHP側でメールアドレスを収集できるようにします。

それが役に立てば幸い。


0

まず、Facebook DeveloperCenterでアプリケーションをアクティブ化します。開発モードのアプリケーションは、電子メールフィールドを取得できません。

ユーザーがログインしていない場合は、ログインして、アプリケーション/サイトに電子メールフィールドが必要であることを指定する必要があります。

FB.login(
    function(response) {
         console.log('Welcome!');
    },
    {scope: 'email'}
);

次に、ログイン後、またはユーザーがすでにログインしている場合は、Facebook APIを使用して、フィールドemailを指定して電子メールを取得します。

FB.api('/me', {fields: 'name,email'}, (response) => {
    console.log(response.name + ', ' + response.email);
    console.log('full response: ', response);
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.