Ответы пользователя по тегу Telegram
  • Telegram автоматическое открытие ссылок Privnote?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Готового решения я не знаю, но вполне можно написать такую тулзу с использованием клиентского апи телеграмма. Она будет от вашего имени коннектиться в телегу и ждать сообщения в чате, как только оно придёт, открывать ссылку и... ну там как запрограммируете.
    Ответ написан
    Комментировать
  • Что не так, библиотека telebot?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Потому, что переменной message у вас в коде нет, а обращение к ней есть. В сообщении об ошик едаже процитирована строчка, где это происходит, прочитайте внимательно.
    Ответ написан
    2 комментария
  • Как вступать в чаты telegram по всем видам ссылок?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Бот сам не может вступать в чаты, его должны добавлять люди.
    Иначе телеграмм бы давно утонул в спаме
    Ответ написан
  • Есть ли такой бот?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нет такого бота, и на тех возможностях, которые предоставляет API такого нельзя реализовать.
    Ответ написан
  • Как задеплоить телеграм бота на VPS?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    На винде запускать - это бред.
    Если на VPS планируете держать только бота, то лучше оформить его в виде пакета. Настройте CI\CD и он сам будет развёртываться на вашем сервере прикаждом релизе в системе контроля версий.
    Лично я разворачиваю бота в докере, потому что боту обычно нужна БД, какие-то приложения рядом... Всё установть и настроить - это отдельная история и спустя пару лет бесперебойной работы вам или вашему заказчику, возможно, придётся переехать на другой хостинг или переустановить и настроить все заново, а из памяти всё уже выветрилось. Спасает описание всей конфигурации в виде docker-compose.
    Тогда переезд на ноый сервер вообще тривиален. Также легко поднять тестовый клон бота на локальной машине для отладки и работать он будет в той же среде и с той же конфигурацией, что и на сервере.
    Особенно это удобно, если приходится приментяь какие-то конвертеры графики или звука.

    Если надо поднять дв абота на разных фреймворках или с разными зависимостями, то докеризация тоже спасает от необходимости возиться с venv. А зависимости бывают еще и у сторонних внешних утлит.
    Ответ написан
    Комментировать
  • Как сделать Telegram бота для поиска сообщений в канале?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А в чем конкретно проблема?
    Бот индексирует сообщения и держит индекс в памяти. По запросу пользователей ищет сообщения в индексе, вынимает из него идентификатор сообщения и цитирует запросившему нужное сообщение из канала.
    Ответ написан
    Комментировать
  • Как к телеграм боту прикрутить веб админку?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем проблема? Пусть от хранит состояние в БД и в ту же БД ходит админка за инфой.
    Что именно вам не понятно и что не получается?
    Ответ написан
    Комментировать
  • Как хранить схемы диалогов для чат-бота?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нормально ORM работает с JSON, но не понятно зачем вам именно реляционная БД, если вы фактически отказались от нормализации и джойнов.
    Для вашего этого варианта подойдёт и NoSQL.
    таких ботов/диалогов может быть много.

    Много - это понятие растяжимое. Вы уже столкнулись с каким-то бутылочным горлышком и хотите уже что-то оптимизировать? Если нет, то делайте как проще и понятнее в рамках функциональных требовний.

    Отрефакторить преждевременно оптимизированное решение будет гораздо сложнее, чем простое.
    Практика показывает, что в ходе реализации MVP часто вылезают новые требования, которые заставят вас усложнять модель. Простое мнималистичное решение позволит более гибко добавлять функциональность и не потерять бестолку время на написание сложного кода. который всё ранво переписывать.

    В вашем случае можно сделать всё на ORM и реляционной базе. Включая отдельные модели для вариантов ответов и прочего.
    Можно отказаться от ORM и размещать одного бота в одном документе. Тогда можно использовать монгу и десериализацию документа в собственную структуру классов. Тут писать получится больше, но и гибкость будет выше, можно будет пользовтаельские плагины какие-то прикручивать... вопрос - надо ли это и понадобится ли в будущем?

    Фактически диалог - это конечный автомат. Его можно представить в виде графа. Человечество уже давно придумало много способов сохранять и оперировать графом в любой БД, в том числе реляционной.
    Ответ написан
    2 комментария
  • Выскакивает такая ошибка IndentationError: unindent does not match any outer indentation level, решить в моём коде и в чом вообще проблема?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас там то табуляции в отступах то пробелы. Для питона это критично. Читайте в любой книге для чайников. Тем более ответ на ваш вопрос можно нагуглить с первой попытки на любом утюге.
    Формтируйте код, перед публикацией соответствующими тегами. При этом у вас бы сразу отпали все вопросы.
    Ответ написан
    Комментировать
  • Как исправить кодировку на кирилице в телеграм-боте на Google Cloud?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Проблема в кривой работе с кодировкой в исходниках бота.
    Всё из-за программирования методом тыка. Не разобрались, сделали лишь бы работало на домашнем компе, а дома, наверно винда, где в терминале 866 в файловой системе где-то 1251 где-то utf-32. Когда не вполне понимаешь что делаешь, то делаешь как-то копипастой не весть как и оно работает... до поры до времени, пока локаль не поменяется, или умолчания, или файловая система с другой кодировкой не подвернётся, либо в терминале локаль будет указана другая. И ВСЁ ПРОПАЛО! ПАМАГИТИ! Вот вам кофейная гуща, гадайте что я там накалякал в исходниках и где через одно место кодировку преобразую.

    Судя по крякозябликам ваш "опытный" программст где-то захардкодил неправильное преобразование utf-8 в виндовую 1251. Вот можно по определителю понять:
    https://habr.com/ru/post/147843/

    Проблема явно в говнокоде.
    Ответ написан
    4 комментария
  • С чем связанна проблема кодировки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ответ.
    Это может быть связано с неправильной работой с кодировками.
    А именно перекодирование происходит:
    - не в ту кодировку
    - не из той кодировки.
    Обычно неопытные программисты не хотят разбираться с тем как правильно работать с кодировками и что такое юникод, а все проблемы решают методом тыка меняя код пока проблема не исчезнет. Из-за этого у них часто присходят преобразования по умолчанию, которые ломаются при смене операционной системы, при запуске другим спообом (из терминала, от имени другого пользователя, через крон...), при смене умолчаний (локали, настроек терминала, настроек БД).
    А ещё такие неопытные программисты до жути боятся сообщений об ошибках, но решать настоящие пролемы не хотят и гасят их в бесшумном режиме, отчего реальные проблемы маскируются под глобальныйми молчаливыми пустыми обработчиками ошибок. Это приводит к усложнению внутреннего поведения программы и вот таки вот случаям, как у вас.
    Когда у таких программистов возникают проблемы (а за ними дело не встанет), то эти программисты не описывают проблему детально, не показывают исходный код, не обрисовывают архитектуру своей системы, а просто спрашивают в чем может быть проблема.
    Исчерпывающий ответ на такой вопрос дать несложно. Вот он.
    Ответ написан
    Комментировать
  • Как реализовать "таймер неактивности функции" после использования функции?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Из вашего вопроса не ясно многопользовательский у вас планируется бот или однопользовательский. То есть будут ли одним инстансом бота пользоваться больше одного человека?
    Также не понятно в случае нескольких пользователей, у каждого своё ограничение раз в час, или на всех одно сообщение в час.
    В любом случае ваш бот должен хранить некоторую информацию - это называется хранить состояние.
    Вам нужно звранить дату последнего сообщения для каждого пользователя или для всех, в зависимости от постановки задачи. В общем случае для этого лучше всего использовать какую-то БД вроде монги или sqlite. В случае SQLite ничего ставить не нужно, всё. что требуется, уже есть в комплекте с питоном.
    Я бы рекомендовал сделать при запуске создать в ней, если еще не создана, таблицу с идентификатором пользователя и датой последнего сообщения. В последствии можно будет реализовать оба варианта функциональности.

    В итоге дату последнего сообщения достаете из таблицы, прибавляете к ней час, если получилось более позднее время, чем текущее, значит постить нельзя. В случае поста просто обновляем время в БД.
    Ответ написан
  • Некорректный перенос строк сообщения, в чём дело?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите в 'time1.txt' после последней строки нет абзаца, а во всех остальных, скорее всего есть.
    Или в каких-то еще тоже нет и прблема плавающая, зависит от того последнюю строку выбрал рандом или нет и есть в этой строке абзац или нет.
    Обрабатывайте загруженные строки filter(None, map(str.rstrip, <lines_iter>))
    Ответ написан
    Комментировать
  • Как искать несколько слов в предложении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Похоже ботов кинулись писать даже те, кто вообще программировать не умеет. Надеюсь эта волна не докатится до медицины.

    Напишите свою функцию, куда передайте текст и набор слов, а внутри по циклу ищите каждое пока не найдёте первое попавшееся.
    Ответ написан
    Комментировать
  • При попытке проверки переменной выдаёт ошибку, что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам же белым по черному в тексте ошибки написано, что переменная country используется до объявления. То есть в программе вы еще ни разу в нее ничего не присвоили, а уже пытаетесь проверять ее значение. КОнечно тут ошибка.
    Там даже показано в какой именно строке. Что делать? Исправлять.
    Ответ написан
    Комментировать
  • Как исправить проблему с кодировкой (UnicodeEncodeError: 'latin-1' codec can't encode characters..) в тг боте?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    qr = pyqrcode.create(x.encode('utf-8'))
    И приводите в следующий раз, пожалуйста, полный текст ошибки. Там еже всё указано где проблема. Какого черта вы заставляете гадать на кофейной гуще?
    Думаете интерпретатор вам этот весь "мусор" просто так написал?
    Так и задали бы вопрос: написал программу - не работает, памагити!
    Ответ написан
    Комментировать
  • Как в Python вычислить ближайшие точки по имеющимся GPS-координатам?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    ищет ближайшие рестораны, координаты которых есть у меня в словаре

    Если ваш бот планирует расти и поддерживать много всяких POI, в том числе помимо ресторанов, то имеет смысл вынести всё это в БД.
    Удобно использовать postgres с расширением postgis. В составе этого расширения есть оптимизированные функции поиска ближайших точек, кроме того в БД удобно хранить сами POI, их можно импортировать из OSM.

    Кроме этого не во всех подобных задачах правильно использовать геометрические метрики для нахождения ближайших точек.
    Какая-то точка может быть ближе к заданной геометрически, но она может оказаться на другой стороне реки, а крюк через мост до нее будет очень большим.
    Для этого вам лучше использовать какое-нибудь решение, учитывающее роутинг. Например OSRM. Такие сервисы зачастую умеют строить матрицы расстояний между точками. OSRM, кстати, отлично развёртывается в докере, на основе данных OSM он может строить как пешие маршруты (если, конечно, ваш регион покрыт пешими тропами в OSM), так и в других модальностях.
    Полезным артефактом от OSRM будет также геометрия маршрута и путевые точки по ходу его следования. Также OSRM в своём API имеет быстрый метод динамической привязки координат к графу дорог. Может пригодиться, скажем, для отслеживания курьера и предупреждения о его прибытии.
    Ответ написан
    Комментировать
  • Косячок с QR кодом, сделанным в Python при отправке в Telegram. Как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    JPEG не нужен.
    Отмасштабируйте png с помощью PIL (Pillow)
    Ответ написан
  • Не работает telegram бот на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Для себя я решил эту проблему забавным и простым образом.
    У меня есть VDS для хостинга сайта. С неё телеграм доступен и не блокируется. Я превратил этот сервер в собственный прокси для апи телеграма простым конфигом для nginx:
    server {
        listen tg.my_own_domain.net:8079;
        server_name tg.my_own_domain.net;
        access_log /var/log/nginx/tg.my_own_domain.net-access.log;
        error_log /var/log/nginx/tg.my_own_domain.net-error.log;
        location / {
    	proxy_set_header X-Forwarded-Host $host;
    	proxy_set_header X-Forwarded-Server $host;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_pass https://api.telegram.org/;
    	client_max_body_size 100M;
        }
    }

    Очевидно, что моё решение именно вам скорее всего не подойдёт, но кому-то может оказаться полезным, ведь для его реализации достаточно иметь лишь свою VDS вне зоны блокировки, свой домен (хотя не обязательно) и больше ничего. Nginx у вас там уже скорее всего стоит, но и поставить его не долго.

    Для желающих более правильно решить этот вопрос могу посоветовать найти на docker hub готовый образ с телеграммовским прокси или вообще универсальным прокси.

    Лично вам, скорее всего, придётся пользоваться какими-то публичными готовыми прокси-серверами, а в конфигурации бота указывать их или список их для подключения.
    Этот вариант я сейчас искать и пробовать для вас времени, к сожалению не имею. Надеюсь кто-то подхватит и добавит свой ответ.

    Кстати, чтобы вообще ничего не менять в коде бота и его конфигурации, можно на машине, где будет работать бот прописать в hosts ip зеркала телеграммовского API на домен api.telegram.org.

    Чужим непроверенным зеркалам API я бы не особо доверял, кстати.
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот на telethon приветствовал в личку заходящих на канал?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вроде бы в телеграме боты не могут писать людям по собственной инициативе. Нужно, чтобы человек сам затеял разговор с ботом. Иначе можно погрязнуть в спаме.
    Ответ написан
    Комментировать