我们正在尝试使用facebook广告报告API来更新第三方应用,以及时了解我们在Facebook上的每日消费情况。我们希望这些值能够通过cron作业自动更新,但这似乎不起作用。我们必须转到页面并刷新它,以便刷新api数据。是否可以让我们的脚本自动更新?这是我们的访问令牌代码。
我认为有可能获得一个长期存在的令牌并将其保存到数据库并使用它但我们无法检索accessToken,因为它:在返回的json中受保护。
use FacebookAds\Api;
use FacebookAds\Object\AdSet;
use FacebookAds\Object\AdGroup;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\Fields\AdGroupFields;
use FacebookAds\Object\AdAccount;
use FacebookAds\Object\Fields\AdAccountFields;
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookSDKException;
use Facebook\Entities\AccessToken;
// Initialize the SDK
FacebookSession::setDefaultApplication( $app_id, $app_secret );
// Create the login helper and replace REDIRECT_URI with your URL
// Use the same domain you set for the apps 'App Domains'
// e.g. $helper = new FacebookRedirectLoginHelper( 'redirect' );
$helper = new FacebookRedirectLoginHelper( $redirect_uri );
// Check if existing session exists
if ( isset( $_SESSION ) && isset( $_SESSION['fb_token'] ) ) {
// Create new session from saved access_token
$session = new FacebookSession( $_SESSION['fb_token'] );
// Validate the access_token to make sure it's still valid
try {
if ( ! $session->validate() ) {
$session = null;
}
} catch ( Exception $e ) {
// Catch any exceptions
$session = null;
}
} else {
// No session exists
try {
$session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
// When Facebook returns an error
} catch( Exception $ex ) {
// When validation fails or other local issues
echo $ex->message;
}
}
// Check if a session exists
if ( isset( $session ) ) {
// Save the session
$_SESSION['fb_token'] = $session->getToken();
$access_token = $_SESSION['fb_token'];
$long_session = $session->getLongLivedSession();
//print_r($long_session);
$longtoken = $long_session->getToken();
// Create session using saved token or the new one we generated at login
$session = new FacebookSession( $long_session->getToken() );
} else {
// No session
// Get login URL
$loginUrl = $helper->getLoginUrl( $permissions );
//echo '<a href="' . $loginUrl . '">Log in</a>';
header('Location: '.$loginUrl.'');
}
// Initialize a new Session and instanciate an Api object
Api::init($app_id, $app_secret, $access_token);
// The Api object is now available trough singleton
$api = Api::instance();
// Get the GraphUser object for the cusrrent user:
try {
$me = (new FacebookRequest(
$session, 'GET', '/me'
))->execute()->getGraphObject(GraphUser::className());
// echo $me->getName();
} catch (FacebookRequestException $e) {
// The Graph API returned an error
} catch (\Exception $e) {
// Some other error occurred
}
答案 0 :(得分:2)
我在你的帖子中读到了两个问题,第一个是你希望有一个后台进程(由cron调用)来读取你的日常开支,第二个是你没有一个长期存在的用户访问令牌所以你的脚本没有正常工作。
如果我正确理解你的目标,似乎这两个问题有点混淆,我建议分开。按照Facebook access token documentation获取长期存在的令牌并直接在脚本中使用它。跳过PHP会话管理,只需将长寿命令牌放在数据库,简单配置文件中,或直接放入脚本中。
然后,如果您还没有,请让cron或其他预定的后台处理系统调用此脚本。它可以提取您的每日支出数据并将其提供给第三方应用。