使用Perl FaceBook :: Graph从防火墙后面将图像内容发布到FaceBook

时间:2013-07-01 18:22:04

标签: perl facebook-graph-api perl-module

这个问题在某种程度上与Perl FaceBook :: Graph API有关,可能与Facebook Graph无关。我试图做的是尝试使用Perl和FaceBook :: Graph模块发布照片。模块文档(http://metacpan.org/pod/Facebook::Graph)表示发布照片时需要“publish_stream”权限,但这会生成“必须使用活动访问令牌来查询有关当前用户的信息”。错误,而常规邮件发布没有错误。在使用Access Token Debugger检查我的令牌时,我得到以下信息:

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

不幸的是,“Facebook :: Graph :: Publish :: Photo”模块的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()仍会抛出错误。

1 个答案:

答案 0 :(得分:0)

这似乎是Facebook :: Graph :: Response代码(版本1.0500)中的一个错误,其中$ params参数未将所有必需元素传递到sub中,从而导致“必须存在活动访问令牌”用于查询有关当前用户的信息。“错误(因为该子令牌从未发送过)。因为add_photo是唯一能够使用post子函数的函数,所有其他函数(add_link,add_note,add_post等)都能正常工作。

要解决此问题,请编辑Facebook :: Graph :: Request模块并找到第24行附近的post sub,并将两个引用(仅限此子句点)从“$ 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)中得到纠正。在进行上述代码编辑之前,检查此修复是否适用。