• Как получить сообщение канала telegram в переменную (парсер)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если канал свой (или есть связи с владельцами), то можно подписать на него своего бота и ловить события. Использовать обычные библиотеки для Bot API (telebot, aiogram итд).

    Если канал чужой, то бота подписать не получится, необходимо использовать клиентский API, изображающий обычного пользователя (библиотеки telethon, pyrogram).
    Ответ написан
  • Как из string сделать list Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Даже если обернуть last_name в кавычки, это не будет валидный json, потому что в json кавычки должны быть двойные. Самый простой способ это решить - использовать ast.literal_eval - так как указанный код является валидным кодом на python:

    import ast
    s = "[{'name': 'Рулон', 'last_name': 'Обоев'}, {'name': 'Лежана', 'last_name': 'Раздвиногова'}]"
    print (repr(ast.literal_eval(s)))


    Почему не просто eval? Потому что это более безопасно. Если в качестве "данных" нам прилетит

    os.system("rm -rf /some/file")

    то eval выполнит этот код и удалит файл как ни в чём не бывало, а ast.literal_eval кинет исключение.
    Ответ написан
    Комментировать
  • Как починить код запуска программы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Судя по всему, речь идёт о боте для Discord? Этот код не будет работать. И довольно очевидно, что с твоим текущим уровнем знаний Python шансов заставить это работать нет.
    Ответ написан
    Комментировать
  • BadRequest: Unsupported parse_mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Скорее всего, в недрах create_bot (который не приведён в вопросе) используется parse_mode с неверным значением.
    Ответ написан
    Комментировать
  • Можно ли добавить два одинаковых бота в один аккаунт в телеграмме?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, нельзя.
    Ответ написан
    Комментировать
  • Как обратиться к бд если она занята другой программой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как вариант, создаётся lock file рядом с базой, и все процессы, которые с ней работают, ставят эксклюзивную блокировку перед любой операцией с базой, а после её выполнения её снимают. Но всё же рекомендую перейти на самостоятельную СУБД.
    Ответ написан
    Комментировать
  • Маршрутизация 2 eth с перенаправлением?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сервер не отправляет "с основного eth1". Интерфейс для отправки выбирается в процессе маршрутизации, а не до неё.

    ip route add 79.79.79.9 via шлюз_в_сети_где_адрес_78.78.78.3


    Это изменит в рантайме, после перезагрузки / переподключения к сети маршрут слетит и его надо будет прописывать заново. Чтобы поднимался автоматически, надо смотреть, какой механизм управления сетью используется (ifupdown/netplan/network-manager/network-scripts/dhcp client/итд/итп), и решать в зависимости от.
    Ответ написан
    Комментировать
  • Как получить фото с помощью телеграм бот api?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Они там поленились документацию написать. Но нетрудно понять, что следует использовать метод downloadFile https://github.com/TelegramBot/Api/blob/master/src...
    Ответ написан
    Комментировать
  • В чём ошибка определения переменной экземпляра?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Рекомендую напечатать id объектов, сразу станет видно проблему:

    for i in range(11):
      print (f"`{i} {id(g[i])}")
      for j in range(7):
        print (f"  `{j} {id(g[i][j])}")
        #deb.write(str(i)+"-"+str(j)+" "+str(g[i][j].x)+" "+str(g[i][j].y)+"\r\n")


    кусочек вывода
    `0 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112
    `1 140084785493632
      `0 140084785519824
      `1 140084785520544
      `2 140084785519872
      `3 140084785520016
      `4 140084785520448
      `5 140084785520592
      `6 140084785520112


    Все элементы списка длины 11 по первому индексу ссылаются на один и тот же массив длины 7

    Ошибка тут в том, что выражение

    some_list * 11

    конструирует список из 11 ссылок на один и тот же массив. Который на последней итерации цикла получает x=10 во всех элементах.

    Решить можно, например, так:

    g = []
    
    for i in range(11):
      g.append([])
      for j in range(7):
        g[i].append(Point(i, j))


    В python все объекты передаются по ссылке, и это надо учитывать, а при необходимости копировать их явно.
    Ответ написан
    Комментировать
  • Как мне сделать такую статистику на discord.py?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Видно же, что это голосовые каналы.

    Нужно создать два голосовых канала с закрытым для всех доступом, в имени которых указать число пользователей. Также в боте отслеживать приходящих-уходящих и переименовывать эти каналы. Предвосхищая вопросы, напомню, что за готовыми решениями добро пожаловать на фриланс.
    Ответ написан
  • Отправка файла через телеграм бота с помощью libcurl с определенным параметром?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если по ссылке, то надо передать ссылку в URL: ...&document=ссылка

    Если файл лежит локально, то передать файл в multipart/form-data, как-то примерно так: https://curl.se/libcurl/c/postit2.html
    Ответ написан
    Комментировать
  • Есть ли в Telegram возможность отправлять сообщение через вебхук, или что-то подобное?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    API Телеграма сам по себе решает эту задачу, например, отправка текстового сообщения выглядит так:

    https://api.telegram.org/botТОКЕН/sendMessage?chat_id=-12345&text=Сообщение


    Отправка фото через /sendPhoto, отправка видео с помощью /sendVideo, итд.
    Ответ написан
    Комментировать
  • Исключение вызывается даже при его обработке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Что при обработке исключения может случиться другое исключение это как раз нормально. Ненормально, что всё это маскируется отлавливанием корневного класса Exception.

    Плохая практика ловить любой Exception и даже не выводить его содержание с помощью хотя бы обычного print. Например, в недрах вызываемого кода ошибка из-за исчерпания места на диске, в обработчике вызываешь опять этот код и в недрах случается то же самое. Там вообще может случиться что угодно. Закончиться память в абсолютно любой строчке, например.

    Также плохая практика генерировать абстрактный Exception на конкретную ошибку. Это может быть пригодно для набросанного для разового запуска скрипта, но в целом плохо, тем более это не сложно решается:

    class NoTrainDataLoaded(Exception):
        pass
    
    ...
    raise NoTrainDataLoaded("Call your_model_object.load_train_data first!")
    
    ...
    try:
        ...
    except NoTrainDataLoaded:
        logger.info("Train data not loaded yet, load default data...")
        my_model.load_train_data("mimimi-cats-and-dogs")
        continue


    Если вдруг случится исключение, которое не упомянуто в except, то скрипт упадёт, и это хорошо. Пусть он не пытается делать какую попало реакцию на неясно какую ошибку.
    Ответ написан
    Комментировать
  • Проблемы с запуском бота телеграм на Python, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Здесь много неправильно, и не странно, что это не работает.

    На первом уровне вложенности основной код, который должен делать 3 вещи:

    1. Импортировать модули.

    2. Создавать объект класса TeleBot.

    3. Вызывать от него polling.

    Что делает polling? Это цикл, который дёргает у Bot API метод getUpdates и получает время от времени новые обновления от Telegram. Для каждого он вызывает обработчики (handler). По умолчанию нет ни одного handler, и простейший бот без них не делает ничего - только скачивает и сразу выбрасывает получаемые сообщения.

    Далее надо сделать обработчики. Они представляют из себя обычные функции. Например, обработчик сообщения принимает объект класса Message, в котором все данные по сообщению: отправитель, текст, время отправки, id чата итд.

    Чтобы бот знал, что вот эта конкретная функция является обработчиком такого-то события с такими-то условиями, надо использовать декораторы. Например:

    @bot.message_handler(commands=['start','menu'])
    def start_message(message):
      # в этом обработчике мы можем обработать команду /start или /menu,
      # при этом можно брать из message данные о сообщении:
      # message.text - текст
      # message.from_user - объект класса User с данными отправителя
      # message.chat - объект класса Chat с данными о чате (группа или приват)
      ... тут нужные действия ...


    Использовать декоратор без @ и последующего описания функции бессмысленно - он просто ничего не будет делать (потому что декоратор - это специально устроенный класс, вызов bot.message_handler создаёт экземпляр этого класса, от которого потом вызывается специальный метод, а тут этого не происходит).

    Вызывать на первом уровне вложенности bot.send_message таки возможно, но... но тут в него передаётся, например, message.chat.id - а что такое message? Этой переменной в скрипте нет. И откуда бы она взялась, если сообщение получается внутри вызова bot.polling и должно передаваться обработчику, который нужно было бы оформить как функцию с декоратором? В коде нет ни одного такого. Да и переменная message будет актуальна только внутри этого обработчика, снаружи функции она не будет доступна.

    В общем, это никак не может работать.

    Плохая идея начинать изучения языка с ботов, области, в которой уже нужно обладать определённым уровнем познаний. Начинать имеет смысл с азов. Делать сначала простейшие задания (вида "попросить пользователя ввести два числа и вывести их сумму"), освоить циклы и функции, работу с файлами и строками, ну и всё такое. Затем, вернувшись к теме ботов, уже будешь делать всё не вслепую, а хоть как-то понимая происходящее.

    Представь себе, что ты бы купил автомобиль, и не смог бы понять, как его завести. Начал бы тыкать куда попало. Например, нашёл нипель на колесе - подёргал. Дворник крутится, если приложить усилия (ой, сломал, теперь не будет ездить?). Сзади труба торчил - к ней надо водопроводный шланг подвести? Вот примерно так сейчас ты делаешь бота. Даже если тебе подскажут, что изменить, ты всё равно не научишься программировать и не будешь понимать, что сделал.
    Ответ написан
    Комментировать
  • Как прокинуть порт на mikrotik только в случаи когда в запросе есть соответствующая строка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет работать, так как URI передаётся только после установки соединения, на момент установки соединения ещё нельзя идентифицировать, куда перенаправить трафик. Для решения этой задачи надо использовать reverse proxy, в качестве которого популярно использовать nginx. Но так как тут не нужно раскидывать по нескольким разным серверам, то проще просто в целевом web-сервере отвергать запросы, не подходящие под условие. Если это почему-то невозможно (например, сервер является чужим приложением, в котором нельзя ничего изменить), то можно поставить nginx в разрез.
    Ответ написан
    Комментировать
  • Как установить аватар?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Там же есть документация и даже с примером. Он, конечно, на js, но из него и так всё ясно: надо передать параметр avatar со ссылкой на аватарку,

    Установить никак. Боты не могут менять аватарки пользователей.
    Ответ написан
    Комментировать
  • Discord Бот выдающий роль по необходимому сообщению?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    add_roles - метод класса discord.Member, а не discord.Client. Соответственно, его надо вызывать от правильного объекта. В данном случае самый простой способ получить инстанс Member отправителя данного сообщения - это обратиться к message.author:

    await message.author.add_roles(role)

    При этом role тут должно быть не id роли, а объект discord.Role. Который можно получить методом get_role класса discord.Guild. А его для Member можно получить из поля guild.

    Итого получается, что нам надо:

    author = message.author
    guild = author.guild
    role = guild.get_role(898612321755230260)
    await author.add_roles(role)


    Или если собрать в одну строчку:

    await message.author.add_roles(message.author.guild.get_role(898612321755230260))
    Ответ написан
    Комментировать
  • Где взять api для приложения музыки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    https://www.jamendo.com/
    https://developer.jamendo.com/v3.0
    Довольно много музыки (в том числе очень неплохой) на либеральных лицензиях. Но исполнители преимущественно малоизвестные.
    Ответ написан
    Комментировать
  • Как вызвать функцию через inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, inline mode для этого не предназначен.

    Inline mode - это средство помощи пользователю в наборе сообщения. В бота прилетает запрос, который он анализирует и выдаёт список вариантов. Этот список потом кэшируетя и может какое-то время не вызывать при таких же параметрах со стороны пользователя реального запроса к боту. Изменять уже отправленные ответы для inline mode бот не может. Узнать, отправил ли пользователь в итоге сообщения и в какой чат он тоже не имеет возможности.
    Ответ написан
    Комментировать