Написал бота для скачивания всего из профиля в инстаграме, запускаю на пк - все работает отлично, деплою на хероку и бот не работает.
Знаю что на хероку работать сложно с такими библиотеками но, до этого делал код который скачивает просто пост.
Так выглядит код
from aiogram import Dispatcher, types
from create_bot import dp, bot
from aiogram.types import ChatActions
from aiogram.utils.exceptions import InvalidHTTPUrlContent
from bs4 import BeautifulSoup as BS
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
async def downloader(message: types.Message):
if message.text.startswith(f'https://www.instagram.com/p/')\
or message.text.startswith('https://www.instagram.com/s/')\
or message.text.startswith('https://www.instagram.com/tv/')\
or message.text.startswith('https://www.instagram.com/igtv/')\
or message.text.startswith('https://instagram.com/igtv/')\
or message.text.startswith('https://instagram.com/tv/')\
or message.text.startswith('https://instagram.com/s/')\
or message.text.startswith('https://instagram.com/p/'):
print('функция посты')
await downloader_posts(message)
else:
print('функция профиль')
await downloader_profile(message)
def start_browser():
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = '/app/.apt/usr/bin/google-chrome'
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--no-sandbox")
browser = webdriver.Chrome(executable_path='/app/.chromedriver/bin/chromedriver', chrome_options=chrome_options)
browser.maximize_window()
return browser
async def downloader_profile(message):
browser = start_browser()
browser.get('https://bigbangram.com/content/instagram-downloader/instagram-profile-downloader/')
_login = browser.find_element(By.NAME, 'DownloaderForm[search]')
_login.send_keys(message.text)
_login.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 15)
element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'downloader-post-type')))
src = browser.page_source
browser.quit()
soup = BS(src, 'html.parser')
links = soup.find_all('a', {'class': 'cbp-caption'})
for link in links:
download_url = link.get("href")
try:
await message.answer_video(download_url)
except:
pass
await bot.send_message(message.chat.id, 'Finish.')
async def downloader_posts(message):
await bot.send_chat_action(message.chat.id, ChatActions.UPLOAD_DOCUMENT)
browser = start_browser()
browser.get('https://sssinstagram.com/')
_login = browser.find_element(By.NAME, 'id')
_login.send_keys(message.text)
_login.send_keys(Keys.ENTER)
wait = WebDriverWait(browser, 10)
element = wait.until(EC.element_to_be_clickable((By.ID,'response')))
src = browser.page_source
browser.quit()
soup = BS(src, 'html.parser')
links = soup.find_all('div', {'class': 'download-wrapper'})
for link in links:
download_url = (link.find('a', href=True)['href'])
await message.answer_video(download_url)
try:
tag = soup.find("div", class_="title")
await bot.send_message(message.chat.id, tag.text.strip())
except:
pass
def register_handlers_text(dp: Dispatcher):
dp.register_message_handler(downloader, lambda message: message.text.startswith('https://instagram.com/') or message.text.startswith('https://www.instagram.com/'))
Если запусить
downloader_posts, то все работает без ошибок.
А если
downloader_profile, то возникает ошибка
selenium.common.exceptions.TimeoutException: Message:
Это значит что нужный мне класс после нажатия enter не появился.
Почему?