Подтвердить что ты не робот

Получение токена аутентификации Facebook для приложения командной строки (рабочего стола)

Я работаю на благотворительность, которая продвигает язык жестов, и они хотят размещать видео на свою страницу FB каждый день. Там большое (и растущее) количество видео, поэтому они хотят запланировать загрузку программно. Я не против, какой язык программирования в конечном итоге делаю это, но я пробовал следующее и не очень далеко:

  • Perl, используя WWW::Facebook::API (старый API REST) ​​

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

    Аутентификация в порядке, и это правильно отправляет метод facebook.video.upload в https://api-video.facebook.com/restserver.php. К сожалению, это возвращает "Метод неизвестен". Я предполагаю, что это связано с устаревшим API REST.

  • Facebook::Graph в Perl или fb_graph gem в Ruby. (API OAuth)

    Я не могу даже аутентифицироваться. Оба они ориентированы на веб-приложения, а не на настольные приложения 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;
    

    Перейдите к этому URL-адресу в моем браузере, запишите возвращаемый параметр code, а затем

    my $r = $fb->request_access_token($code);
    

    К сожалению:

    Could not fetch access token: Bad Request at /Library/Perl/5.16/Facebook/Graph/AccessToken/Response.pm line 26
    
  • Аналогично в 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]
    )
    

    Дает мне URL-адрес, который возвращает код, но работает

    client.authorization_code = <code>
    FbGraph.debug!
    access_token = client.access_token!
    

    возвращает

    {
      "error": {
        "message": "Missing client_id parameter.",
        "type":    "OAuthException",
        "code":    101
      }
    }
    

    Обновление. Когда я меняю вызов 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
      }
    }
    

Как я могу аутентифицировать приложение для настольных компьютеров и командной строки для Facebook с помощью OAuth?

4b9b3361

Ответ 1

Итак, я, наконец, начал работать, не настраивая веб-сервер и не делаю обратный вызов. Уловкой, интуитивно-интуитивно, было отключить настройку "Desktop application" и не запрашивать 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
)

Ответ 2

В вашем случае проблема в том, что для OAuth вам понадобится URL-адрес конечной точки, доступ к которому можно публиковать через Интернет для серверов Facebook, что может быть неприемлемым для обычных клиентских ПК или настольным приложением, которое поддерживает WebViews (и я предполагаю, что командной строки нет).

Facebook заявляет в https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#login, что вы можете создать поток входа в настольный клиент, но только через так называемые WebView. Поэтому вам нужно будет вызвать конечную точку 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}

Затем вам нужно проверить полученный URL-адрес перенаправленного WebView как указано:

При использовании настольного приложения и входа в систему Facebook перенаправляет людей на redirect_uri, упомянутый выше, и помещает маркер доступа вместе с некоторые другие метаданные (такие как время истечения токена) в фрагменте URI:

https://www.facebook.com/connect/login_success.html#access_token=ACCESS_TOKEN... 

Ваше приложение должно обнаружить эту переадресацию, а затем прочитать маркер доступа из URI, используя механизмы, предоставляемые операционной системой и каркасом разработки, которые вы используете.

Если вы хотите сделать это в "режиме взлома", я бы рекомендовал сделать следующее.

  • Как вы хотите отправить сообщение на страницу, получите токен доступа к странице и сохраните его локально. Это можно сделать, используя Graph Explorer на

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

конечная точка. Не забудьте предоставить разрешения "manage_pages" и "publish_actions".

  • Используйте cURL (http://curl.haxx.se/docs/manpage.html), чтобы ПОСЛАТЬ видео в API графиков с помощью токена доступа и соответствующий идентификатор страницы, который вы получили на этапе 1, как показано ниже:

curl -v -0 --form title= {YOUR_TITLE} - форма description = {YOUR_DESCRIPTION} --form source = @{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/

Ответ 3

В facebook ссылка на видео API:

Индивидуальное видео в API графиков.

Чтобы прочитать видео, отправьте запрос HTTP GET в /VIDEO _ID с помощью user_videos разрешение. Это вернет видео, которое пользователь имеет загружен или отмечен.

Запросы на видео POST должны использовать graph-video.facebook.com.

Таким образом, вы должны размещать на графическом изображении-video.facebook.com, если вы хотите загрузить видео.

Вам также нужны расширенные разрешения от пользователя или профиля, к которому вы будете загружать, в этом случае вам нужно video_upload, это будет запрашиваться только один раз, когда пользователь, который в настоящее время вошел в систему, запрашивает такое разрешение для приложение.

И ваша конечная точка должна быть:

https://graph-video.facebook.com/me/videos

Если вы всегда хотите отправлять сообщения конкретному пользователю, вам придется изменить часть конечной точки с /me на идентификатор пользователя или идентификатор страницы.

Здесь образец (в PHP):

$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET"; 
$my_url = "YOUR_POST_LOGIN_URL"; 
$video_title = "YOUR_VIDEO_TITLE";
$video_desc = "YOUR_VIDEO_DESCRIPTION";

$code = $_REQUEST["code"];

if(empty($code)) {
   $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($my_url) 
     . "&scope=publish_stream";
    echo("<script>top.location.href='" . $dialog_url . "'</script>");
}

$token_url = "https://graph.facebook.com/oauth/access_token?client_id="
    . $app_id . "&redirect_uri=" . urlencode($my_url) 
    . "&client_secret=" . $app_secret 
    . "&code=" . $code;
$access_token = file_get_contents($token_url);

$post_url = "https://graph-video.facebook.com/me/videos?"
    . "title=" . $video_title. "&description=" . $video_desc 
    . "&". $access_token;

echo '<form enctype="multipart/form-data" action=" '.$post_url.' "  
     method="POST">';
echo 'Please choose a file:';
echo '<input name="file" type="file">';
echo '<input type="submit" value="Upload" />';
echo '</form>';

Хотя я обеспокоен скоростью загрузки, если видео слишком большие, но я предполагаю, что ваш клиент уже разобрал это (сжатие/оптимизация/короткое видео и т.д.).

Я сделал вам демонстрацию . Перейдите на мой сайт (я владею этим доменом) и попробуйте загрузить видео. Я попытался с этот, который является относительно небольшим файлом 4 Мб. Убедитесь, что этот script будет пытаться загрузить видео, не более того (к профилю FB, который вы в настоящее время вошли в систему), но если вы все еще обеспокоены, скопируйте мой фрагмент, загрузите его на свой собственный сервер ( с поддержкой PHP, конечно) и создать тестовое приложение, в котором URL-адрес сайта - это домен, и обязательно укажите в переменной $my_url конечную точку, которая в основном представляет полный путь к вашим script получающим ответам от facebook:

http://yourdomain.com/testfb.php 

Если вы все еще хотите сделать это в настольном приложении, вам нужно перейти на developer.facebook.com в настройках вашего приложения:

Settings > Advanced

И найдите первый вариант:

enter image description here

И включите этот переключатель, чтобы facebook позволял POST с рабочего стола или собственного приложения вместо веб-сервера.

Примечание. Я не эксперт по Ruby, но вышеприведенный рабочий PHP-код должен быть довольно очевидным и легко переносить на него.

Ответ 4

Насколько я помню, то, что вы хотите, на самом деле невозможно без какой-либо конечной точки, которая может получить обратный вызов из facebook.

Если вы можете финализировать маркер oauth, скажем, Graph API Explorer, тогда становится довольно тривиально использовать драгоценный камень, например koala, чтобы загрузить видео.

здесь существенный бит:

@graph = Koala::Facebook::API.new(access_token)
@graph.put_video(path_to_my_video)

Я сделал вам образец проекта здесь: fb-upload-example