获取命令行(桌面)应用程序的Facebook身份验证令牌

Sim*_*ens 21 ruby perl facebook facebook-graph-api

我正在为一个促进手语的慈善机构工作,他们希望每天将视频发布到他们的FB页面.视频数量很大(且不断增长),因此他们希望以编程方式安排上传.我真的不介意我最终在做什么编程语言,但是我尝试了以下内容并没有走得太远:

  • Perl使用WWW::Facebook::API(旧的REST API)

    my $res = $client->video->upload(
     title => $name,
     description => $description,
     data => scalar(read_file("videos/split/$name.mp4"))
    );
    
    Run Code Online (Sandbox Code Playgroud)

    身份验证没问题,这正确地发布了一个facebook.video.upload方法https://api-video.facebook.com/restserver.php.不幸的是,这会返回"方法未知".我认为这与弃用的REST API有关.

  • Facebook::Graph在Perl或fb_graphRuby中的gem.(OAuth API)

    我甚至无法进行身份验证.这两个都面向网络而不是OAuth的桌面应用程序,但我认为我应该能够做到:

    my $fb = Facebook::Graph->new(
     app_id => "xxx",
     secret => "yyy",
     postback => "https://www.facebook.com/connect/login_success.html"
    );
    print $fb->authorize->extend_permissions(qw(publish_stream read_stream))->uri_as_string;
    
    Run Code Online (Sandbox Code Playgroud)

    在我的浏览器中转到该URL,捕获code返回的参数,然后

    my $r = $fb->request_access_token($code);
    
    Run Code Online (Sandbox Code Playgroud)

    不幸:

    Could not fetch access token: Bad Request at /Library/Perl/5.16/Facebook/Graph/AccessToken/Response.pm line 26
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样在Ruby中,使用fb_graph,

    fb_auth = FbGraph::Auth.new(APP_ID, APP_SECRET)
    
    client = fb_auth.client
    client.redirect_uri = "https://www.facebook.com/connect/login_success.html"
    puts client.authorization_uri(
      :scope => [:publish_stream, :read_stream]
    )
    
    Run Code Online (Sandbox Code Playgroud)

    给我一个返回代码但正在运行的URL

    client.authorization_code = <code>
    FbGraph.debug!
    access_token = client.access_token!
    
    Run Code Online (Sandbox Code Playgroud)

    回报

    {
      "error": {
        "message": "Missing client_id parameter.",
        "type":    "OAuthException",
        "code":    101
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    更新:当我更改access_token!调用以access_token!("foobar")强制Rack :: OAuth2 :: Client将标识符和机密放入请求正文时,我收到以下错误:

    {
      "error": {
        "message": "The request is invalid because the app is configured as a desktop app",
         "type":   "OAuthException",
         "code":   1
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我应该如何使用OAuth验证桌面/命令行应用程序到Facebook?

Sim*_*ens 8

所以,我终于让它工作了,没有设置Web服务器并进行回调.反直觉的诀窍是关闭 "桌面应用程序"设置而不是请求offline_access.

FaceBook::Graph发布视频的支持目前似乎不起作用,所以我最终在Ruby中做了.

fb_auth = FbGraph::Auth.new(APP_ID, APP_SECRET)

client = fb_auth.client
client.redirect_uri = "https://www.facebook.com/connect/login_success.html"

if ARGV.length == 0
  puts "Go to this URL"
  puts client.authorization_uri(:scope => [:publish_stream, :read_stream] )
  puts "Then run me again with the code"
  exit
end

if ARGV.length == 1
  client.authorization_code = ARGV[0]
  access_token = client.access_token! :client_auth_body
  File.open("authtoken.txt", "w") { |io| io.write(access_token)  }
  exit
end

file, title, description = ARGV

access_token = File.read("authtoken.txt")
fb_auth.exchange_token! access_token
File.open("authtoken.txt", "w") { |io| io.write(fb_auth.access_token)  }

me = FbGraph::Page.new(PAGE_ID, :access_token => access_token)
me.video!(
    :source => File.new(file),
    :title => title,
    :description => description
)
Run Code Online (Sandbox Code Playgroud)


Tob*_*obi 7

问题是在你的情况下,对于OAuth,你需要一些端点URL,可以通过互联网公开到达Facebook服务器,对于普通的客户端PC,或者能够使用WebViews的桌面应用程序,这可能是不行的(和我一样)假设,命令行不是).

Facebook在https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#login中指出,您可以构建桌面客户端登录流程,但只能通过所谓的WebViews.因此,您需要像这样调用OAuth端点:

https://www.facebook.com/dialog/oauth?client_id={YOUR_APP_ID}&redirect_uri=https://www.facebook.com/connect/login_success.html&response_type=token&scope={YOUR_PERMISSION_LIST}
Run Code Online (Sandbox Code Playgroud)

然后,您必须检查生成的重定向WebView URL为引用:

使用桌面应用程序并登录时,Facebook会将人员重定向到上面提到的redirect_uri,并在URI片段中放置一个访问令牌以及其他一些元数据(例如令牌到期时间):

https://www.facebook.com/connect/login_success.html#access_token=ACCESS_TOKEN... 
Run Code Online (Sandbox Code Playgroud)

您的应用需要检测此重定向,然后使用您正在使用的操作系统和开发框架提供的机制从URI中读取访问令牌.

如果您想在"黑客模式"中执行此操作,我建议您执行以下操作:

  • 当您想要发布到页面时,获取页面访问令牌并将其存储在本地.这可以通过使用图形资源管理器来完成

https://developers.facebook.com/tools/explorer?method=GET&path=me%2Faccounts

端点.请记住提供"manage_pages"和"publish_actions"权限.

curl -v -0 --form title = {YOUR_TITLE} - 表格描述= {YOUR_DESCRIPTION} - 表格来源= @ {YOUR_FULL_FILE_PATH} https://graph-video.facebook.com/ {YOUR_PAGE_ID}/videos?access_token = {} YOUR_ACCESS_TOKEN

参考文献:

https://developers.facebook.com/docs/graph-api/reference/page/videos/#publish https://developers.facebook.com/docs/reference/api/video/