PHP - 使用有效的访问令牌通过Graph API在Facebook上发布视频

时间:2014-06-23 13:51:38

标签: php facebook facebook-graph-api video

我的服务器上有视频, 我需要使用Graph API在Facebook上发布该视频。

Here是Facebook小组建议的代码。

我正在做的事情如下。

1)我从Android设备获取访问令牌

2)通过将访问令牌传递给Facebook并获取电子邮件ID并通过电子邮件ID识别用户

来识别用户

3)通过Graph API将用户的视频从我的服务器发布到Facebook。

4)将视频ID作为API响应返回到Android设备。

我正在接近这条路线,因为在Android设备中,在Facebook上发布视频是两步过程。

1)首先下载视频

2)发布到Facebook

这很耗时。

以下是我正在尝试的代码

    define("FB_WEB_APP_ID","********");
    define("FB_WEB_SECRET","********");
    define("FB_WEB_REDIRECT_URI","<< redirect url >>");
    $GLOBALS["all_user_dir_path"]="/var/www/proj/web/video/user_videos/";
     define("FB_WEB_SCOPE","user_friends,email,public_profile,user_hometown,user_location,user_photos,user_videos,publish_actions,read_friendlists,publish_stream,offline_access");
    define("FB_WEB_RESPONSE_TYPE","code%20token");

    $GLOBALS["fb_app_creds"]=array();
    $GLOBALS["fb_app_creds"]['appId']= FB_WEB_APP_ID;
    $GLOBALS["fb_app_creds"]['secret']=FB_WEB_SECRET;
    $GLOBALS["fb_app_creds"]['response_type']=FB_WEB_RESPONSE_TYPE;
    $GLOBALS["fb_app_creds"]['redirect_uri']=FB_WEB_REDIRECT_URI;
    $GLOBALS["fb_app_creds"]['scope']=FB_WEB_SCOPE;
    $GLOBALS["facebook"] = new Facebook($GLOBALS["fb_app_creds"]);



class DefaultController extends Controller
{
// some code....

/**
     * @Route("/gk",name="_fb")
     * @Template()
     */
    public function gkAction(Request $request){

        $facebook = $GLOBALS["facebook"];

        $access_token=$request->query->get("access_token");

        if(!$access_token){
          die("give access token in url.......");
        }

        echo "<pre>";
        $facebook->setAccessToken($access_token);

        $user = $facebook->getUser();

        $me=$facebook->api("/me");

        $email=$me['email'];

        $all_user_dir_path=$GLOBALS["all_user_dir_path"];
        $user_directory = str_replace(array(".","@"), "_",$email);

        $user_dir_abs_path=$all_user_dir_path.$user_directory;

        print_r($me);

        $video_file_path=$user_dir_abs_path."/video.mp4";

        if(file_exists($video_file_path))
        { 
          echo "file exists...";
        }else{
          die("not exist");
        }

        $video_title="Test";
        $video_desc="Test";

        $access_token=$request->query->get("access_token");

        $file = "@".$video_file_path;
        $data =  array('name' => 'file', 'file' => $file);

          $post_url = "https://graph-video.facebook.com/me/videos?"
         . "title=" . $video_title. "&description=" . $video_desc
         . "&". $access_token
         ;


        echo "<hr>TRY 1<hr>";
        try{
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $post_url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
            $res = curl_exec($ch);

            $video_id=0;
            if( $res === false ) {

            }else{
              $res=json_decode($res,true);
              /* $video_id = $res['id'];*/
               echo ":::: ";print_r($res);
            }
            curl_close($ch);
       }catch(\Exception $e){
           echo " Exception generated in Try 1 : ".$e->getMessage();
       }

       echo "<hr>TRY 2<hr>";

       $params = array(
            "access_token" => $access_token,
            "name"=>"file",
            "file" => "@".$video_file_path,
            "title" => $video_title,
            "description" => $video_desc
          );
          try {
              $ret = $facebook->api('/me/videos', 'POST', $params);
              print_r($ret);
          } catch(\Exception $e) {
            echo " Exception generated in Try 2 : ".$e->getMessage();
          } 

        die("</pre>");
    }    

}

我得到的输出是An active access token must be used to query information about the current user.错误和(#353) You must select a video file to upload.

看看这张图片

enter image description here

请告诉我如何解决这个问题??

新代码尝试了............................................ .......

 /* code with sdk - object oriented way */
        $file=$GLOBALS["all_user_dir_path"].$user_directory."/video.mp4";
        $source = array();
        $source['name']="video.mp4";
        $source['type'] = "video/mp4";
        $source['tmp_name'] = $file;
        $source['error'] = 0;
        $source['size'] = filesize($file);
        echo "<br><br>$file<br><br>";

        $params = array(
          "access_token" => $access_token, 
            "source" => $source,
            "title" => "testvideo",
            "description" => "testvideo"
        );
          try {
              $ret = $facebook->api('/me/videos', 'POST', $params);
              echo 'Successfully posted to Facebook';
              echo "<pre>";print_r($ret);echo "</pre>";
          } catch(Exception $e) {
            echo $e->getMessage();
          } 

但这会导致(#353) You must select a video file to upload错误

3 个答案:

答案 0 :(得分:4)

以下是答案

public function shareSocialgrationFB($access_token,& $exception){
        $video_id=0;

        try{
            $config = array();
            $config['appId'] = FB_WEB_APP_ID;
            $config['secret'] = FB_WEB_SECRET;
            $config['fileUpload'] = true; 
            $config['cookie'] = true;
            $facebook = new Facebook($config);
            $facebook->setFileUploadSupport(true);  
            $facebook->setAccessToken($access_token);

            $me=$facebook->api("/me");
            $email=$me['email'];

            $user_directory = str_replace(array(".","@"), "_",$email);

            $file = $GLOBALS["all_user_dir_path"].$user_directory."/video.mp4";

            $usersFacebookID=$facebook->getUser();
            $video_details = array(   
                      'access_token'=> $access_token,
                      'message'=> 'Testvideo!',
                      'source'=> '@' .realpath($file),
                      'title'=>'Test'   
            );
            $post_video = $facebook->api('/'.$usersFacebookID.'/videos', 'post', $video_details);
            $video_id=$post_video['id'];
        }catch(\Exception $e){
            //echo "Exception generated :: ".$e->getMessage(); 
        $exception=$e->getMessage(); 
        // extra code to handle exception
        }
        return $video_id;
    }

参考:How to POST video to Facebook through Graph API using PHP

我不知道为什么有关配置的信息

$config['fileUpload'] = true; 
$config['cookie'] = true;
以下官方docs文件中没有提到

https://developers.facebook.com/blog/post/493/

https://developers.facebook.com/docs/graph-api/reference/v2.0/user/videos#publish

然而,上面给出的解决方案对我来说很好。

答案 1 :(得分:0)

file不是有效参数。使用 file 代替参数source

Reference

答案 2 :(得分:0)

对于FB SDK4 + Composer :(请参阅硬编码视频路径和编码)。

Doc:https://developers.facebook.com/docs/php/gettingstarted/4.0.0

FB请求将视频文件作为表单数据进行编码传递: https://developers.facebook.com/docs/graph-api/reference/user/videos/

use Facebook\FacebookSession;
use Facebook\GraphSessionInfo;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;

private function postFBVideo($authResponse, $filePath, $formDataMessage)
    {
        FacebookSession::setDefaultApplication('yourAppkey', 'yourAppSecret');
        $ajaxResponse = '';
        try {
            $session = new FacebookSession($authResponse->accessToken);
        } catch (FacebookRequestException $ex) {
            // When Facebook returns an error
            $ajaxResponse = 'FB Error ->' . json_encode($ex) ;
        } catch (\Exception $ex) {
            // When validation fails or other local issues
            $ajaxResponse = 'FB Validation Error - ' . json_encode($ex) ;
        }
        if ($session) {
            $response = (new FacebookRequest(
                $session, 'POST', '/me/videos', array(
                    'source' => new CURLFile('videos/81JZrD_IMG_4349.MOV', 'video/MOV'),
                    'message' => $formDataMessage,
                )
            ))->execute();
            $ajaxResponse = $response->getGraphObject();
        }
        return json_encode($ajaxResponse);
    }