import requests import json import os import sys # Use the same token file as the other scripts TOKEN_FILE = 'notion_token.txt' def get_notion_token(): """Reads the Notion API token from the specified file.""" try: with open(TOKEN_FILE, 'r') as f: return f.read().strip() except FileNotFoundError: print(f"Error: Token file not found at '{TOKEN_FILE}'") print("Please create this file and place your Notion Integration Token inside.") sys.exit(1) def parse_markdown_to_blocks(md_content): """ Parses a simple markdown string into Notion API block objects. This is a simplified parser for this specific task. """ blocks = [] lines = md_content.split('\n') for line in lines: stripped = line.strip() if line.startswith("# "): blocks.append({ "object": "block", "type": "heading_1", "heading_1": {"rich_text": [{"type": "text", "text": {"content": line[2:]}}]}}) elif line.startswith("## "): blocks.append({ "object": "block", "type": "heading_2", "heading_2": {"rich_text": [{"type": "text", "text": {"content": line[3:]}}]}}) elif stripped.startswith("* ") or stripped.startswith("- "): blocks.append({ "object": "block", "type": "bulleted_list_item", "bulleted_list_item": {"rich_text": [{"type": "text", "text": {"content": stripped[2:]}}]}}) elif stripped: # Any non-empty line becomes a paragraph blocks.append({ "object": "block", "type": "paragraph", "paragraph": {"rich_text": [{"type": "text", "text": {"content": line}}]}}) # Add a divider for visual separation blocks.insert(0, {"type": "divider", "divider": {}}) blocks.insert(0, { "object": "block", "type": "heading_2", "heading_2": { "rich_text": [{"type": "text", "text": {"content": "Gemini Task-Update:"}}] } }) return blocks def append_blocks_to_page(token, page_id, blocks): """ Appends a list of block objects to a Notion page. """ # In Notion, the page ID is the block ID for appending content url = f"https://api.notion.com/v1/blocks/{page_id}/children" headers = { "Authorization": f"Bearer {token}", "Notion-Version": "2022-06-28", "Content-Type": "application/json" } payload = {"children": blocks} print(f"Appending {len(blocks)} blocks to Notion Page ID: {page_id}...") try: response = requests.patch(url, headers=headers, json=payload) response.raise_for_status() print("SUCCESS: Content appended to Notion task.") except requests.exceptions.HTTPError as e: print(f"ERROR: Failed to update Notion page. Response: {e.response.text}") sys.exit(1) except Exception as e: print(f"ERROR: An unexpected error occurred: {e}") sys.exit(1) if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: python update_notion_task.py \"\"") print("Example: python update_notion_task.py 12345-abc... \"- Task 1\n- Task 2\"") sys.exit(1) page_id = sys.argv[1] content_to_append = sys.argv[2] # Basic validation for page_id if not isinstance(page_id, str) or len(page_id) < 32: print(f"Error: Invalid Page ID provided: '{page_id}'") sys.exit(1) notion_token = get_notion_token() content_blocks = parse_markdown_to_blocks(content_to_append) append_blocks_to_page(notion_token, page_id, content_blocks)