0

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

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() 方法也可以正常工作,只要将正确的 privs 添加到访问令牌中,但 add_photo() 仍然会引发错误。

4

1 回答 1

0

这似乎是 Facebook::Graph::Response 代码(版本 1.0500)中的一个错误,其中 $params 参数未将所有必需元素传递到子中,导致“必须使用活动访问令牌来查询当前用户的信息。” 错误(因为令牌从未由子发送)。因为 add_photo 是唯一使用 post sub 的函数,所以所有其他函数(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) 中得到纠正。在进行上述代码编辑之前检查此修复是否适用。

于 2013-07-02T14:33:47.187 回答