Spaces:
Running
Running
| import requests | |
| import base64 | |
| class GoogleLensScanner: | |
| """ | |
| Utility class to interact with Google Lens upload API. | |
| Provides a free method to perform reverse image searches. | |
| """ | |
| def __init__(self): | |
| self.upload_url = "https://lens.google.com/v3/upload" | |
| def get_lens_url_for_image(self, file_path: str = None, base64_str: str = None) -> str: | |
| """ | |
| Uploads an image (either from file path or base64 string) to Google Lens | |
| and returns the resulting Google Search URL. | |
| """ | |
| if file_path: | |
| with open(file_path, "rb") as f: | |
| image_data = f.read() | |
| filename = file_path.split("/")[-1].split("\\")[-1] | |
| elif base64_str: | |
| # Handle potential data URI scheme | |
| if "," in base64_str: | |
| base64_str = base64_str.split(",")[1] | |
| image_data = base64.b64decode(base64_str) | |
| filename = "upload.jpg" | |
| else: | |
| raise ValueError("Must provide either file_path or base64_str") | |
| files = { | |
| 'encoded_image': (filename, image_data, 'image/jpeg') | |
| } | |
| try: | |
| # We allow redirects to capture the final Google Search URL in response.url | |
| response = requests.post(self.upload_url, files=files, timeout=10, allow_redirects=True) | |
| if response.status_code == 200: | |
| return response.url | |
| else: | |
| raise Exception(f"Google Lens returned status code {response.status_code}") | |
| except Exception as e: | |
| print(f"Error during Google Lens upload: {e}") | |
| return None | |