PHP Facebook Cronjob with offline access

Posted by Mohamed Salem on Stack Overflow See other posts from Stack Overflow or by Mohamed Salem
Published on 2012-11-03T22:57:44Z Indexed on 2012/11/03 23:00 UTC
Read the original article Hit count: 262

1:the code to greet the user, ask for his permission and store his session data so that we can use a cronjob with his session data afterwards.

<?php  $db_server = "localhost";   
$db_username = "username";   
$db_password = "password";   
$db_name = "databasename";   
#go to line 85, the script actually starts there   
mysql_connect($db_server,$db_username,$db_password);   
mysql_select_db($db_name);   
#you have to create a database to store session values.  
#if you do not know what columns there should be look at line 76 to see column names.   
#make them all varchars   
# Now lets load the FB GRAPH API  
 require './facebook.php';   
// Create our Application instance.   
global $facebook;   
$facebook = new Facebook(array(  'appId'  => '121036530138',
'secret' => '9bbec378147064',
'cookie' => false,));

# Lets set up the permissions we need and set the login url in case we need it.

$par['req_perms'] = "friends_about_me,friends_education_history,friends_likes, friends_interests,friends_location,friends_religion_politics, friends_work_history,publish_stream,friends_activities, friends_events, friends_hometown,friends_location ,user_interests,user_likes,user_events,      user_about_me,user_status,user_work_history,read_requests, read_stream,offline_access,user_religion_politics,email,user_groups";

$loginUrl = $facebook->getLoginUrl($par);

function save_session($session){
global $facebook;
 # OK lets go to the database and see if we have a session stored
$sid=mysql_query("Select access_token from facebook_user WHERE uid =".$session['uid']);     $session_id=mysql_fetch_row($sid);
if (is_array($session_id)) {
        # We have a stored session, but is it valid?
    echo "
We have a session, but is it valid?";
    try {
        $attachment =  array('access_token' => $session_id[0]);
        $ret_code=$facebook->api('/me', 'GET', $attachment);
        }
        catch (Exception $e) {
            # We don't have a good session so
            echo "
our old session is not valid, let's delete saved invalid session data

";
            $res = mysql_query("delete from facebook_user WHERE uid =".$session['uid']);
                 #save new good session
            #to see what is our session data: print_r($session);
            if (is_array($session)) {
                    $sql="insert into facebook_user (session_key,uid,expires,secret,access_token,sig)
                                          VALUES ('".$session['session_key']."','".$session['uid']."','". $session['expires']."','".
                                          $session['secret'] ."','" . $session['access_token']."','". $session['sig']."');";

                        $res = mysql_query($sql);

                       return $session['access_token'];
            }
            # this should never ever happen
            echo "
Something is terribly wrong: Our old session was bad,
                                      and now we cannot get the new session";
            return;
 }
        echo "
Our old stored session is valid

";
        return $session_id[0];
    }
else    {
    echo "
no stored session, this means the user never subscribed to our application before.

";
        # let's store the session
        $session = $facebook->getSession();
        if (is_array($session)) {
            # Yes we have a session! so lets store it!
            $sql="insert into facebook_user (session_key,uid,expires,secret,access_token,sig)
                         VALUES ('".$session['session_key']."','".$session['uid']."','".  $session['expires']."','".  $session['secret']              ."','".
                 $session['access_token']."','". $session['sig']."');";
$res = mysql_query($sql);
            return $session['access_token'];
        }
    }
}

#this is the first meaningful line of this script.
$session = $facebook->getSession();

# Is the user already subscribed to our application?
if ( is_null($session) ) {
    # no he is not
    #send him to permissions page
        header( "Location: $loginUrl" );
}
else {
        #yes, he is already subscribed, or subscribed just now
    #in case he just subscribed now, save his session information
    $access_token=save_session($session);

 echo "
everything is ok";
# write your code here to do something afterwards
 }
?>

error

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/content/28/9687528/html/ss/src/indexx.php:1) in /home/content/28/9687528/html/ss/src/facebook.php on line 49

Fatal error: Call to undefined method Facebook::getSession() in /home/content/28/9687528/html/ss/src/indexx.php on line 86

2:A cronjob template that reads the stored session of a user from database, uses his session data to work on his behalf, like reading status posts or publishing posts etc.

 <?php
$db_server = "localhost";
$db_username = "username";
$db_password = "pass";
$db_name = "database";

# Lets connect to the Database and set up the table
$link = mysql_connect($db_server,$db_username,$db_password);
mysql_select_db($db_name);


# Now lets load the FB GRAPH API
require './facebook.php';


// Create our Application instance.
global $facebook;
$facebook = new Facebook(array(
  'appId'  => 'appid',
  'secret' => 'secret',
  'cookie' => false,
));


function get_check_session($uidCheck){
    global $facebook;

    # This function basically checks for a stored session and if we have one it returns it
    # OK lets go to the database and see if we have a session stored
    $sid=mysql_query("Select access_token from facebook_user WHERE uid =".$uidCheck);
    $session_id=mysql_fetch_row($sid);
    if (is_array($session_id)) {
        # We have a session
        # but, is it valid?
        try {
        $attachment =  array('access_token' => $session_id[0],);
        $ret_code=$facebook->api('/me', 'GET', $attachment);
        }
        catch (Exception $e) {
        # We don't have a good session so
        echo "
User ".$uidCheck." removed the application, or there is some other access problem.

";
        # let's delete stored data
        $res = mysql_query("delete from facebook_user where WHERE uid =".$uidCheck);
        return;

    }
        return $session_id[0];
    }
    else
    {   # "no stored session";
        echo "
error:newsFeedcrontab.php No stored sessions. This should not have happened

";

    }
}

# get all users that have given us offline access
$users = getUsers();
foreach($users as $user){
    # now for each user, check if they are still subscribed to our application
    echo "
Checking user".$user;
    $access_token=get_check_session($user);
    # If we've not got an access_token we actually need to login.
    # but in the crontab, we just log the error, there is no way we can find the user to give us permission here.
    if ( is_null($access_token) ) {
        echo "
error: newsFeedcrontab.php There is no access token for the user ".$user."

";
    }

    else {
        #we are going to read the newsfeed of user. There are user's friends' posts in this newsfeed
        try{
            $attachment =  array('access_token' => $access_token);
            $result=$facebook->api('/me/home', 'GET', $attachment);
        }catch(Exception $e){
            echo "
error: newsfeedcrontab.php, cannot get feed of ".$user.$e;
        }
        #do something with the result here
               #but what does the result look like?
              #go to http://developers.facebook.com/docs/reference/api/user/ and click on the "home" link under connections

        #we can also read the home of user. Home is the wall of the user who has given us offline access.
        try{
            $attachment =  array('access_token' => $access_token);
            $result=$facebook->api('/me/feed', 'GET', $attachment);
        }catch(Exception $e){
            echo "
error: newsfeedcrontab.php, cannot get wall of ".$user.$e;
        }
        #do something with the result here
        # #but what does the result look like?
              #go to http://developers.facebook.com/docs/reference/api/user/ and click on the "feed" link under connections

    }
}

function getUsers(){

    $sql = "SELECT distinct(uid) from facebook_user Where 1";
    $result = mysql_query($sql);
    while($row = mysql_fetch_array($result)){
        $rows [] = $row['uid'];
    }
 print_r($rows);
    return $rows;
}

mysql_close($link);

?>

error

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/content/28/9687528/html/ss/src/cron.php:1) in /home/content/28/9687528/html/ss/src/facebook.php on line 49

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/content/28/9687528/html/ss/src/cron.php on line 110

Warning: Invalid argument supplied for foreach() in /home/content/28/9687528/html/ss/src/cron.php on line 64

© Stack Overflow or respective owner

Related posts about Wordpress

Related posts about facebook-graph-api