예제 #1
0
    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"))
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
파일: Facebook.py 프로젝트: consert/socials
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"&center={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