Задать вопрос
  • Как обратиться к бд если она занята другой программой?

    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 бот не может. Узнать, отправил ли пользователь в итоге сообщения и в какой чат он тоже не имеет возможности.
    Ответ написан
    Комментировать
  • Как вивести елемент из словаря которкый находится в другом файле?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка же всё объясняет: на момент окончания f-строки открытая внутри фигурная скобка не имеет парной закрытой. Всё потому, что в выражениях внутри f-строк надо использовать другие виды кавычек:

    f"{some_dict['some_key']}"

    или

    f'{some_dict["some_key"]}'

    или можно так:

    f"""{some_dict["some_key"]}"""
    Ответ написан
    1 комментарий
  • -1 / unknown wget неизвестная ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это bar function пишет. Самый простой способ - заменить её на фейковую, которая ничего не делает и не возвращает (кажется, в библиотеке нет собственной заглушки для этого):

    wget.download(url, bar=lambda x,y,z:None)

    Но в целом нет смысла использовать старую библиотеку из 2015 года, лучше освоить что-то более современное, например, requests.
    Ответ написан
    Комментировать
  • Есть ли сервис предостовляющий крипто дебетовую карту без верификации личности?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Банковскую карту может выпустить только банк с аккредитацией PCI DSS. Очевидно, что криптовалютные сервисы не могут такого предоставить. Также, платёжные операции в карточных системах выполняются в конкретных валютах (рубли/евро/доллары/тенге/лиры/юани/итд), поэтому банк, который бы согласился рисковать играми в криптовалюту, фактически бы всё равно имел бы для клиента настоящий денежный счёт и конвертировал бы в него криптовалюту по своему собственному курсу (скорее всего, с явной невыгодой для клиента для покрытия рисков и неудобств от волатильности криптовалют).
    Ответ написан
  • Как боту изменить сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    message в этой функции - это сообщение пользователя, который написал /start. Дальше бот пытается редактировать это сообщение... и не получается! Конечно, ведь он может редактировать только свои сообщения, а чужие не может.

    Он должен просто редактировать своё сообщение, а не сообщение пользователя:

    my_new_message = await bot.send_message(message.chat.id, 'Ждем: 2сек')
    await sleep(1)
    await bot.edit_message_text(chat_id=message.chat.id, message_id=my_new_message.message_id, text='Ждем: 1сек')
    ...
    Ответ написан
    Комментировать
  • Ошибка пайтон библа дискорд пай что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Рекоммендую отказаться от discord_slash и перейти на потомков discord.py 2.0 (который так и остался в alpha и в pypi не опубликован) в виде форков discord.py, в которых slash commands работают из коробки. Мои эксперименты показали, что discord_slash ломает часть функциональности discord.py, и разбираться, что там пошло не так, я посчитал малоосмысленным. Я протестировал pycord, nextcord и disnake и остановился на последнем как наиболее развитом (по состоянию на декабрь было именно так), но свой выбор не навязываю.

    Нужно будет всего лишь заменить декоратор @bot.command на @bot.slash_command, очень удобно и никакого мазохизма.
    Ответ написан
    Комментировать
  • Как определить язык написанного сообщения на discord.js?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если надо определять язык текста, то смотреть в сторону language identification, например, есть библиотека fasttext, и вот есть первый попавшийся пример реализации на js https://github.com/rse/fasttext-lid (но в гугле я видел и другие, не знаю, какая будет лучше).

    Если надо определять язык конкретных слов, то может быть интересно использовать стеммеры под нужные языки и затем проверять наличие слова в словаре для этого языка. Либо перебирать весь словарь с учётом расстояния Левенштейна либо другой текстовой метрики.

    В общем, это не самая тривиальная задача.
    Ответ написан
    3 комментария