Spotegg, большинство провайдеров таких вот voice+sms широко используются как одноразовые номера или просто номера короткого срока жизни, поэтому на них аккаунт WA мог меняться настолько много раз, что чисто по статистике WA вся номерная ёмкость уже считается "токсичной". Поэтому-то сейчас такая огромная проблема зарегать WA на левый номер.
Но некоторая альтернатива есть, правда, не дешёвая и не для всех. В WhatsApp Business API можно зарегистрировать номер не через SMS, а с голосовым подтверждением кода. Так что можно будет использовать более традиционную телефонию без SMS, а сам номер приземлить в какой-нить jivosite либо любой другой сервис, в котором есть поддержка бизнес-WA. Но придётся проходить верификацию бизнеса у фейсбука и платить за использование. Плюс звоник в самом WA на такой номер невозможны.
Всё вышесказанное, я считаю, должно намекнуть, что проще просто купить симку в нужной стране и найти способы разместить её там и конвернтнуть в SIP. Можно, конечно, просто привезти симку оттуда к себе домой, но международный роуминг...
EnotShow, можно держать кэш заблокированных в памяти и обновлять его каждые ндцать минут запросом. Всё это скрыть в функцию или декоратор, чтобы не болела голова в каждом обработчике.
dimon_9519, в интернетах полно информации. Можно использовать сайт из соседнего ответа, но осторожно, потому что он означает, что отдаёшь соответствующему приложению свой токен и доступ к своей странице.
Нет, нельзя. Бот в любом случае получит сообщение, но может его проигнорировать.
Копировать одинаковую проверку на ндцать строчек, конечно, не надо. Можно, например, сделать функцию проверки и её везде проверять в начале каждого обработчика. Ещё более красиво - свой декоратор.
executor.start_polling предназначен для запуска из синхронного кода, даже await не требует. Он пытается создать event loop, а тот уже создан. И даже если бы это прокатило, в этом месте бот бы заснул.
Hamachi создаёт виртуальный интерфейс в системе со своим отдельным IP-адресом. Вот по этим адресам участники этой маленькой сетки могут друг к другу обращаться.
wirflve, я бы попробовал "path/to/dir/name" для name.session. Но вообще наверняка в документации всё написано на тему того, как правильно делать. Чего бы туда не посмотреть?
curs3dcult, я бы рекомендовал не использовать отдельные модули. Во всех форках discord.py slash-команды поддерживаются нативно. Например, я когда-то пробовал освоить discord_slash, но напоролся на то, что он не работал с discord.py 2.0 с компонентами, вызывая невнятные ошибки где-то в недрах.
Вот так вот можно сделать в disnake (один из форков discord.py), в этом случае бот при старте будет писать в консоль детали о синхронизации команд, а на тестовых гильдиях вообще прописывать их явным образом, что намного быстрее:
Допустим, пользователь хочет получить счёт, в котором написан товар, его цена и количество. В боте можно выбрать товар (каким угодно образом, сейчас это не очень важно), затем бот генерирует документ путём заполнения полей в шаблоне. Так? Тогда делим задачи на подзадачи и решаем: как и в каком порядке спрашивать у пользователя данные, какой формат использовать для документов, в каком виде шаблон итд итп.
wirflve, если передать в telethon "foobar", то он создаст сессию в файле "foobar.session". Реально это будет база данных формата sqlite. Соответственно, если ему подсунуть готовый файл, то он его использует.
Смотря что в этой HashMap. Если chat_id->state (то есть для каждого пользователя хранится текущее состояние и только), то достаточно одной таблицы.
Если же это именно стек (то есть пополняемый список состояний с возможностью возврата наверх), то так просто уже не получится. Например, так: сделать отдельную таблицу chat_id-state-seq, где seq - уникальное в пределах чата число, монотонно возрастающее в пределах chat_id (можно даже просто auto increment поле по всей таблице, ведь конкретные значения неважны, важно, что значение растёт). Тогда добавление в стек - добавление строки в таблицу, возврат наверх по стеку - удаление последней добавленной для chat_id строки. Можно по-прежнему хранить в тех же объектах, только загружать при старте бота данные, а также сопровождать добавление/удаление состояний в стеке операцией записью в базу, чтобы восстановиться в случае чего.
Лучше, конено, сделать это классом с соответствующим интерфейсом, который скроет детали реализации.
Нужно понимать, что у pyrogram основная идея в том, чтобы писать ботов в едином стиле как для Bot API, так и MTProto API. Полностью функциональность Телеграма он может и не покрывать.
Роман Анищенко, если нужно не дословное совпадение строки, то это к вопросу регулярных выражений. Их grep по умолчанию поддерживает довольно ограниченно. Чтобы было прям по-perl-овски - grep надо запускать с ключом -P.
Владислав Самойлов, вообще, автор скорее имел в виду другое, он не хочет скачанный файл сохранять на диск (ума не приложу почему, но тут часто такое спрашивают). Это тоже можно, надо содержимое файла загнать в переменную, а потом передать вместо файла BytesIO(содержимое_файла).