如何将facebook用户图库图像从url保存到目录?

时间:2016-05-10 10:39:17

标签: php facebook-graph-api

我正在使用此代码在我的网站上保存用户图库图像。首先,当用户登录然后加载所有图库图像时,当用户选择任何图像时,我需要将该图像保存在目录中。这是我的代码。图像以名称保存,但图像大小为零。

$file = file_get_contents('https://graph.facebook.com/[Fb-Photo-ID]/picture?width=378&height=378&access_token=[Access-Token]');     
$img = file_put_contents($target_dir['path'].'/'."facebook3.jpg",$file); 

这是图片库的代码。

<script>
        /**
         * This is the getPhoto library
         */

        function makeFacebookPhotoURL( id, accessToken ) {
            //alert(id);
            return 'https://graph.facebook.com/v2.6/' + id + '/picture?access_token=' + accessToken;
        }

        function login( callback ) {
            FB.login(function(response) {
                if (response.authResponse) {
                    console.log('Welcome!  Fetching your information.... ');
                    if (callback) {
                        callback(response);
                    }
                } else {
                    console.log('User cancelled login or did not fully authorize.');
                }
            },{scope: 'publish_actions,user_location,user_photos,email'} );
        }
        function getAlbums( callback ) {
            FB.api(
                    '/me/albums',
                    {fields: 'id,cover_photo'},
                    function(albumResponse) {
                        console.log( ' got albums ' );
                        if (callback) {
                            callback(albumResponse);
                            console.log(albumResponse);
                        }
                    }
                );

        }

        function getPhotosForAlbumId( albumId, callback ) {
                    //alert(albumId);
                    console.log(albumId);
            FB.api(
                    '/'+albumId+'/photos',
                    {fields: 'id'},
                    function(albumPhotosResponse) {
                        console.log( ' got photos for album ' + albumId );
                        if (callback) {
                            callback( albumId, albumPhotosResponse );

                        }
                    }
                );
        }

        function getLikesForPhotoId( photoId, callback ) {
            FB.api(
                    '/'+albumId+'/photos/'+photoId+'/likes',
                    {},
                    function(photoLikesResponse) {
                    console.log(photoLikesResponse);
                        if (callback) {

                            callback( photoId, photoLikesResponse );
                        }
                    }
                );
        }

        function getPhotos(callback) {

            var allPhotos = [];

            var accessToken = '';

            login(function(loginResponse) {
                    accessToken = loginResponse.authResponse.accessToken || '';
                     //console.log(accessToken);
                    getAlbums(function(albumResponse) {
                            var i, album, deferreds = {}, listOfDeferreds = [];

                            for (i = 0; i < albumResponse.data.length; i++) {
                                album = albumResponse.data[i];

                                deferreds[album.id] = $.Deferred();
                                listOfDeferreds.push( deferreds[album.id] );
                                getPhotosForAlbumId( album.id, function( albumId, albumPhotosResponse ) {
                                        var i, facebookPhoto;
                                        for (i = 0; i < albumPhotosResponse.data.length; i++) {
                                            facebookPhoto = albumPhotosResponse.data[i];
                                            allPhotos.push({
                                                /* 'id' :   facebookPhoto.id,
                                                'added' :   facebookPhoto.created_time, */
                                                'url'   :   makeFacebookPhotoURL( facebookPhoto.id, accessToken )
                                            });
                                        }
                                        deferreds[albumId].resolve();
                                    });
                            }

                            $.when.apply($, listOfDeferreds ).then( function() {
                                if (callback) {
                                    callback( allPhotos );

                                }
                            }, function( error ) {
                                if (callback) {
                                    callback( allPhotos, error );
                                }
                            });
                        });
                });
        }
    </script>

    <script>
        /**
         * This is the bootstrap / app script
         */

        // wait for DOM and facebook auth
        var docReady = $.Deferred();
        var facebookReady = $.Deferred();

        $(document).ready(docReady.resolve);

        window.fbAsyncInit = function() {
            FB.init({
              appId      : '00000000000',
              channelUrl : '//conor.lavos.local/channel.html',
              status     : true,
              cookie     : true, 
              xfbml      : true
            });
            facebookReady.resolve();
        };

        $.when(docReady, facebookReady).then(function() {
            if (typeof getPhotos !== 'undefined') {
                getPhotos( function( photos ) {
                    //console.log(photos);
                    var str= JSON.stringify(photos);

                    var contact=jQuery.parseJSON(str);

                    $.each( photos, function( index, value ){
                        $.each( value, function( index1, value1 ){

                            console.log(value);
                                    //console.log( index1+value1);
                                    //console.log( index1+value1);
                                    //console.log( index1+value1);

                        $("#images").append('<a href="javascript:;" class="myimg"><img height="100" width="150" src='+value1+' /></a>');

 $("a.myimg img").click(function()
                    {
                        var imgSrc = $(this).attr('src');

                        $("#fbimg").val(imgSrc);

                    }); 


                                }); 
                                });

                });
            }
        });

    </script>

1 个答案:

答案 0 :(得分:0)

问题是您以不正确的方式使用FB API。

  1. 您应该拥有API请求的版本
  2. check access_token - &gt;是否有正确的怀特(user_photos)
  3. 以这种方式请求您不会收到图像内容。您只能收到静态图像上的链接。
  4. 因此,只有在收到图像后 - 您才能保存它
  5. 您的链接应该是:

    https://graph.facebook.com/v2.6/[photo_Id]/picture?access_token=[access_token_with_wrights]
    

    这将返回JSON数据类型:

    {
      "data": {
        "is_silhouette": false,
        "url": "https://scontent.xx.fbcdn.net/[image_url]"
      }
    }
    

    read more here你可以为拇指添加额外的参数(又名“图像”)

    <强>更新

    所以以你的方式就像:

    $jsonstring = json_decode(file_get_contents("https://graph.facebook.com/v2.6/[photo_Id]?fields=picture,images&access_token=[access_token_with_wrights]
    "));
    
    $file = file_get_contents($jsonstring['images'][0]['source']) /* chose your size */
    $img = file_put_contents($target_dir['path'].'/'."facebook3.jpg",$file); 
    

    或使用FB PHP SDK

    更新#2

    如果您收到来自JS =&gt;的图像的静态链接只是使用它,而不是graphApi请求。这意味着您可以发送已收到的链接到服务器端。它们应该像 https://scontent.xx.fbcdn.net/XXXXXX 一样,在服务器端收到它们之后就可以使用它们了。并制作

    $file = file_get_contents("https://scontent.xx.fbcdn.net/");
    

    但链接不应该在http://graph.facebook.com上!

    更新3

    是的,这是正确的请求(来自问题)。 具有静态路径的图像的JS代码:

    FB.api(
            '/' + albumId + '/photos',
            { fields: 'id,images' }, /* main is images array in response */
            function ( albumPhotosResponse ) {
               console.log( ' got photos for album ' + albumId );
               if ( callback ) {
                        callback( albumId, albumPhotosResponse );
               }
    } );
    

    从那里解析图像的路径。