I have facebook application that posts to its users timeline as status update. I am using the code below to initiate and post the message to all users, but my issue is the post "via name" on all mobile devices (iphone & BB, Samsung).The post appears on feed wall as if the user posted it himself not the application.
<?PHP
require_once '../scripts/config.php';
require_once '../inc/facebook.php';
$facebook = new Facebook(array(
'appId' => $fb_app_id,
'secret' => $fb_secret,
'cookie' => 'true',
));
$dbh = new PDO('mysql:dbname='.$db_name.';host='.$db_host.';charset=utf8', $db_username, $db_password );
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sqlid = "SELECT SQL_CALC_FOUND_ROWS * FROM offline_access_users";
$sqlmsg = "SELECT message FROM fb_messages WHERE msg_id = (SELECT MAX(msg_id) FROM fb_messages WHERE sent = 'No')";
try {
$userid = $dbh->prepare($sqlid);
$userid->execute();
$id = $userid->fetchAll(PDO::FETCH_COLUMN, 1);
$msg = $dbh->prepare($sqlmsg);
$msg->execute();
$txt = $msg->fetchColumn();
}
catch(PDOException $e)
{
echo $e->getMessage();
die();
}
$counter = 0;
foreach($id as $fbid){
$counter++;
$body = array(
'access_token' => $access_token,
'app_id' => $fb_app_id,
'from' => $fb_app_id,
'message' => $txt,
'display' => "touch",
'redirect_uri' => "http://mydomain.com",
'link' => "",
'picture' => "",
'name' => "",
'caption' => "",
'description' => "",
);
$batchPost=array();
$batchPost[] = array('method' => 'POST', 'relative_url' => "/".$fbid."/feed", 'body' => http_build_query($body));
try {
$multiPostResponse = $facebook->api('?batch='.urlencode(json_encode($batchPost)), 'POST');
$poststs = "Sent Successfully";
}
catch(FacebookApiException $e){
echo $e->getMessage();
error_log($e);
die();
}
}
unset($batchPost);
$dbh = null;
What $access_token are you using? where did the you generate the $access_token?Which $access_token are you using?
The creator of the post (the via...) is whoever created that $access_token - the "from" will always be the owner of the Facebook account regardless of what you place there.
Related
Can anyone tell me how to do this using php sdk.
I have using this code. This code was suppose to post to user's timeline as well as the fan page. The person who is logged in would be the one who is doing the post. So on the fan page
this would have appeared under recent activity. However, now the code has stopped working saying that the user has not authorised the app. I do not understand why this could be happening.
include("../php-sdk/facebook.php");
/*START FACEBOOK lOGIN*/
$facebook = new Facebook(array(
'appId' => Appid,
'secret' => Appsecret,
'cookie' => true
));
$pageId = PageId;
$user= $facebook->getUser();
$newfbuser = 0;
if (!empty($user)) {
$uid = $facebook->getUser();
// $fb_access_token = $facebook->getAccessToken();
$url = $facebook->getLoginUrl(array(
'req_perms' => 'email,status_update,publish_stream, manage_pages'
));
$user = $facebook->api('/me');
$fb_access_token = $facebook->getAccessToken();
$param = array(
'method' => 'users.getInfo',
'uids' => $uid,
'fields' => array('name','sex')
);
$users_getinfo = $facebook->api($param);
$save['oauth_uid'] = $users_getinfo['0']['uid'];
$save['oauth_provider'] = 'facebook';
$save['facebook_email'] = $users_getinfo['0']['email'];
$save['name'] = $users_getinfo['0']['name'];
$link_url = "http://google.com";
$pic = 'http://xxxxx/images/Testing.jpg';
$attachment = array(
'access_token' =>$fb_access_token,
'message' => 'This is a message by bob',
'link' => 'http://xxxxx/');
// print_r($fb_access_token);
echo 'on my timeline<br />';
$facebook->api("/me/feed",'post',$attachment);
$facebook->api("/$pageId/feed",'post',$attachment);
echo 'successfully posted';
}
// $fb_access_token = $facebook->getAccessToken();
$url = $facebook->getLoginUrl(array(
'req_perms' => 'email,status_update,publish_stream, manage'
));
No such thing call "manage", the correct permission was manage_pages
I am using this code to post to the user's wall :
require 'fb/src/facebook.php';
$facebook = new Facebook(array(
'appId' => 'xxx',
'secret' => 'xxx',
));
$params = array(
'canvas' => 1,
'scope' => 'publish_stream,email,user_about_me,user_birthday,user_website',
'redirect_uri' => 'urlhere',
);
$fb_session = $facebook->getUser();
// Session based API call.
if ($fb_session)
{
try
{
$args = array(
'message' => $_GET['by'],
'link' => 'linkhere/',
'caption' => $_GET['test']
);
$post_id = $facebook->api("/me/feed", "post", $args);
}
catch (Exception $e)
{
$fb_login_url = $facebook->getLoginUrl($params);
echo $e->getMessage();
}
}
else
{
$fb_login_url = $facebook->getLoginUrl($params);
}
The code is working till the point uuer clicks on login part to post. After that the url contains a code = xxxzz and a state =yyy but the $fb_session is 0.
This works sometimes without any changes. Please help!
You should include the access token when you try to post to some User Facebook wall.
First get access token:
$fbToken = NULL;
$fbToken = $facebook->getAccessToken();
right after $fb_session = $facebook->getUser();
and then include it in the $args array:
'access_token' => $fbToken
if session is NOT created or access token is not valid, you should redirect the user back to re-authorize your Facebook App.
So in ELSE, you should add
header("Location: $fb_login_url ");
after $fb_login_url = $facebook->getLoginUrl($params);
assuming that everything else is correct, but the access_token is not valid, you should also include header("Location: $fb_login_url "); before echo $e->getMessage();
in both cases you are using getloginurl
shouldn't it be
if ($fb_session) {
try {
$args = array(
'message' => $_GET['by'],
'link' => 'linkhere/',
'caption' => $_GET['test']
);
$post_id = $facebook->api("/me/feed", "post", $args);
} catch (Exception $e) {
$fb_logout_url = $facebook->getLogoutUrl;
.
.
.
When i type this url direct into browser i get the post sent to user feed wall
https://graph.facebook.com/xx facebook uid xx/feed?access_token=xx app access token xx&message=Welcome%20to%20App!&method=post
But it gives me this error OAuthException: Invalid OAuth access token signature. when i automate the post with this code
<?PHP
include_once "inc/facebook.php";
require_once 'inc/config.php';
// Create our application instance
$facebook = new Facebook(array(
'appId' => $app_id,
'secret' => $app_secret,
));
$dbh = new PDO('mysql:dbname='.$db_name.';host='.$db_host.';charset=utf8', $db_username, $db_password );
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare('SELECT fb_id FROM offline_access_users');
$stmt->execute();
$body = array(
'message' => 'Test Multiple Messages',
'link' => '',
'picture' => '',
'name' => '',
'description'=> ''
);
$batchPost=array();
$i=1;
foreach ($stmt as $value) {
$id = $value['fb_id'];
$batchPost[] = array(
'method' => 'POST',
'relative_url' => "/" . $id . "/feed?access_token=" . $access_token,
'body' => http_build_query($body) );
if($i++ == 50) {
try {
$multiPostResponse = $facebook->api('?batch=' . urlencode(json_encode($batchPost)), 'POST');
echo "Success";
} catch(FacebookApiException $e) {
error_log($e);
echo($e);
}
unset($batchPost);
$i=1;
}
}
if(isset($batchPost) && count($batchPost) > 0 ) {
try{
$multiPostResponse = $facebook->api('?batch=' . urlencode(json_encode($batchPost)), 'POST');
echo "Success";
} catch(FacebookApiException $e){
error_log($e);
echo($e);
}
}
$db = null;
?>
I really don't know how to come over this issue. Please help me
Further to Post to users wall upon facebook app submission (my old question), I have came up with the following code however it doesn't seem to be working?? I thought best to open a new question as it is a new question.
What am I doing wrong? Also, where should this code go?
<?php
$session = $facebook->getSession();
//Is user logged in and has allowed this app to access its data
if (!$session) {
$loginUrl = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0,
'next' => 'enter.php',
'cancel_url' => 'index.php',
));
// use the $loginUrl created on the enter button to request permission;
}
$user_id = $facebook->getUser();
//post to wall
$attachment = array('message' => '<message>',
'name' => '<name here>',
'caption' => '<caption here>',
'link' => '<link to app>',
'description' => '<enter description >',
'picture' => '<enter image url>',
'actions' => array(array('name' => '<enter action label>',
'link' => '<enter action url>')
);
$permissions = $facebook->api("/me/permissions");
if( array_key_exists('publish_stream', $permissions['data'][0]) ) {
// Permission is granted!
// Do the related task
try {
$post_id = $facebook->api('/me/feed', 'post', $attachment);
} catch (CurlException $e) {
//timeout so try to resend
$post_id = $facebook->api('/me/feed', 'post', $attachment);
}
catch (FacebookApiException $e) {
error_log($e);
}
} else {
// We don't have the permission
// Alert the user or ask for the permission!
}
// store the post id in-case you need to delete later
?>
I'll just post the code I'm using that works. Hope it helps
fbClass.php
public function __construct() {
// Naredimo instanco
$facebook = new Facebook(array(
'appId' => $this->fbid,
'secret' => $this->fbsecret,
'cookie' => true,
));
$this->facebook = $facebook;
}
function authUser($facebook) {
$user = $facebook->getUser();
if ($user) {
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if (!($user)) {
$loginUrl = $facebook->getLoginUrl(array(
'scope' => 'user_about_me, user_birthday, email, publish_stream',
'redirect_uri' => 'http://apps.facebook.com/myappname/',
));
echo("<script> top.location.href='" . $loginUrl . "'</script>");
} else {
return true;
}
}
process.php
$facebook = $fbClass->facebook;
$fbAuth = $fbClass->authUser($facebook);
if ($fbAuth) {
$res = $facebook->api('/me/feed/', 'post', array(
'message' => MESSAGE,
'name' => NAME,
'caption' => '',
'description' => DESC,
'picture' => PIC,
'link' => 'http://www.facebook.com/myapp/',
'actions' => array('name' => 'Test', 'link' => 'http://apps.facebook.com/myapp/')
));
}
You need a Facebook access token for this code to work. Add your token where My Access token here is in the following code:
$attachment = array(
'access_token' => 'My Access token here',
'message' => '',
'name' => 'My Wall Post Header/Title Here',
'caption' => 'Small caption here',
'link' => 'http://www.mywebsite.org',
'description' => 'Wall Post Details Here',
'picture' => "http://www.mywebsite.org/images/logo.gif",
);
You can get access tokens here.
I'm trying to post a message to a user's wall using the new graph API and PHP. Connection seems to work fine, but no post appears. I'm not sure how to set up the posting code correctly. Please help me out. Sorry for the broken-looking code, for some reason StackOverflow didn't want to close it all in the code block.
Below is my full code. Am I missing an extender permission requests, or is that taken care in this code:
PHP Code
<?php
include_once 'facebook.php';
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
'cookie' => true
));
$session = $facebook->getSession();
if (!$session) {
$url = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0
));
echo "<script type='text/javascript'>top.location.href = '$url';</script>";
} else {
try {
$uid = $facebook->getUser();
$me = $facebook->api('/me');
$updated = date("l, F j, Y", strtotime($me['updated_time']));
echo "Hello " . $me['name'] . "<br />";
echo "You last updated your profile on " . $updated;
$connectUrl = $facebook->getUrl(
'www',
'login.php',
array_merge(array(
'api_key' => $facebook->getAppId(),
'cancel_url' => 'http://www.test.com',
'req_perms' => 'publish_stream',
'display' => 'page',
'fbconnect' => 1,
'next' => 'http://www.test.com',
'return_session' => 1,
'session_version' => 3,
'v' => '1.0',
), $params)
);
$result = $facebook->api(
'/me/feed/',
'post',
array('access_token' => $facebook->access_token, 'message' => 'Playing around with FB Graph..')
);
} catch (FacebookApiException $e) {
echo "Error:" . print_r($e, true);
}
}
?>
it's because you didn't sepcify the "req_perms" and allow the app to publish stream to your wall. Make sure you add "publish_stream" in your "req_perms.
PHP code:
$url = $facebook->getLoginUrl(array(
'canvas' => 1, //set to 1 bcoz my application is Iframe app
'fbconnect' => 0,
'req_perms' => 'publish_stream'
));