Мы пытаемся использовать API отчетов о рекламе на Facebook для обновления стороннего приложения, чтобы быть в курсе наших ежедневных расходов на 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
}
Я прочитал два вопроса в вашем посте, во-первых, вы хотели бы иметь фоновый процесс (запускаемый cron), который считывает ваши ежедневные расходы, и, во-вторых, у вас нет жетона долгосрочного доступа пользователя, поэтому ваш скрипт не т работает правильно.
Если я правильно понимаю ваши цели, кажется, что эти две проблемы немного схожи, и я рекомендую их разделить. Следовать Документация по токену доступа к Facebook для получения долгоживущего токена и использования его непосредственно в вашем скрипте. Пропустите управление сессиями PHP и просто поместите долгоживущий токен в базу данных, простой файл конфигурации или непосредственно в скрипт.
И затем, если вы еще этого не сделали, вызовите этот сценарий cron или другой запланированной системой фоновой обработки. Он может получить данные о ваших ежедневных расходах и предоставить их стороннему приложению.
Других решений пока нет …