Spaces:
Build error
Build error
import aiohttp | |
import asyncio | |
from typing import Optional | |
import aiohttp | |
import logging | |
from typing import Optional | |
logger = logging.getLogger(__name__) | |
import aiohttp | |
import aiofiles | |
import logging | |
import os | |
from typing import Optional | |
logger = logging.getLogger(__name__) | |
async def download_whatsapp_media(media_id: str, access_token: str, file_path: Optional[str] = None) -> Optional[str]: | |
""" | |
Asynchronously download media from WhatsApp Cloud API using media ID and save it to a file. | |
Args: | |
media_id (str): The ID of the media to download. | |
access_token (str): Your WhatsApp access token. | |
file_path (Optional[str]): The path where the media file should be saved. | |
Returns: | |
str: The file path if the media is saved successfully. | |
None: If download fails. | |
""" | |
timeout = aiohttp.ClientTimeout(total=30) # Set an appropriate timeout | |
async with aiohttp.ClientSession(timeout=timeout) as session: | |
# Step 1: Get the media URL | |
try: | |
url = f"https://graph.facebook.com/v21.0/{media_id}" | |
headers = { | |
"Authorization": f"Bearer {access_token}" | |
} | |
async with session.get(url, headers=headers) as response: | |
data = await response.json() | |
if response.status != 200: | |
logger.error(f"Failed to get media URL. Status: {response.status}, Response: {data}") | |
return None | |
media_url = data.get('url') | |
if not media_url: | |
logger.error(f"Failed to get media URL from response: {data}") | |
return None | |
except aiohttp.ClientError as e: | |
logger.error(f"Error getting media URL: {e}") | |
return None | |
except Exception as e: | |
logger.error(f"Unexpected error: {e}") | |
return None | |
# Step 2: Download the actual media | |
try: | |
headers = { | |
"Authorization": f"Bearer {access_token}" | |
} | |
async with session.get(media_url, headers=headers) as media_response: | |
if media_response.status != 200: | |
media_data = await media_response.text() | |
logger.error(f"Failed to download media. Status: {media_response.status}, Response: {media_data}") | |
return None | |
if file_path: | |
# Ensure the directory exists | |
os.makedirs("user_media", exist_ok=True) | |
file_path = os.path.join("user_media", file_path) | |
# Write the media content to the file asynchronously | |
async with aiofiles.open(file_path, 'wb') as f: | |
async for chunk in media_response.content.iter_chunked(1024): | |
await f.write(chunk) | |
return file_path | |
else: | |
logger.error("File path not provided for saving the media.") | |
return None | |
except aiohttp.ClientError as e: | |
logger.error(f"Error downloading media: {e}") | |
return None | |
except Exception as e: | |
logger.error(f"Error saving media to file: {e}") | |
return None | |
# async def download_whatsapp_media(media_id: str, access_token: str) -> Optional[bytes]: | |
# """ | |
# Asynchronously download media from WhatsApp Cloud API using media ID | |
# Args: | |
# media_id (str): The ID of the media to download | |
# access_token (str): Your WhatsApp access token | |
# Returns: | |
# bytes: The media content if successful | |
# None: If download fails | |
# """ | |
# headers = { | |
# "Authorization": f"Bearer {access_token}" | |
# } | |
# async with aiohttp.ClientSession() as session: | |
# try: | |
# # Step 1: Get the media URL | |
# url = f"https://graph.facebook.com/v21.0/{media_id}" | |
# async with session.get(url, headers=headers) as response: | |
# if response.status != 200: | |
# print(f"Failed to get media URL. Status: {response.status}") | |
# return None | |
# data = await response.json() | |
# media_url = data.get('url') | |
# if not media_url: | |
# print("Failed to get media URL from response") | |
# return None | |
# # Step 2: Download the actual media | |
# async with session.get(media_url, headers=headers) as media_response: | |
# if media_response.status != 200: | |
# print(f"Failed to download media. Status: {media_response.status}") | |
# return None | |
# return await media_response.read() | |
# # Step 3: Save the media to a file | |
# except aiohttp.ClientError as e: | |
# print(f"Error downloading media: {e}") | |
# return None | |
async def save_whatsapp_image(media_id: str, access_token: str, output_path: str) -> None: | |
""" | |
Asynchronously download and save WhatsApp image to file | |
Args: | |
media_id (str): The ID of the media to download | |
access_token (str): Your WhatsApp access token | |
output_path (str): Path where to save the image | |
""" | |
media_content = await download_whatsapp_media(media_id, access_token) | |
if media_content: | |
# File operations are blocking, so we use asyncio.to_thread for Python 3.9+ | |
# For older Python versions, you might want to use loop.run_in_executor | |
await asyncio.to_thread(save_file, output_path, media_content) | |
print(f"Image saved to {output_path}") | |
else: | |
print("Failed to download image") | |
def save_file(path: str, content: bytes) -> None: | |
"""Helper function to save file content""" | |
with open(path, 'wb') as f: | |
f.write(content) |