Create a Buffer post for a single channel via GraphQL. Args: access_token: Buffer API access token channel_id: Buffer channel ID to post to text: The post text content media: Optional media dict with key 'photo' or 'url' containing image URL metadata: Opt
(
access_token: str,
channel_id: str,
text: str,
media: Optional[Dict] = None,
metadata: Optional[Dict] = None,
scheduled_at: Optional[str] = None,
now: bool = False,
)
| 146 | # --- Post creation --- |
| 147 | |
| 148 | def create_buffer_post( |
| 149 | access_token: str, |
| 150 | channel_id: str, |
| 151 | text: str, |
| 152 | media: Optional[Dict] = None, |
| 153 | metadata: Optional[Dict] = None, |
| 154 | scheduled_at: Optional[str] = None, |
| 155 | now: bool = False, |
| 156 | ) -> Dict: |
| 157 | """Create a Buffer post for a single channel via GraphQL. |
| 158 | |
| 159 | Args: |
| 160 | access_token: Buffer API access token |
| 161 | channel_id: Buffer channel ID to post to |
| 162 | text: The post text content |
| 163 | media: Optional media dict with key 'photo' or 'url' containing image URL |
| 164 | metadata: Optional per-platform metadata for Buffer GraphQL |
| 165 | scheduled_at: Optional ISO 8601 timestamp for scheduling |
| 166 | now: If True, post immediately (shareNow mode) |
| 167 | |
| 168 | Returns: |
| 169 | Dict with success status. On success: {"success": True, "post": {...}}. |
| 170 | On failure: {"success": False, "error": "..."}. |
| 171 | """ |
| 172 | if scheduled_at: |
| 173 | mode = "customScheduled" |
| 174 | elif now: |
| 175 | mode = "shareNow" |
| 176 | else: |
| 177 | mode = "addToQueue" |
| 178 | |
| 179 | post_input: Dict = { |
| 180 | "channelId": channel_id, |
| 181 | "text": text, |
| 182 | "schedulingType": "automatic", |
| 183 | "mode": mode, |
| 184 | } |
| 185 | |
| 186 | if scheduled_at: |
| 187 | post_input["dueAt"] = scheduled_at |
| 188 | |
| 189 | if metadata: |
| 190 | post_input["metadata"] = metadata |
| 191 | |
| 192 | # Map media (REST used media[photo], GraphQL uses assets.images) |
| 193 | if media: |
| 194 | photos = media.get("photos") # list of URLs (for carousel) |
| 195 | if photos: |
| 196 | post_input["assets"] = { |
| 197 | "images": [{"url": u} for u in photos] |
| 198 | } |
| 199 | else: |
| 200 | image_url = media.get("photo") or media.get("url") |
| 201 | if image_url: |
| 202 | post_input["assets"] = { |
| 203 | "images": [{"url": image_url}] |
| 204 | } |
| 205 |
no test coverage detected