Mobilizon-Reshare-condividi.../mobilizon_reshare/publishers/platforms/facebook.py

86 lines
2.4 KiB
Python

from typing import Optional
import facebook
from facebook import GraphAPIError
from mobilizon_reshare.dataclasses import MobilizonEvent
from mobilizon_reshare.formatting.description import html_to_plaintext
from mobilizon_reshare.publishers.abstract import (
AbstractPlatform,
AbstractEventFormatter,
)
from mobilizon_reshare.publishers.exceptions import (
InvalidCredentials,
InvalidEvent,
InvalidMessage,
PublisherError,
)
class FacebookFormatter(AbstractEventFormatter):
_conf = ("publisher", "facebook")
def _validate_event(self, event: MobilizonEvent) -> None:
text = event.description
if not (text and text.strip()):
self._log_error("No text was found", raise_error=InvalidEvent)
def _validate_message(self, message) -> None:
if len(message) >= 63200:
self._log_error("Message is too long", raise_error=InvalidMessage)
def _preprocess_event(self, event: MobilizonEvent):
event.description = html_to_plaintext(event.description)
event.name = html_to_plaintext(event.name)
return event
class FacebookPlatform(AbstractPlatform):
"""
Facebook publisher class.
"""
name = "facebook"
def _get_api(self) -> facebook.GraphAPI:
return facebook.GraphAPI(access_token=self.conf["page_access_token"])
def _send(self, message: str, event: Optional[MobilizonEvent] = None):
try:
self._get_api().put_object(
parent_object="me",
connection_name="feed",
message=message,
link=event.mobilizon_link if event else None,
)
except GraphAPIError:
self._log_error(
"Facebook send failed", raise_error=PublisherError,
)
def validate_credentials(self):
try:
self._log_debug("Validating Facebook credentials")
self._get_api().get_object(id="me", field="name")
except GraphAPIError:
self._log_error(
"Invalid Facebook credentials. Authentication Failed",
raise_error=InvalidCredentials,
)
self._log_debug("Facebook credentials are valid")
def _validate_response(self, response):
pass
class FacebookPublisher(FacebookPlatform):
_conf = ("publisher", "facebook")
class FacebookNotifier(FacebookPlatform):
_conf = ("notifier", "facebook")