Получить изображение профиля пользователя facebook после изменений в Facebook (24 октября)

#facebook #asp.net-core #facebook-graph-api #.net-core

#Facebook #asp.net-ядро #facebook-graph-api #.net-ядро

Вопрос:

Итак, facebook изменил способ получения веб-сайтами изображения профиля пользователя, все подробности здесь: https://developers.facebook.com/docs/graph-api/reference/user/picture /

Итак, я, а также SOF получаем изображение профиля пользователя из Facebook следующим образом: https://graph.facebook.com/1108834579148558/picture?type=large

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

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

Единственное, о чем я могу думать, это то, что при входе пользователя в систему facebook может получить изображение профиля пользователя, кто-нибудь может помочь с этим, я использую.Сетевое ядро.

Ответ №1:

Facebook объясняет новый способ получения изображения пользователя после октября 2020 года в своих новых документах здесь, и они указывают необходимые изменения следующим образом:

Эта конечная точка поддерживает идентификаторы пользователей в приложении (ASID), идентификаторы пользователей (UID) и идентификаторы пользователей в области страниц (PSID). В настоящее время вы можете запрашивать идентификаторы ASID и UID без каких-либо требований. Однако, начиная с 24 октября 2020 года, для всех запросов на основе UID потребуется токен доступа. Если вы запрашиваете UID и, следовательно, должны включать токен:

1. Получите access_token изображение в любой форме, которую вам предоставляет Facebook

В зависимости от структуры вашего приложения вы должны использовать один из следующих методов, предоставляемых Facebook, для получения access_token . Вы можете найти больше access_token о документах FB здесь.
Токен доступа к приложению токен доступа
к клиенту

В качестве примера для токена клиентского доступа, который я использую:
сделайте запрос GET https://graph.facebook.com/oauth/access_token со следующими параметрами:

 [
   "client_id"     => #FACEBOOK_CLIENT_ID, 
   "client_secret" => #FACEBOOK_CLIENT_SECRET, 
   "grant_type"    => "client_credentials",
]
  

В качестве ответа вы получите свой access_token , который вам нужно прикрепить к новому URL-адресу изображения.

2. Получите полный URL-адрес аватара с access_token прикрепленным.

По состоянию на 23 октября 2020 года это работает для меня. Теперь полный формат изображения
{$this->graphUrl}/{$this->version}/{$userID}/picture?type=largeamp;redirect=falseamp;access_token={$access_token}

Если вы установите redirect=false , вы получите объект JSON в качестве ответа:

 {
    "data": {
        "height": 100,
        "is_silhouette": false,
        "url": "https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=10152700727498624amp;height=100amp;width=100amp;ext=1606081666amp;hash=AeTQyGgugiSbRcB7Sxw",
        "width": 100
    }
}
  

С другой стороны, если вы оставите redirect=true или вообще не установите его, вы получите само изображение, которое затем сможете сохранить на своем диске или использовать URL в качестве пути к изображению. Но я не уверен, является ли данный URL-адрес долговечным или нет. Я получил тот же URL-адрес, который работает уже почти неделю, поэтому я думаю, что URL-адрес останется таким, как есть, как только вы запросили его с действительным access_token .

Пример запроса на PHP

Поскольку я реализовал это в PHP, я не могу привести вам пример кода, но покажу вам, как я это сделал с клиентом Guzzle в рамках Laravel. Вы можете ознакомиться с моим обновленным классом провайдера для Laravel Socialite здесь .

     public function getAccessToken(){
        // Make a request to get the Access Client
        $res = Http::get("https://graph.facebook.com/oauth/access_token", [
            "client_id"     => config('services.facebook.client_id'),
            "client_secret" => config('services.facebook.client_secret'),
            "grant_type"    => "client_credentials",
        ]);

        // Response is a JSON Object, so decode it into an Array
        $r = $res->json();

        // Return the access_token Array Key out of the response
        return Arr::get($r, 'access_token', false);
    }


    public function getFacebookAvatar(array $user){
        // get the access_token from the above method
        $access_token = $this->getAccessToken();

        // build the new URI path for the User Image
        $path = "{$this->graphUrl}/{$this->version}/{$userID}/picture?type=largeamp;redirect=falseamp;access_token={$access_token}";
        $res  = Http::get($path);
        
        // Get the final User Image URL out of the response
        return Arr::get($res->json(), 'data.url', false);
    }
  

Быстрый и грязный способ создания собственного токена доступа (не рекомендуется)

Есть один способ создать свой собственный access_token , но его следует использовать только для целей тестирования, поскольку вы предоставляете свои полные учетные данные, и это может быть взломано. Вы можете архивировать это, создав объединенную строку с вашими учетными данными и разделителем | as в этом формате : {cliend_id}|{client_secret} .

Комментарии:

1. Привет, @Gkiokan спасибо за вашу помощь! Что касается токена доступа. Должно ли приложение быть «живым» или «проверенным», чтобы использовать токен доступа?

2. @Alex Если вы являетесь владельцем приложения, это не имеет значения. Но приложение должно быть в режиме реального времени, когда другие пользователи пытаются получить доступ к api через ваше приложение. Некоторые из них общедоступны, а другие привязаны к сети. Например, вход в систему fb для других пользователей, которые не входят в команду разработчиков, не может использовать его, пока приложение не получит статус live. Проверенное состояние не имеет ничего общего с api.

3. @Gkiokan последний метод может использовать токен клиента вместо секрета клиента здесь есть небольшой пример developers.facebook.com/docs/facebook-login/access-tokens/… Но я не смог найти более подробной информации, но он работает с этим токеном вместо использования секрета

4. @FelipeBarreto Вы можете найти информацию в разделе Generating an App Access Token . Но даже там FB заявляет, что вы не должны использовать этот метод по соображениям безопасности. Но для быстрых и грязных тестовых запросов в среде разработки его можно использовать. Найдите это на странице документов: curl -i -X GET "https://graph.facebook.com/{api-endpoint}amp;access_token={your-app_id}|{your-app_secret}" или здесь developers.facebook.com/docs/facebook-login/access-tokens /…