import logging import httpx logger = logging.getLogger(__name__) MESSENGER_API_BASE = "https://graph.facebook.com/v22.0" async def download_media(media_url: str) -> bytes | None: try: async with httpx.AsyncClient(timeout=httpx.Timeout(30.0)) as client: resp = await client.get(media_url) if resp.status_code == 200: return resp.content logger.warning(f"messenger media download failed: {resp.status_code}") return None except Exception: logger.exception("messenger media download error") return None async def upload_attachment( page_id: str, access_token: str, file_data: bytes, file_name: str, media_type: str, mime_type: str, ) -> str | None: try: files = { "filedata": (file_name, file_data, mime_type), } data = { "message": str( { "attachment": { "type": media_type, "payload": {"is_reusable": True}, } } ), } async with httpx.AsyncClient(timeout=httpx.Timeout(60.0)) as client: resp = await client.post( f"{MESSENGER_API_BASE}/{page_id}/message_attachments", params={"access_token": access_token}, files=files, data=data, ) if resp.status_code == 200: result = resp.json() attachment_id = result.get("attachment_id", "") logger.info(f"messenger attachment uploaded: {attachment_id}") return attachment_id logger.error(f"messenger attachment upload failed: {resp.status_code} {resp.text}") return None except Exception: logger.exception("messenger attachment upload error") return None