2013-07-01 4 views
0

을 사용하여 방화벽 뒤에서 FaceBook에 이미지 콘텐츠 올리기이 질문은 Perl FaceBook :: Graph API에만 해당되며 일반적으로 Facebook Graph와는 관련이 없을 수 있습니다. 내가하려고하는 것은 Perl과 FaceBook :: Graph 모듈을 사용하여 사진을 게시하는 것입니다. 모듈 설명서 (http://metacpan.org/pod/Facebook::Graph)는 "publish_stream"권한 게시물을 게시해야하지만 "현재 사용자의 정보를 쿼리하려면 활성 액세스 토큰을 사용해야합니다."라는 메시지를 표시합니다. 일반 메시지 게시물은 오류없이 작동합니다. 나는 다음과 같은 정보를 얻을 액세스 토큰 디버거 내 토큰 검사에서 : 불행하게도Perl FaceBook :: Graph

App ID: [removed]: [removed] 
Metadata: [] 
User ID: [removed] : [removed] 
Issued: Unknown 
Expires: 1372705200 (in about an hour) 
Valid: True 
Origin: Web 
Scopes: create_note photo_upload publish_actions publish_stream share_item status_update user_photos video_upload 

을의에 대한 CPAN 문서 ' "페이스 북 :: 그래프 :: :: 게시 사진은"모듈은 조금 부족한 내가 할 수있는 동일한 코드를 참조하지 않는 사진을 게시하기위한 Perl 예제를 찾으십시오. 아래에 나와있는 더 완벽한 예제 코드 :

#note: this is not the complete code I'm using, quite a few non-FB related lines left out for simplicity 

#create the 
my $FBHandle=Facebook::Graph->new(
    app_id => $TargetFBAppID, #passed in as an arg 
    secret => $TargetFBAppSecret, #passed in as an arg 
    postback => $TargetFBAppPostBack #passed in as an arg 
); 

#make sure this is valid when passing it in 
my $AccessTokenResult=$FBHandle->access_token($FBAccessToken); #passed in as an arg, generated by FB's Access Token Debugger 

if(!$AccessTokenResult) { 
    $FaultString="No FB access token returned"; 
} else { 
    #do the image post 
    my $PostHash=$FBHandle->add_photo() 
     ->set_source($TempFileResultHash->{"fullpath"}) #works out to "C:/Tools/apache-tomcat-7.0.22/webapps/service_api/temp/FacebookBroadcast-F38365F5-6D00-1014-9DBD-87D476B3CC17" 
     ->set_message($OptionsHash->{"message"}||"") #passed in from args 
    ; 

    #add_post works, but not add_photo 
    #my $PostHash=$FBHandle->add_post() 
    # ->set_message($OptionsHash->{"message"}||"") #passed in from args 
    #; 

    #send it 
    my $PostResultHash=$PostHash->publish(); #need "publish_stream" priv for this to work 

    die Data::Dumper::Dumper($PostResultHash); #dump the result 
} #end if 

누구나 내가 잘못 될지도 모릅니다.

추가 편집 : FaceBook :: Graph add_note() 및 add_link() 메소드도 올바른 priv가 액세스 토큰에 추가되지만 add_photo()가 여전히 오류를 throw하면 문제없이 작동합니다.

+0

문제가 해결되었습니다. 문제는 Facebook :: Graph :: Request 모듈의 버그였습니다. –

답변

0

이것은 Facebook :: Graph :: Response 코드 (버전 1.0500)의 버그로, $ params 인수가 필요한 모든 요소를 ​​하위에 전달하지 않아 "활성 액세스 토큰이 필요합니다. 현재 사용자에 대한 정보를 쿼리하는 데 사용됩니다. " 오류 (하위가 토큰을 보내지 않았기 때문에) add_photo는 post 하위를 사용하는 유일한 함수이기 때문에 다른 모든 함수 (add_link, add_note, add_post 등)가 올바르게 작동합니다.

문제를 해결하려면 Facebook :: Graph :: Request 모듈을 편집하고 24 행 주위의 게시판 하위를 찾고이 하위에서만 두 개의 참조를 "$ params"에서 "@params"로 변경하십시오. 액세스 토큰 기능에 유효하고 비슷한 전화를 가정하고 예상대로이에서

... 이것에

sub post { 
    my ($self, $uri, $params) = @_; 
    my $cv = AnyEvent->condvar; 
    $self->ua->post_async($uri, $params)->cb(sub { 
     $cv->send(Facebook::Graph::Response->new(response => shift->recv)); 
    }); 
    return $cv; 
} 

...

sub post { 
    my ($self, $uri, @params) = @_; 
    my $cv = AnyEvent->condvar; 
    $self->ua->post_async($uri, @params)->cb(sub { 
     $cv->send(Facebook::Graph::Response->new(response => shift->recv)); 
    }); 
    return $cv; 
} 

이 변경 후 코드는 이제 작동합니다 예를 들어 add_post는 이미 작동합니다.

추가 편집 :이 문제는 CPAN 및 ActiveState 버전의 코드 (v1.0600)에서 수정 된 것으로 보입니다. 위에 언급 된 코드 편집을하기 전에이 수정 사항을 적용 할 수 있는지 확인하십시오.