Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Up oauth #254

Merged
merged 2 commits into from
Mar 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions examples/get_facebook_feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

Refer: https://developers.facebook.com/docs/graph-api/reference/page/feed#read
"""

import json
import os

Expand Down
1 change: 1 addition & 0 deletions examples/publish_facebook_post.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

Refer: https://developers.facebook.com/docs/graph-api/reference/page/feed#publish
"""

import os

from pyfacebook import GraphAPI
Expand Down
1 change: 1 addition & 0 deletions examples/publish_instagram_media.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

Refer: https://developers.facebook.com/docs/instagram-api/reference/ig-user/media
"""

import os

from pyfacebook import GraphAPI
Expand Down
1 change: 1 addition & 0 deletions examples/server_sent_events.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
A demo for sample streaming api.
"""

import json
import logging

Expand Down
1 change: 1 addition & 0 deletions get_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Utility to get your access tokens.
Refer: https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing
"""

import webbrowser

import click
Expand Down
3 changes: 2 additions & 1 deletion pyfacebook/api/base_client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Base client for API.
"""

import inspect

from pyfacebook import GraphAPI, BasicDisplayAPI
Expand All @@ -23,4 +24,4 @@ def __new__(cls, *args, **kwargs):


class BaseBasicDisplayApi(BasicDisplayAPI, BaseApi):
...
pass
1 change: 1 addition & 0 deletions pyfacebook/api/base_resource.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Resource base class
"""

from pyfacebook.api.graph import GraphAPI


Expand Down
1 change: 1 addition & 0 deletions pyfacebook/api/facebook/client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Client for facebook graph api
"""

from pyfacebook.api.base_client import BaseApi
from pyfacebook.api.facebook import resource as rs

Expand Down
1 change: 1 addition & 0 deletions pyfacebook/api/facebook/resource/page.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Apis for page.
"""

from typing import Dict, Optional, Union

import pyfacebook.utils.constant as const
Expand Down
1 change: 1 addition & 0 deletions pyfacebook/api/facebook/resource/user.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Apis for User.
"""

from typing import Dict, Optional, Union

import pyfacebook.utils.constant as const
Expand Down
33 changes: 25 additions & 8 deletions pyfacebook/api/graph.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
This module contains the GraphAPI class, its subclass BasicDisplayAPI and the class ServerSentEventAPI.
"""

import hashlib
import hmac
import logging
Expand Down Expand Up @@ -54,6 +55,9 @@ def __init__(
instagram_business_id: Optional[str] = None,
authorization_url: Optional[str] = None,
access_token_url: Optional[str] = None,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
state: Optional[str] = None,
):
self.app_id = app_id
self.app_secret = app_secret
Expand All @@ -77,6 +81,9 @@ def __init__(
self.access_token_url = (
access_token_url if access_token_url else self.EXCHANGE_ACCESS_TOKEN_URL
)
self.redirect_uri = redirect_uri if redirect_uri else self.DEFAULT_REDIRECT_URI
self.scope = scope if scope else self.DEFAULT_SCOPE
self.state = state if state else self.STATE

if version is None:
# default version is last new.
Expand Down Expand Up @@ -498,11 +505,13 @@ def _get_oauth_session(
self,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
state: Optional[str] = None,
**kwargs,
) -> OAuth2Session:
"""
:param redirect_uri: The URL that you want to redirect the person logging in back to.
:param scope: A list of permission string to request from the person using your app.
:param state: A CSRF token that will be passed to the redirect URL.
:param kwargs: Additional parameters for oauth.
:return: OAuth Session
"""
Expand All @@ -511,15 +520,17 @@ def _get_oauth_session(
raise LibraryError({"message": "OAuth need your app credentials"})

if redirect_uri is None:
redirect_uri = self.DEFAULT_REDIRECT_URI
redirect_uri = self.redirect_uri
if scope is None:
scope = self.DEFAULT_SCOPE
scope = self.scope
if state is None:
state = self.state

session = OAuth2Session(
client_id=self.app_id,
scope=scope,
redirect_uri=redirect_uri,
state=self.STATE,
state=state,
**kwargs,
)
session = facebook_compliance_fix(session)
Expand All @@ -529,6 +540,7 @@ def get_authorization_url(
self,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
state: Optional[str] = None,
**kwargs,
) -> Tuple[str, str]:
"""
Expand All @@ -538,11 +550,12 @@ def get_authorization_url(
:param redirect_uri: The URL that you want to redirect the person logging in back to.
Note: Your redirect uri need be set to `Valid OAuth redirect URIs` items in App Dashboard.
:param scope: A list of permission string to request from the person using your app.
:param state: A CSRF token that will be passed to the redirect URL.
:param kwargs: Additional parameters for oauth.
:return: URL to do oauth and state
"""
session = self._get_oauth_session(
redirect_uri=redirect_uri, scope=scope, **kwargs
redirect_uri=redirect_uri, scope=scope, state=state, **kwargs
)
authorization_url, state = session.authorization_url(url=self.authorization_url)
return authorization_url, state
Expand All @@ -552,17 +565,19 @@ def exchange_user_access_token(
response: str,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
state: Optional[str] = None,
**kwargs,
) -> dict:
"""
:param response: The redirect response url for authorize redirect
:param scope: A list of permission string to request from the person using your app.
:param redirect_uri: Url for your redirect.
:param scope: A list of permission string to request from the person using your app.
:param state: A CSRF token that will be passed to the redirect URL.
:param kwargs: Additional parameters for oauth.
:return:
"""
session = self._get_oauth_session(
redirect_uri=redirect_uri, scope=scope, **kwargs
redirect_uri=redirect_uri, scope=scope, state=state, **kwargs
)

session.fetch_token(
Expand Down Expand Up @@ -769,17 +784,19 @@ def exchange_user_access_token(
response: str,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
state: Optional[str] = None,
**kwargs,
) -> dict:
"""
:param response: The redirect response url for authorize redirect
:param scope: A list of permission string to request from the person using your app.
:param redirect_uri: Url for your redirect.
:param scope: A list of permission string to request from the person using your app.
:param state: A CSRF token that will be passed to the redirect URL.
:param kwargs: Additional parameters for oauth.
:return:
"""
session = self._get_oauth_session(
redirect_uri=redirect_uri, scope=scope, **kwargs
redirect_uri=redirect_uri, scope=scope, state=state, **kwargs
)

session.fetch_token(
Expand Down
1 change: 1 addition & 0 deletions pyfacebook/api/instagram_basic/resource/user.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Apis for basic user
"""

from typing import Optional, Union

import pyfacebook.utils.constant as const
Expand Down
1 change: 1 addition & 0 deletions pyfacebook/api/instagram_business/resource/comment.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Apis for comment.
"""

from typing import Dict, Optional, Union

import pyfacebook.utils.constant as const
Expand Down
1 change: 1 addition & 0 deletions pyfacebook/api/instagram_business/resource/media.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Apis for media.
"""

from typing import Dict, Optional, Union

import pyfacebook.utils.constant as const
Expand Down
12 changes: 3 additions & 9 deletions pyfacebook/models/album.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,19 @@ class Album(BaseModel):
backdated_time_granularity: Optional[str] = field()
can_upload: Optional[bool] = field()
count: Optional[int] = field()
cover_photo: Optional[
dict
] = (
cover_photo: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/photo/
created_time: Optional[str] = field()
description: Optional[str] = field()
event: Optional[
dict
] = (
event: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/event/
_from: Optional[dict] = field(metadata=config(field_name="from"))
link: Optional[str] = field()
location: Optional[str] = field()
name: Optional[str] = field(repr=True)
place: Optional[
dict
] = (
place: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/place/
privacy: Optional[str] = field()
Expand Down
4 changes: 1 addition & 3 deletions pyfacebook/models/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,7 @@ class Application(BaseModel):
auth_referral_friend_perms: Optional[List[str]] = field()
auth_referral_response_type: Optional[str] = field()
auth_referral_user_perms: Optional[List[str]] = field()
business: Optional[
dict
] = (
business: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/marketing-api/reference/business/
canvas_fluid_height: Optional[bool] = field()
Expand Down
1 change: 1 addition & 0 deletions pyfacebook/models/base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Base model
"""

from copy import deepcopy
from dataclasses import dataclass, field as base_field
from typing import (
Expand Down
4 changes: 1 addition & 3 deletions pyfacebook/models/comment.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,7 @@ class Comment(BaseModel):
object: Optional[dict] = field() # TODO
parent: Optional["Comment"] = field()
permalink_url: Optional[str] = field()
private_reply_conversation: Optional[
dict
] = (
private_reply_conversation: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/conversation
user_likes: Optional[bool] = field()
Expand Down
1 change: 1 addition & 0 deletions pyfacebook/models/conversation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

Refer: https://developers.facebook.com/docs/graph-api/reference/conversation
"""

from dataclasses import dataclass
from typing import List, Optional

Expand Down
8 changes: 2 additions & 6 deletions pyfacebook/models/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,10 @@ class Event(BaseModel):
online_event_format: Optional[str] = field()
online_event_third_party_url: Optional[str] = field()
owner: Optional[dict] = field()
parent_group: Optional[
dict
] = (
parent_group: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/group/
place: Optional[
dict
] = (
place: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/place/
scheduled_publish_time: Optional[str] = field()
Expand Down
13 changes: 4 additions & 9 deletions pyfacebook/models/live_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

Refer: https://developers.facebook.com/docs/graph-api/reference/live-video/
"""

from dataclasses import dataclass
from typing import List, Optional

Expand All @@ -24,9 +25,7 @@ class VideoCopyrightRule(BaseModel):
condition_groups: Optional[List[dict]] = field() # TODO
copyrights: Optional[List[str]] = field()
created_date: Optional[str] = field()
creator: Optional[
dict
] = (
creator: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/user/
is_in_migration: Optional[bool] = field()
Expand All @@ -44,9 +43,7 @@ class VideoCopyright(BaseModel):
id: Optional[str] = field(repr=True, compare=True)
content_category: Optional[str] = field()
copyright_content_id: Optional[str] = field()
creator: Optional[
dict
] = (
creator: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/user/
excluded_ownership_segments: Optional[List[dict]] = field() # TODO
Expand Down Expand Up @@ -134,9 +131,7 @@ class LiveVideo(BaseModel):
stream_url: Optional[str] = field()
targeting: Optional[dict] = field() # TODO
title: Optional[str] = field(repr=True)
video: Optional[
dict
] = (
video: Optional[dict] = (
field()
) # TODO Refer: https://developers.facebook.com/docs/graph-api/reference/video/

Expand Down
1 change: 1 addition & 0 deletions pyfacebook/models/page.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

Refer: https://developers.facebook.com/docs/graph-api/reference/page
"""

from dataclasses import dataclass
from typing import List, Optional

Expand Down
Loading
Loading