• Как отредактировать сообщение с картинками в группе Telegram через api bot?

    a777mp198
    @a777mp198
    Python developer
    (Ответ сгенерирован искусственным интеллектом!)
    Для редактирования сообщения с группой медиа-объектов в Telegram бот API предоставляет метод editMessageMedia. Он позволяет заменить все медиа-объекты в сообщении на новые.

    Если вам нужно добавить дополнительные медиа-объекты к уже существующим, вы можете сделать следующее:

    1. Получите идентификатор сообщения, которое вы хотите отредактировать. Это можно сделать, например, сохраняя идентификатор в базу данных при первоначальной отправке сообщения.

    2. Отправьте новые медиа-объекты в группе sendMediaGroup с опцией disable_notification установленной в true. В ответе на этот запрос вы получите массив MediaGroup объектов, каждый из которых содержит идентификатор media_group_id, который связывает медиа-объекты в группе.

    3. Используйте метод editMessageMedia для замены всех медиа-объектов в сообщении на новые. Укажите media_group_id, который вы получили на шаге 2, в параметре media, чтобы связать новые медиа-объекты с уже существующими.

    Пример кода на PHP для добавления новых медиа-объектов к существующему сообщению с группой медиа-объектов:
    // Получить идентификатор сообщения, которое нужно отредактировать
    $message_id = 1234;
    
    // Отправить новые медиа-объекты в группе
    $response = $telegram->sendMediaGroup([
        'chat_id' => $chat_id,
        'media' => [
            [
                'type' => 'photo',
                'media' => 'http://example.com/new_photo1.jpg',
                'caption' => 'New photo caption 1',
                'disable_notification' => true,
            ],
            [
                'type' => 'photo',
                'media' => 'http://example.com/new_photo2.jpg',
                'caption' => 'New photo caption 2',
                'disable_notification' => true,
            ],
        ],
    ]);
    
    // Получить идентификатор группы медиа-объектов
    $media_group_id = $response[0]['media_group_id'];
    
    // Заменить все медиа-объекты в сообщении на новые
    $telegram->editMessageMedia([
        'chat_id' => $chat_id,
        'message_id' => $message_id,
        'media' => [
            [
                'type' => 'photo',
                'media' => 'http://example.com/existing_photo1.jpg',
                'caption' => 'Existing photo caption 1',
            ],
            [
                'type' => 'photo',
                'media' => 'http://example.com/existing_photo2.jpg',
                'caption' => 'Existing photo caption 2',
            ],
            [
                'type' => 'photo',
                'media' => 'http://example.com/new_photo1.jpg',
                'caption' => 'New photo
    Ответ написан
    Комментировать
  • Как преобразовать десериализацию при переходе к null reference types?

    NRT - это просто аннотации и ничего они не обязывают. Хотя разные библиотеки могут использовать информацию из этих аннотаций.


    как видим, после десериализации значения полей перепутались.

    А зачем специально его запутывать? Если есть конструктор, то серилизатор будет использовать информацию из него, а ты сам его решил обмануть.
    Если очень нужно так назвать - ты можешь разметить параметры при помощи атрибутов.

    Инициализировать значением по-умолчанию совершенно не обязательно, хотя сделать конструктор - это хорошая идея (System.Text.Json умеет с ними хорошо работать)
    Например ты можешь как значение по-умолчанию использовать "= null!; " - тогда предупреждения не будет.

    И я использую Newtonsoft.Json (13.0.1)

    Советую переходить на STJ


    типы без ? принимать null не могут.

    Формально могут. NRT ничего не гарантирует.



    А если серьезно, то как все же гарантировать правильную работу кода при применении похода null reference type?
    Можно ли все таки гарантировать что поле не будет равно null и при этом не пользоваться конструктором?

    1. Переходи на NRT постепенно, проверяя весь код вручную, либо какими-нибудь навороченными статическими анализаторами.
    2. Нет, без конструктора с проверками на null ты ничего не сможешь гарантировать.
    Хотя если серилизатор очень умный и через emit напрямую фигачит в приватные поля - это также не спасёт.

    Так что вот тебе дополнительная причина по скорее покрыть тестами хотябы наиболее важные сценарии в твоём приложении
    Ответ написан
    Комментировать
  • Как ограничить действия подгружаемой сборки?

    Вариант 1 (для олдов):
    Если используется .net Framework, то можно воспользоваться стандартной штукой - AppDomain.
    Просто создаёшь для этой недоверенной сборки новый AppDomain с ограниченными правами.
    Примеры тут: https://stackoverflow.com/questions/1357231/restri...
    На .NET Core, 5 и 6 такое работать не будет, тк в них нет AppDomain.

    Вариант 2 (просто не загружаем опасные штуки):
    При помощи mono cecil можно проверить, какие методы вызываются в какой-то сторонней сборке, и просто не загружать её, если она использует что-то нелегальное (ну или заменить эти вызовы на что-то своё):
    https://github.com/jbevain/cecil
    Естественно, надо ещё проверить, чтобы эта сборка и в своих зависимостях тоже ничего опасного не делала

    Вариант 3 (для зумеров):
    В .NET Core вместо AppDomain предполагается использовать AssemblyLoadContext.
    После загрузки плагина, можно посмотреть, какие ещё сборки он загрузил, и выгрузить всё, чему мы не доверяем - например System.IO.FileSystem
    (Это я ещё не проверил. Обновлю ответ когда проверю, как это работает)
    Ответ написан
    9 комментариев
  • Почему не работает приведение интерфейса в тип?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://github.com/MassTransit/MassTransit/blob/5e...

    вот это не тот Fault про который вы думаете. Где-то в недрах GreenPipes есть еще один класс Fault. Так что никакий магии не случилось -

    using MassTransit;
    using System;
    
    namespace GreenPipes.DynamicInternal.MassTransit
    {
        public class MyFault<T> : Fault<T>
        {
            public T Message => throw new NotImplementedException();
    
            public Guid FaultId => throw new NotImplementedException();
    
            public Guid? FaultedMessageId => throw new NotImplementedException();
    
            public DateTime Timestamp => throw new NotImplementedException();
    
            public ExceptionInfo[] Exceptions => throw new NotImplementedException();
    
            public HostInfo Host => throw new NotImplementedException();
    
            public string[] FaultMessageTypes => throw new NotImplementedException();
        }
    
        public class Fault: MyFault<object>
        {
    
        }
    
    
        public class Program
        {
            static void Main(string[] args)
            {
                var fault = new Fault();
    
                string typename = fault.GetType().FullName; //GreenPipes.DynamicInternal.MassTransit.Fault
    
            }
        }
    }
    Ответ написан
    Комментировать
  • Как модифицировать обновляемый клон чужого проекта?

    @res2001
    Developer, ex-admin
    Клонируйте оригинальный репозиторий. В клоне заведите собственную ветку, в нее вносите свои изменения.
    Когда авторы обновят свой репо обновляйте master клона из оригинального репозитория, затем делайте rebase своей ветки на новый мастер с разрешением конфликтов.
    Ответ написан
    5 комментариев
  • Как работает таймаут соединения при проксировании в nginx (proxy_connect_timeout)?

    Lynn
    @Lynn
    nginx, js, css
    proxy_connect_timeout работает если с той стороны кто-то слушает, но долго отвечает.
    Никаких настроек на случай когда вообще никто не слушает нет.
    Ответ написан
    1 комментарий
  • Как запустить код javascript из файла в нужный момент, если он вне функции?

    Stalker_RED
    @Stalker_RED
    Можно добавить еще один элемент script в любой момент.
    Вот набросал пример, где первая строка выводится сразу при загрузке, вторая через пару секунд секунд, а третья через 15 секунд.
    Ответ написан
    2 комментария
  • Установка операционной системы на сотовый телефон?

    Mairon
    @Mairon
    В теории:
    * иметь разблокированный загрузчик
    * иметь спецификации железа
    * иметь собранное ядро под конкретную архитектуру системы на чипе нужного телефона
    * иметь написанные модули ядра под каждую железку
    * общая прошивка радиомодулей, написанная с учётом ОС.

    Так как ничего этого никогда нет, то 5-6 лет можно убить на установку генты на пылесос :)
    Ответ написан
    Комментировать
  • Как запускать код на python из c#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Если IronPython не интересует, то потенциально есть три способа.

    1. Можно вызывать python.dll и управлять состоянием интерпретатора дёргая определённые функции. Это не самый простой способ и почти наверняка потребует собственной сборки пайтона, однако имеет некоторые преимущества. Одно из них - наивысшая скорость, так как всё происходит в одном пространстве имён. И полноценный контроль интерпретатора, только разобраться в реализации. Однако есть множество проблем, которые придётся решить: GIL, контроль состояния, входные данные и сбор результатов вычислений.

    2. Можно вызывать python.exe и передавать состояние косвенно (stdout/stdin, socket, shared memory), перебрасывая объекты через примитивы, например, этим. Однако, из сложностей, придётся написать горстку кода на python и быть готовым к ограничениям. Здесь также и упомянутые longclaps микросервисы.

    Но если IronPython вызывает интерес, то можно на .NET реализовать всё необходимое, или же использовать готовое. На самом деле, здесь даже немного приветливее смотрится тот же F#, да и вообще платформа у мелкомягких во многом поразительна.
    Ответ написан
    2 комментария
  • Как решить проблему с tcp connection established на mikrotik?

    Buchachalo
    @Buchachalo Автор вопроса
    "Проблема", если её можно так назвать, решена. Клиент pptp был камера на столбе + TL-MR3220 (с OpenWRT) + Мегафоновский свисток E3372h в HiLink.
    В один прекрасный момент камера выжрала свой лимит в 30 Гб в месяц, трафик перестал ходить, но мегафон не просто отрубает интернеты, а как я понял снижает скорость до минимальной, так что HELLO-пакеты приходят, но на большее не хватает.

    Начался новый месяц, добавили трафик на аккаунт, и все прекрасно заработало.
    Ответ написан
    Комментировать
  • Как правильно сделать обновляемый компонент vue связанный с vue-router с параметрами url?

    Fragster
    @Fragster
    помогло? отметь решением!
    В :to у router-link и в push можно передавать объект вида {name: 'имя маршрута', params: {ключ1: значение1, ключ2: значение2...}} что сильно облегчит задачу 1. При этом если указать в свойствах маршрута props: true, то все параметры маршрута будут переданы в props компонента, что решит задачу 2 и избавит от 3. Вместо изменения props делать $router.push, да. Ну, или .replace, если нужно.
    Ответ написан
    7 комментариев
  • Как сделать ширину v-select равной ширине контента во vuetify?

    MrGrump
    @MrGrump
    Вы можете для v-col задать пропc cols="auto" что скажет колонкам не занимать все свободное пространство на оси, а между колонками вставить элемент v-spacer который на оборот будет стараться занять все свободное пространство (собственно на этом его все задачи и заканчиваются). Так же могу посоветовать скрыть невидимый input у v-select при помощи стилей, он так же дет лишнюю не желательную ширину

    Ответ написан
    2 комментария
  • Когда не использовать vuex | redux | flux?

    @Vlad_Murashchenko
    Все просто.
    1) состояние относится к какому-то конкретному компоненту, который сам несёт ответственность за CRUD с данным состоянием - используй локальное состояние.
    Пример: список каких-то элементов, мы ведь не захотим отобразить или поработать с элементом из этого списка где-то в другой части приложения, это ведь бред какой-то, хотя дизайнеры могут придумать всякие. И если они придумают то прийдется подымать это состояние выше или выносить в глобальное.
    2) если же состояние используется в разных компонентах которые не имеют прямого отношения друг к другу, тогда удобнее использовать глобальное состояние чтобы удобно внедрять его в нужные компоненты и предоставлять им интерфейс для работы с ним.
    Пример: сервер предоставляет нам объект юзера в котором есть статус, имя, фотография, какие-то ещё данные. Статус отображается и редактируется в одном компоненте, имя с фотографией отображается в другом, а редактируется в какой-то вообще отдельной форме со своим состоянием. Здесь нам бы пришлось держать данное состояние где-то очень высоко и далеко от компонентов которые им управляют, глобальное состояние упрощает работу с подобными состояниями
    Ответ написан
    Комментировать
  • Когда не использовать vuex | redux | flux?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Посмотрите как работает GraphQL + Apollo client. Особо внимательно про нормализацию и кеширование на клиенте. Там уже люди очень серьезно подумали на проблемами которые вы озвучили (и другими тоже) и много чего хорошего придумали - грех не воспользоватся. Если не самими технологиями то подходами и решениями.
    Ответ написан
    Комментировать
  • Где и какие компоненты vuetify использовать и как их сочетать вместе?

    @grinat
    На нем админки делать, прототипы, в общем такие вещи где хватит функционала vuetify и не нужно ничего верстать, у них куча примеров и шаблонов. Проблема vuetify в том что там api часто перетряхивают, меняются классы и проч, т.е. строить на его базе какое-нить энтерпрайз решение - идея так себе, я делал для своего проекта на нем апликуху на webview год-два тому назад, в общем ее сейчас обновить невозможно, она привязана к определенной версии, да и тяжелый он. Когда в итоге стало ясно, что хрен обновишься, то я просто заменил все обертки v-card и т.п., на обычные div с классами, все стало работать гораздо быстрее.
    Ответ написан
    Комментировать
  • Как эффективно разрабатывать код на javascript?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Я разрабатываю тоже модульно, но пишу на чистом JS.
    Использую для рекурсивной "склейки" HTML/JS/CSS либу функцию includeHTML.
    <div data-src="js/module123.js"></div>
    Или тоже, но с помощью JS:
    includeHTML('js/module123.js');
    Ответ написан
    Комментировать
  • Как эффективно разрабатывать код на javascript?

    @afanasiyz
    Javascript-разработчик
    В консоли - никак, если не исхитряться. код, после окончания работы сборщиков, полностью инкапсулируется.
    Вы можете, на время разработки, добавлять эти методы в объект window, если очень хочется дергать эти функции вручную из консоли (потом не забудьте удалить)
    file - development_test.js
    import * as api from './api/clientApi.js';
    window.api = api;

    Этот тестовый файл просто импортите в корень проекта, получаете возможность дергать window.api[api_method] из консоли.

    Ну а вообще - юнит тесты удобнее всего писать на части системы
    Ответ написан
    Комментировать
  • Использование ScriptIgnoreAttribute в .net Standard 2.0, какая альтернатива?

    @NewDevLab
    1. return Json(data, JsonRequestBehavior.AllowGet);
    это обёртка над JavaScriptSerializer, которому можно задать кастом конверторы, и там игнорить поле.

    2. return Content(Newtonsoft.Json.JsonConvert.SerializeObject(model));
    должно также работать, если тип возвращаемого контента задать на json.
    по F12 посмотреть, что приходит на клиент.
    Ответ написан
    2 комментария
  • Как настроить MassTransit + RabbitMQ, чтобы несколько потоков потребления получали все копии опубликованных сообщений?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Перестаньте настраивать архитектуру кроля в коде. Это к хорошему не приведет. Зайдите к ним на сайт - там отличные туториалы. А вообще - вам нужен exchange к котором присоединено несколько очередей
    Ответ написан
  • Как узнать, что письмо открывали?

    CityCat4
    @CityCat4 Куратор тега Электронная почта
    //COPY01 EXEC PGM=IEBGENER
    1. Можно. Но никакой гарантии что сработает.
    2. Можно. Но никакой гарантии что сработает.

    Теперь о реализации.

    Есть стандартные методы - установить отметку "Оповещение о доставке", "Оповещение о прочтении". Есть нестандартные - например, картинка в подписи, подгружаемая с сайта. Необязательно это должен быть пиксель - можно вставить совершенно легитимную подпись с логотипом.

    Но!

    Реакцию на оповещения можно отключить - TB например это сделать позволяет, Outlook нет. И если юзеру задают вопрос "отправить оповещение о прочтении" вовсе не факт, что он согласится его отправить.
    Отображение картинок в письме можно запретить - и в TB по умолчанию оно запрещено. Кроме этого письмо может вообще конвертироваться в plain text.

    В итоге ответ будет выглядеть так - можно, но какая-то гарантия того что это сработает есть только при отправке на сервера типа mail.ru, где у юзера ограниченные возможности по обработке письма. На корпоративной почте с ней (почтой) могут делать все что угодно и там гарантия стремится к нулю.
    Ответ написан
    Комментировать