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

标签 php facebook facebook-graph-api video

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

Here是 Facebook 团队建议的代码。

我正在做的如下。

1) 我从 Android 设备获取访问 token

2) 通过将该访问 token 传递给 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错误

最佳答案

答案在这里

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;

在下面的 API 官方文档中没有提到

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

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

但是上面给出的解决方案对我来说效果很好。

关于PHP - 使用有效的访问 token 通过 Graph API 在 Facebook 上发布视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24367729/

相关文章:

php - 第一次尝试无法登录

php - 如何在 php 中加密 mysql 密码(或如何打败自动代码扫描器红旗)

Facebook API : Instagram Account Is Missing

facebook - 如何为非 App-Scoped 用户 ID 构建永久和公开的 Facebook 个人资料照片 URL?

facebook-graph-api - 多个部署环境(生产/分期/等)和Facebook Apps

php - 用于描述表单输入的正则表达式

php - 在 Laravel 框架中拆分字符串

ios - 使用 SLComposeViewController 的隐私政策?

facebook - 使用现有页面作为 Facebook 中的应用页面(2017)

android - Android Webview 上的 Facebook 登录按钮重定向到空白页面