How to authenticate to facebook with no gui, using python
Tags: python, programming, opensource, api
Published: 2022-01-03 23:57:34

I saw that there is a lot of developers searching for how they can authenticate their users without using the usual workflow who need a gui and a login button to authenticate their users.

I did not find any articles or blogs talking about this except the official Facebook documentation, without much talking let's dive in to to the solution 

## Coding part
Our goal here is to make this script successfully `python script.py -ai app_id -cs client_secret -pi page_id`.

You can find the app id in the in your app dashboard, as you can see in the picture below.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwkgqe2g8kzilsjn3iof.PNG)

The client secret can be found in the settings then advanced after this search for the client search label.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7z2cd4x3gb5fjeswilrg.png)

Then enable login from devices, and enable the login from devices.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6wvscwp7vqeku2dmbcqg.png)


The following code python script is what you need, after execution a code will be generated and displayed in your terminal, be careful because this code is only available for 450 seconds.

```
import requests
import argparse

API_URL = 'https://graph.facebook.com'

def parse_args(publish_post):
   parser = argparse.ArgumentParser()

   parser.add_argument('-pid', '--pageId', dest='pageid', action='store',
                       required=True,
                       help='page id')
   parser.add_argument('-cs', '--clientsecret', dest='clientsecret', action='store',
                       required=True,
                       help='client secret token')

   parser.add_argument('-ai', '--appid', dest='appid', action='store',
                       required=True,
                       help='the id of the app')


   client_secret = parser.parse_args().clientsecret
   page_id = parser.parse_args().pageid
   app_id = parser.parse_args().appid
   return publish_post(app_id, client_secret, page_id)

def run():
   @parse_args
   def publish_post(app_id, client_secret, page_id):
      params = {
        'access_token': f'{app_id}|{client_secret}',
        'scope': 'pages_manage_posts,public_profile' # permissions
      }

      url = f'{API_URL}/device/login'
      res = requests.post(url, params=params).json()

      interval = res['interval']

      # poll for login
      # check if the user authorized our app or not
      data = {
         'access_token': f'{args.id}|{args.token}',
         'code': res['code']
      }
      url = f'{API_URL}/device/login_status'

      while True:
         res = requests.post(url, data=data).json()
         try:
            access_token = res['access_token']
            break
         except KeyError:
            continue
         sleep(10)

      # generate a page access token
      params = {
         'fields': 'access_token',
         'access_token': access_token,
      }
      url = f'{API_URL}/{page_id}'
      res = requests.get(url, params=params).json()
      print('page access token is', res['access_token'])


run()
```

If you want know more about this make sure to check the [Facebook login for devices official documentation](https://developers.facebook.com/docs/facebook-login/for-devices), remember that you will need to pass through the app review phase, [click here](https://developers.facebook.com/docs/app-review) to read more.