Spaces:
No application file
No application file
| import aiohttp | |
| import asyncio | |
| from urllib.parse import quote, parse_qs, urlparse | |
| from bs4 import BeautifulSoup | |
| import bot_strings | |
| import bot_chat | |
| TRIES = {} | |
| MAX_TRIES = 3 | |
| async def get_images(url, aiosession): | |
| images = [] | |
| async with aiosession.get(url) as response: | |
| content = await response.text() | |
| soup = BeautifulSoup(content, "html.parser") | |
| if img_tags := soup.find_all("img"): | |
| images = [img.get('src') for img in img_tags] | |
| return images | |
| async def generate_image(userID, query, cookies, request_id=None): | |
| global TRIES | |
| headers = { | |
| 'User-Agent': | |
| 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0 BingSapphire/24.1.410310303', | |
| 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', | |
| 'Origin': 'https://www.bing.com', | |
| 'Referer': 'https://www.bing.com/images/create?FORM=GENILP', | |
| 'Accept-Language': 'en-US,en;q=0.5' | |
| } | |
| data = {'q': query, | |
| 'qs': 'ds'} | |
| params = {'q': query, | |
| 'rt': 3, | |
| 'FORM': 'GENCRE'} | |
| images, error = [], None | |
| if userID in TRIES.keys(): | |
| return [], bot_strings.POCESSING_ALREADY_STRING, False | |
| TRIES[userID] = 0 | |
| canceled = False | |
| async with aiohttp.ClientSession(headers=headers, cookie_jar=cookies) as session: | |
| async with session.post('https://www.bing.com/images/create', params=params, data=data) as response: | |
| if not response.history: | |
| error = bot_strings.PROCESSING_ERROR_STRING | |
| else: | |
| parsed_url = urlparse(str(response.url)) | |
| id = parse_qs(parsed_url.query)['id'][0] | |
| async with session.get(f'https://www.bing.com/images/create/async/results/{id}?q={quote(query)}') as response: | |
| if response.status == 200: | |
| while not images: | |
| if not (await bot_chat.is_pending(request_id)): | |
| canceled = True | |
| break | |
| images = await get_images(str(response.url), session) | |
| if TRIES[userID] > MAX_TRIES: | |
| break | |
| await asyncio.sleep(5) | |
| del TRIES[userID] | |
| return images, error, canceled | |