def get_response(self) -> list: from facebook import GraphAPI graph = GraphAPI(access_token=self.get_access_token(), version=self.__API_VERSION) return list( graph.get_all_connections( id="{0}_{1}".format(self.get_page_id(), self.get_post_id()), connection_name= "comments?fields=created_time,id,from,attachment"))
def get_comments(postid, token): """ Args: Takes a postid and API access token, Out: returns all comments from that post in list format, unformatted. """ commentlist = [] graph = GraphAPI(token) postObj = graph.get_all_connections(id=postid, connection_name = 'comments') for x in postObj: temp = [x[key] for key in ['message', 'created_time']] commentlist.append(temp) return commentlist
class FacebookDataProvider: def __init__(self, access_token): self.access_token = access_token self.graph_api_client = GraphAPI(access_token=access_token, version=settings.FACEBOOK_GRAPH_API_VERSION) def get_object_response(self, id, fields): try: return self.graph_api_client.get_object(id=id, fields=fields) except GraphAPIError as e: return e.result def get_connection_response(self, id, connection_name, fields): try: responses = self.graph_api_client.get_all_connections(id=id, connection_name=connection_name, fields=fields) return [response for response in responses] except GraphAPIError as e: return e.result
def get_posts(name, token): """ Args: Takes a pagename and API token Out: Outputs all postids on the page """ graph = GraphAPI(token) pageObj = graph.get_object(id = name, fields = 'id') pageid = pageObj['id'] postObj = graph.get_all_connections(id = pageid, connection_name='posts') postlist = [] for x in postObj: temp = [x[key] for key in ['id', 'created_time']] postlist.append(temp) return postlist
def get_anon_comments(postid, token): """ Args: Takes a postid and API access token Out: returns all comments from that post in list format, unformatted. """ commentlist, taglist = [], [] graph = GraphAPI(token) postObj = graph.get_all_connections(id=postid, \ connection_name = 'comments',\ fields = 'message_tags') temp = [x for x in postObj] i = 0 for y in temp: if len(y) > 1: taglist.append([y['message_tags'][0]['name'], i]) i += 1 comments = get_comments(postid, token) for x in taglist: j = x[1] comments[j][0] = comments[j][0].replace(x[0], 'tagged person') return comments
class Facebook(SocialNetwork): graph = None my_id = None base_url = f"https://graph.facebook.com/v{FACEBOOK_API_VERSION}" def __init__(self, debug=False): super().__init__( sn_key=SocialNetworkType.facebook, debug=debug, ) # load env vars after calling super().__init__(*args, **kwargs) self.access_token = os.environ.get(FACEBOOK_ACCESS_TOKEN, None) if self.access_token: try: self.graph = GraphAPI( access_token=self.access_token, timeout=REQUESTS_TIMEOUT, version=FACEBOOK_API_VERSION, ) me = self.graph.get_object("me", fields="id") self.my_id = me.get("id", None) if self.debug: print(f"Initialized") except Exception as err: if self.debug: print("ERROR: could not initialize Facebook! X_X", err) def search(self, q=None, **kwargs): """ https://developers.facebook.com/docs/places/search example: search(type=place, q=McDonalds, fields=name,checkins,website) Deprecated on v8.0 :( """ type_ = kwargs.get("type", None) fields = kwargs.get("fields", None) center = kwargs.get("center", None) distance = kwargs.get("distance", None) if not type_: return None if not q and not center: if self.debug: print("At least one of `q` or `center` keyword args is required") return None url = f"{self.base_url}/search?type={type_}" if self.debug: url += "&debug=all" if q: url += f"&q={q}" if center: url += f"¢er={center}" if distance: url += f"&distance={distance}" if fields: url += f"&fields={fields}" url += f"&access_token={self.access_token}" try: response = requests.get(url, timeout=REQUESTS_TIMEOUT) return response.json() except (requests.HTTPError, Exception): return None def get(self, **kwargs): # type: (Any) -> Optional[Union[Dict[str,Union[bytes,str]], Dict[str, str], Generator[Union[int,str],Any, None]]] # noqa if not self.my_id or not self.graph: if self.debug: print("Could not initialize me :(") return None id_ = kwargs.pop("id", None) ids = kwargs.pop("ids", None) if not id_ and not ids: if self.debug: print("At least one of ``id``, ``ids`` keyword args is required") return None if id_: connection_name = kwargs.pop("connection_name", None) if connection_name: get_all = kwargs.pop("get_all", False) if get_all: return self.graph.get_all_connections( id_, connection_name=connection_name, **kwargs ) return self.graph.get_connections( id_, connection_name=connection_name, **kwargs ) return self.graph.get_object(id_, **kwargs) return self.graph.get_objects(ids, **kwargs) def post(self, text=None, url=None, media=None, **kwargs): parent_object = kwargs.get("parent_object", "me") connection_name = kwargs.get("connection_name", "feed") response = None try: if media: url = f"{FACEBOOK_GRAPH_URL}/{parent_object}/photos?access_token={self.access_token}" if os.path.exists(media): name = os.path.split(media)[-1] files = {name: open(media, "rb")} response = requests.post(url, files=files) else: local_path = self.download_media(media) if local_path and os.path.exists(local_path): name = os.path.split(local_path)[-1] files = {name: open(local_path, "rb")} response = requests.post(url, files=files) os.unlink(local_path) else: if url: response = self.graph.put_object( parent_object=parent_object, connection_name=connection_name, message=text, link=url, ) else: response = self.graph.put_object( parent_object=parent_object, connection_name=connection_name, message=text, ) if self.debug: print(response) return response except Exception as err: print("ERROR: could not post stuff on Facebook! X_X", err) return None def update(self, **kwargs): raise NotImplementedError def delete(self, **kwargs): raise NotImplementedError