async def instagram_stories(message: Message): msg_to_delete = await message.reply("downloading") stories = re.match(config.ig_video_stories, message.text) username = stories.group('username') story_id = stories.group('id') try: meta_info = await downloader.get_user_story(story_id=story_id, username=username) except (PrivateAccountException, BadResponseException) as ex: await message.reply(PrivateAccountException().message) await msg_to_delete.delete() raise ex short_code = meta_info.get('shortcode') author = meta_info.get('author') name = f'media/{short_code}_ig.jpg' if meta_info.get('is_video'): # отправляем юзеру данные о фото name = f'media/{short_code}_ig.mp4' await message.reply_video(InputFile(path_or_bytesio=name), caption=f'{author} \n\n' + "downloadedwith") else: await message.reply_photo(InputFile(path_or_bytesio=name), caption=f'{author} \n\n' + "downloadedwith") await msg_to_delete.delete()
async def send_track(chat_id, track): try: stream = await track.download() thumb = await track.get_thumb() if thumb: thumb = BytesIO(thumb) filename = f"{track.artist} - {track.title}.mp3".replace('/', '_') except ValueError: await bot.send_message( chat_id, "🚫This track is not available " f"({track.artist} - {track.title})") raise await bot.send_chat_action(chat_id, 'upload_audio') msg = await bot.send_audio(chat_id=-1001246220493, audio=InputFile(stream, filename=filename), thumb=InputFile(thumb, filename='thumb.jpg'), performer=track.artist, title=track.title, duration=track.duration) file_id = msg.audio.file_id await db_utils.add_vk_track(track.full_id, file_id) await bot.send_audio(chat_id, file_id) var.downloading.pop(track.full_id, None) var.vk_tracks.pop(track.full_id, None)
async def send_pdf_file(msg): await msg.reply('Обрабатываю...') out_file_name = 'out_data/out{}.pdf'.format(msg.chat.id) if db_models.Url.objects(url=msg.text).count() > 0: urlobj = db_models.Url.objects.get(url=msg.text) else: urlobj = db_models.Url(url=msg.text) urlobj.amount += 1 urlobj.save() try: url_downloader.download_url_weasyprint(msg.text, out_file_name) await bot.send_document(msg.chat.id, InputFile(out_file_name)) except Exception as e: logging.critical("Weasyprint didn't convert. Trying weasyprint") try: url_downloader.download_url_wkhtmltopdf(msg.text, out_file_name) await bot.send_document(msg.chat.id, InputFile(out_file_name)) except Exception as e: await bot.send_message( msg.chat.id, 'Не вышло:( Попробуйте еще раз или сообщите разработчику о проблеме' ) raise e
async def customization_ascii(call: CallbackQuery): await call.answer(cache_time=3) username = call.from_user.username await call.message.edit_text('Wait some seconds...') # Customization for default ascii output = ascii_magic.from_image_file(f'docs/{username}/picture.png', columns=129, mode=ascii_magic.Modes.ASCII) with open(f'docs/{username}/ascii.txt', "w") as f: f.write(output) # txt to to png imgkit.from_file(f'docs/{username}/ascii.txt', f'docs/{username}/ascii.png') await call.message.edit_text('Done! Sending ...') size_b = os.path.getsize(f'docs/{username}/ascii.png') # Size of screenshot in bytes size_mb = size_b / 1_000_000 # Size of screenshot in mb if size_mb < 10: # restriction of Telegram. Image can't be more than 10mb await call.message.answer_photo(InputFile(path_or_bytesio=f'docs/{username}/ascii.png')) await call.message.answer_document(InputFile(f'docs/{username}/ascii.png')) await call.message.answer_document(InputFile(f'docs/{username}/ascii.txt')) else: await call.message.answer('So big size of photo. Sending only photo-file...') await call.message.answer_document(InputFile(f'docs/{username}/ascii.png')) await call.message.answer_document(InputFile(f'docs/{username}/ascii.txt')) await call.message.delete() shutil.rmtree(f'docs/{username}/') # Removing dir with user files
async def process_filter_type(message: Message, state: FSMContext): async with state.proxy() as data: data['filter_type'] = message.text if data['filter_type'] in ['Январь-Март', 'Апрель-Июнь', 'Июль-Сентябрь', 'Октябрь-Декабрь', 'Весь год']: responses = date_response(data) if responses: if len(responses) < 6: for r in responses: await message.reply(text_answer(r), parse_mode='HTML', reply=False, reply_markup=ReplyKeyboardRemove()) else: pdf_table(responses) # f = os.path.abspath(os.curdir) + '/event_table.pdf' await message.answer('В выбранный период слишком много соревнований. ' 'Вам будет отправлен pdf файл', reply_markup=ReplyKeyboardRemove()) await bot.send_document(message.from_user.id, document=InputFile('event_table.pdf')) else: await message.reply('В выбранный период нет соревнований', reply_markup=ReplyKeyboardRemove()) else: responses = name_response(data) if responses: if len(responses) < 6: for r in responses: await message.reply(text_answer(r), parse_mode='HTML', reply=False, reply_markup=ReplyKeyboardRemove()) else: pdf_table(responses) await message.answer('По выбранному имени слишком много соревнований. ' 'Вам будет отправлен pdf файл.', reply_markup=ReplyKeyboardRemove()) await bot.send_document(message.from_user.id, document=InputFile('event_table.pdf')) else: await message.reply('По введённому названию ничего не найдено', reply_markup=ReplyKeyboardRemove()) await state.finish()
async def default_html(call: CallbackQuery): """Converting image to html, and taking screenshot of html page""" await call.answer(cache_time=3) username = call.from_user.username await call.message.edit_text('Wait some seconds...') output = ascii_magic.from_image_file( f'docs/{username}/picture.png', columns=1000, mode=ascii_magic.Modes.HTML) # Customization for default html doc ascii_magic.to_html_file(f'docs/{username}/ascii.html', output) # Reversing from image to html imgkit.from_file(f'docs/{username}/ascii.html', f'docs/{username}/html.png') # Screenshot from html page ########################################################################################### # Cropping Image # image = Image.open(f'docs/{username}/html.png') width, height = image.size # Cropping coordinates left = 8 top = 16 right = width bottom = height - top # Cropped image of above dimension im = image.crop((left, top, right, bottom)) # Shows the image in image viewer im.save(f'docs/{username}/html.png') ########################################################################################### size_b = os.path.getsize( f'docs/{username}/html.png') # Size of screenshot in bytes size_mb = size_b / 1_000_000 # Size of screenshot in mb await call.message.edit_text('Done! Sending ...') if size_mb < 10: # restriction of Telegram. Image can't be more than 10mb await call.message.answer_photo( InputFile(path_or_bytesio=f'docs/{username}/html.png')) await call.message.answer_document( InputFile(f'docs/{username}/html.png')) await call.message.answer_document( InputFile(f'docs/{username}/ascii.html')) else: await call.message.answer( 'So big size of photo. Sending only photo-document...') await call.message.answer_document( InputFile(f'docs/{username}/html.png')) await call.message.answer_document( InputFile(f'docs/{username}/ascii.html')) await call.message.delete() shutil.rmtree(f'docs/{username}/') # Removing dir with user files7
def task_scheduler(): while True: if not task_queue.empty(): task = task_queue.get() if task['type'] == 'nst': subprocess.run( f'python3 bot/Algos/vanila_nst/main.py eval --content-image {task["content_path"]} --style-image {task["content_path"]} --model bot/Algos/vanila_nst/models/21styles.model --content-size 256 --style-size 256 --cuda=0', shell=True) photo = InputFile(path_or_bytesio='output.jpg') # fix elif task['type'] == 'gan': chosen_model = task['model'] shutil.move( 'data/img1.jpg', 'bot/Algos/cyclegan/datasets/test_root/testA/img1.jpg') shutil.move( 'data/img2.jpg', 'bot/Algos/cyclegan/datasets/test_root/testB/img2.jpg') ######## if chosen_model == 'summer_to_winter': link = '1tbYQNGBW3zrBZTl2Om3_IEN2tmvA1rmF' # скачиваем образ1 elif chosen_model == 'vangogh': link = '1_PVn400veyxwPWfdQLlE3K9PzHxS3VxI' elif chosen_model == 'monet': link = '1ix3sZzC1zKsvv1S3xihqHqKypqwHyrI9' ########## gdd.download_file_from_google_drive( file_id=link, dest_path='bot/Algos/cyclegan/checkpoints/model.ckpt', showsize=True) os.chdir('bot/Algos/cyclegan') subprocess.run( 'python3 main.py --testing True --dataset_dir datasets/test_root --checkpoint_dir checkpoints ' '--gpu_ids -1 --crop_height 500 --crop_width 500 --idt_coef 0.1 --checkpoint checkpoints/model.ckpt', shell=True) photo = InputFile(path_or_bytesio='results/sample.jpg') # fix os.chdir('../../..') send_fut = asyncio.run_coroutine_threadsafe( send_photo(task['message'], photo), loop) send_fut.result() task_queue.task_done() asyncio.sleep(2)
async def book_buttons(call: types.CallbackQuery): try: if call.data == BUTTONS_BOOK[0]: await call.answer(text=SHORT_INFO, show_alert=True) elif call.data == BUTTONS_BOOK[1]: await call.answer() try: photos = [ InputFile("content/kotor.png"), InputFile("content/map.png"), InputFile("content/perast.png"), InputFile("content/zmajevic.png") ] await call.message.answer("Moć dizajna ↓") for i in photos: await bot.send_document(document=i, chat_id=call.message.chat.id) except FileNotFoundError as fe: await call.message.answer("Не получилось найти изображения") print(f"[ERROR]: {fe}") elif call.data == BUTTONS_BOOK[2]: buttons = [ types.InlineKeyboardButton(text=BUTTONS_NAVIGATION[i], callback_data=BUTTONS_NAVIGATION[i]) for i in range(len(BUTTONS_NAVIGATION)) ] keyboard = types.InlineKeyboardMarkup(row_width=1) keyboard.add(*buttons) await call.answer() await call.message.answer( "Узнайте, где в книге найти данные темы: ↓", reply_markup=keyboard) elif call.data == BUTTONS_BOOK[3]: buttons = ["🔙" ] + [str(i) for i in range(1, len(BUTTONS_CITIES) + 1)] keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=5) keyboard.add(*buttons) await call.answer() await call.message.answer("\n".join([ str(i + 1) + ") " + list(BUTTONS_CITIES)[i] for i in range(len(BUTTONS_CITIES)) ])) await call.message.answer( "Выберите город/достопримечательность на клавиатуре ↓", reply_markup=keyboard) except IndexError as ie: # Если забыли изменить код после редактирования кол-ва кнопок await call.message.answer( "Нет доступа к этой части!\nПопробуйте позже.") await call.answer() print(f"[ERROR]: {ie}")
async def send_track(chat_id, track, Redownload=False): quality = await db_utils.get_quality_setting(chat_id) if not already_downloading(track.id): var.downloading[track.id] = int(time()) else: return if not Redownload: file_id = await db_utils.get_track(track.id, quality) if file_id: await bot.send_audio(chat_id, file_id) var.downloading.pop(track.id) sent_message_logger.info( f'[send track {track.id} to {chat_id}] {track}') return True try: if quality == 'mp3': path = await track.download('MP3_320') elif quality == 'flac': path = await track.download('FLAC') asyncio.create_task(delete_later(path)) except ValueError as e: print(e) await bot.send_message( chat_id, ("🚫This track is not available " f"({track.artist.name} - {track.title})")) raise await bot.send_chat_action(chat_id, 'upload_audio') thumb = await track.get_thumb() if os.path.getsize(path) >> 20 < 49: msg = await bot.send_audio( chat_id=-1001246220493, audio=InputFile(path), thumb=InputFile(thumb), performer=track.artist.name, title=track.title, duration=track.duration) file_id = msg.audio.file_id await db_utils.add_track(track.id, file_id, quality) else: file_id = await post_large_track(path, track, quality, thumb=thumb) await bot.send_audio(chat_id, file_id) shutil.rmtree(path.rsplit('/', 1)[0]) var.downloading.pop(track.id) sent_message_logger.info( f'[send track {track.id} to {chat_id}] {track}') return True
async def test_photo(msg: Message): photo = msg.photo[-1] file = BytesIO() await photo.download(destination=file) cropped_img_file: BytesIO = await get_drawn_img(file) await msg.answer_photo(InputFile(cropped_img_file))
async def consumer(queue): while True: if not task_thread.has_task: _id = await queue.get() LOG.info(f"received {_id}") try: state = dp.current_state(user=_id) try: is_success = await do_task(_id, state) except Exception as e: LOG.critical(f"task exception: {e}") is_success = False if is_success: await bot.send_photo(_id, InputFile(PATH.RESULT_PATH), caption="Готово!") else: await bot.send_message(_id, "Что-то пошло не так, попробуйте заново") await state.finish() except Exception as e: LOG.critical(f"consumer exception: {e}") queue.task_done() else: await asyncio.sleep(2)
async def gotovka_catalog(call: CallbackQuery): photo3 = InputFile(path_or_bytesio="photos/credit_image/credit1.jpg") await call.message.reply_photo( photo=photo3, caption= ("<b>Ваша Готивочка</b> - <i>Главной составляющей системы </i>\n" "<i>кредитования 'Ваша Готівочка' является удобство! </i>\n" "<i>Мы предлагаем простые и понятные условия займа.</i>\n" "<a href='https://rozetka.com.ua'>Подробнее</a>👈\n\n" "<b>Условия:</b>\n" "• Сумма займа: от 200 до 9000 грн.\n" "• Время рассмотрения заявки – 15 мин.\n" "• Без справки о доходах\n\n" "<b>Преимущества.</b>\n" "не просим клиента ксерокопию документов или фото документов\n" "не просим клиента фото с паспортом или банковской картой\n" "не просим клиента указывать аккаунт в социальной сети\n" "не просим у клиента справку о доходах\n" "не просим клиента телефон родственника\n\n" "<b>Требование к заёмщику:</b>\n" "• Возраст: от 18 до 60 лет\n" "• Гражданство Украины\n" "• наличие банковской карты (для перечисления кредитных средств) и мобильного телефона" ), reply_markup=there_menu)
def get_separated_imgs(img_file: BytesIO, start, middle, end) -> tuple: img: Image.Image = Image.open(img_file) for param in (start, middle, end): if param > img.size[1] or param < 0: return None, None word_img_file, transl_img_file = BytesIO(), BytesIO() img.crop((0, start, img.size[0], middle)).save(word_img_file, format="png") img.crop((0, middle, img.size[0], end)).save(transl_img_file, format="png") word_img_file.seek(0) transl_img_file.seek(0) return InputFile(word_img_file), InputFile(transl_img_file)
async def offer_docx(call: CallbackQuery, state: FSMContext): async with state.proxy() as data: message = data['message'] await bot.send_chat_action(message.from_user.id, ChatActions.UPLOAD_DOCUMENT) order = {} async with state.proxy() as data: order.update(data) message = data['message'] date = datetime.today().strftime("%d.%m.%y") offer_crate(order) msg = 'Прверьте, пожалуйста, документ. Если всё в порядке - ' \ 'Нажмите "В PDF". По необходимости, Вы можете отредактировать' \ 'документ и прислать его сюда!' await Stage.Q4.set() await bot.send_document(message.from_user.id, InputFile(f'КП_от_{date}.docx')) await bot.send_message( message.from_user.id, text=msg, reply_markup=kb.pdf, )
async def imageHandler(message): res = str(db.findResult(message.from_user.id)) print(res) if ( res ): # далее идёт псевдо агрегация по результатам теста для выявления профессии if (res[4] == '2' and res[7] == '2'): res = professions[0] elif (res[1] == '1' and res[4] == '1'): res = professions[1] elif (res[2] == '1' and res[3] == '1'): res = professions[2] elif (res[3] == '1' and res[6] == '1'): res = professions[3] else: res = professions[4] img_path = "users_images/" + str(message.from_user.id) + '.jpg' await message.photo[-1].download(img_path ) # скачиваем картинку пользователя print(predict_batch( img_path, res)) # отправляем в модель (она создаёт новую картинку) await message.answer_photo( InputFile(img_path + '_'), "Скорее всего в будущем ты будешь:\n" + profBeautiful[res] ) # отправляем полученную из модели картинку else: await message.answer('Рановато кидаешь фотку\nПройди тест!', reply_markup=createInlineMenu([[['Меню', 'menu']]]))
def video_captcha(lang): global fnt fnt = ImageFont.truetype( '/home/albert/.local/share/fonts/Iosevka Term Nerd Font Complete.ttf', 60) x = randint(50, 100) y = randint(50, 100) symbol = choice(['-', '+']) if symbol == '-': z = x - y elif symbol == '+': z = x + y else: print('Error') td = TemporaryDirectory(dir='.') gen_pics(f'{x}', path.join(td.name, '1.png')) gen_pics(symbol, path.join(td.name, '2.png')) gen_pics(f'{y}', path.join(td.name, '3.png')) gen_pics('equal?', path.join(td.name, '4.png')) line = f'ffmpeg -hide_banner -loglevel panic -y -r 1 -i {path.join(td.name, "%01d.png")} -c:v libx264 -vf fps=1 -pix_fmt yuv420p out.mp4' subprocess.call(line.split(' ')) input_file = InputFile('out.mp4') inline_kb_full = InlineKeyboardMarkup(row_width=3) inline_kb_full.row(*[item2btn(i) for i in [7, 8, 9]]) inline_kb_full.row(*[item2btn(i) for i in [4, 5, 6]]) inline_kb_full.row(*[item2btn(i) for i in [1, 2, 3]]) inline_kb_full.row(InlineKeyboardButton('⌫', callback_data='backspace'), item2btn(0)) btn_pass = [c for c in f'{z}'] print(btn_pass) return (input_file, inline_kb_full, btn_pass)
async def on_created(self, event): event_id, is_video = self.get_event_id(event.src_path) if not event_id: return chat_ids = get_chat_ids() if not is_video: logger.info(f"New event {event_id}") logger.info("Send message") await asyncio.wait([ self.bot.send_message( chat_id, f"Новое уведомление " f"{ZM_URL}/?view=event&eid={event_id}") for chat_id in chat_ids ]) return while event_id not in self.events: await asyncio.sleep(2) if len(self.events) > 10: asyncio.create_task(self.clear_events()) logger.info("Send video") video = InputFile(event.src_path) await asyncio.wait( [self.bot.send_video(chat_id, video) for chat_id in chat_ids])
def _get_document(document: dict) -> Tuple[InputFile, str]: content = document.get("content") filename = document.get("filename") caption = document.get("caption") text_file = InputFile(io.StringIO(content), filename=filename) return text_file, caption
async def upload_data_to_csv(user_id: int, from_date: date = DEFAULT_DATE, field_names=None) -> Optional[InputFile]: if field_names is None: field_names = DEFAULT_FIELD_NAMES if data := await Finance.get_transactions(user_id=user_id, from_date=from_date): output = construct_csv(data, field_names) return InputFile(BytesIO(output.encode('utf8')), filename='your_data.csv')
async def bot_start(message: types.Message): await message.answer( f'Привет, {message.from_user.full_name}!, Введите часть телефонного номера ' f'как приведено на картинке, для получения информации о телефонной компании и местности' ) photo = InputFile(path_or_bytesio="photos/2.jpg") await message.answer_photo(photo=photo)
async def send_track(chat_id, track, Redownload=False): quality = await db_utils.get_quality_setting(chat_id) if not already_downloading(track.id): var.downloading[track.id] = int(time()) else: return if not Redownload: file_id = await db_utils.get_track(track.id, quality) if file_id: await bot.send_audio(chat_id, file_id) var.downloading.pop(track.id) sent_message_logger.info( f'[send track {track.id} to {chat_id}] {track}') return True try: if quality == 'mp3': track_file = await track.download('MP3_320') elif quality == 'flac': track_file = await track.download('FLAC') filename = f"{track.artist.name} - {track.title}.{quality}".replace( '/', '_') except ValueError as e: print(e) await bot.send_message(chat_id, ("🚫This track is not available " f"({track.artist.name} - {track.title})")) raise await bot.send_chat_action(chat_id, 'upload_audio') thumb = await track.get_thumb() if thumb: thumb = BytesIO(thumb) msg = await bot.send_audio(chat_id=-1001246220493, audio=InputFile(track_file, filename=filename), thumb=InputFile(thumb, filename='thumb.jpg'), performer=track.artist.name, title=track.title, duration=track.duration) file_id = msg.audio.file_id await db_utils.add_track(track.id, file_id, quality) await bot.send_audio(chat_id, file_id) var.downloading.pop(track.id) sent_message_logger.info(f'[send track {track.id} to {chat_id}] {track}') return True
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Карасиков.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Карасиков Евгений\n' 'Программный директор\n' 'Номер телефона: +7(961)590-31-22\n' 'Инстаграм: https://instagram.com/karas_i_ko\n' 'Вконтакте: https://vk.com/karas_i_ko')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Деркач-Инна.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Деркач Инна\n' 'Куратор\n' 'Номер телефона: +7(999)637-22-60\n' 'Инстаграм: https://instagram.com/innochkaderkach\n' 'Вконтакте: https://vk.com/id153602793')
async def finish_download(track, inline_message_id, user): file_id = await db_utils.get_track(track.id) if file_id: return await bot.edit_message_media( media=types.InputMediaAudio(media=file_id, title=track.title, performer=track.artist.name, duration=track.duration), inline_message_id=inline_message_id) try: track_file = await track.download() thumb = await track.get_thumb() if thumb: thumb = BytesIO(thumb) filename = f"{track.artist.name} - {track.title}.mp3".replace('/', '_') except ValueError: return await bot.edit_message_reply_markup( inline_message_id=inline_message_id, reply_markup=inline_keyboards.download_error_keyboard) msg = await bot.send_audio(chat_id=-1001246220493, audio=InputFile(track_file, filename=filename), thumb=InputFile(thumb, filename='thumb.jpg'), performer=track.artist.name, title=track.title, duration=track.duration) file_id = msg.audio.file_id await db_utils.add_track(track.id, file_id) file_id = await db_utils.get_track(track.id) try: await bot.edit_message_media(media=types.InputMediaAudio( media=file_id, title=track.title, performer=track.artist.name, duration=track.duration), inline_message_id=inline_message_id) except exceptions.BadRequest: try: await bot.send_audio(user.id, file_id) except: pass file_download_logger.info( f'[downloaded track {track.id} (inline)] {track}') sent_message_logger.info( f'[send track {track.id} to {format_name(user)} (inline)] {track}')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Аникина.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Аникина Таисия\n' 'Старший куратор\n' 'Номер телефона: +7(918)686-71-78\n' 'Инстаграм: instagram.com/taya_burton\n' 'Вконтакте: http://vk.com/taya_burton')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Шпак.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Шпак Анна\n' 'Куратор / Хореограф\n' 'Номер телефона: +7(928)847-04-47\n' 'Инстаграм: https://instagram.com/_aana_aana_\n' 'Вконтакте: https://vk.com/anya_hp')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Кляхина.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Кляхина Татьяна\n' 'Куратор\n' 'Номер телефона: +7(918)231-96-01\n' 'Инстаграм: https://www.instagram.com/tataperova/\n' 'Вконтакте: http://vk.com/tataperova')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Гудко.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Гудко Юлия\n' 'Куратор\n' 'Номер телефона: +7(913)876-71-61\n' 'Инстаграм: https://instagram.com/_gudok\n' 'Вконтакте: https://vk.com/ygudko1')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Мартиросян.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Мартиросян Армен\n' 'Куратор\n' 'Номер телефона: +7(918)652-22-27\n' 'Инстаграм: instagram.com/armen_mart07\n' 'Вконтакте: http://vk.com/armen_mart07')
async def cv_orgs(message: types.Message): photo = InputFile(path_or_bytesio='static/cv/Кишинек.png') await bot.send_photo(chat_id=message.from_user.id, photo=photo) await message.answer(text='Кишинек Илья\n' 'Куратор\n' 'Номер телефона: +7(918)687-05-81\n' 'Инстаграм: instagram.com/_kishinek_\n' 'Вконтакте: vk.com/kishinek')