Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (7)

Лучшие ответы пользователя

Все ответы (13)
  • Как реализовать ленивую загрузку TFJS и Face Landmarks Detection?

    @GrigoryMorozov
    Ваша конкретная ошибка состоит в том, что вы не подключаете все необходимые зависимости или загружаете их в неправильном порядке.

    Более вероятно второе: не забывайте, что динамически добавляемые скрипты по-умолчанию являются асинхронными (то есть первым выполнится тот скрипт, который загрузится раньше других). В данном случае это некорректное поведение, которое нужно исправить:

    script.async = false;

    Также разумно использовать промисы вместо коллбэков, чтобы не росла вложенность кода. Полный пример:

    // Functions
    
    const loadedScripts = new Set();
    
    async function loadScript(url) {
      if (loadedScripts.has(url)) return;
      
      const script = document.createElement('script');
    
      script.src = url;
      script.async = false;
    
      document.head.append(script);
    
      return new Promise((resolve, reject) => {
        script.addEventListener('load', () => {
          loadedScripts.add(url); resolve();
        });
      
        script.addEventListener('error', () => reject(
          new Error(`Error loading script: ${url}`)
        ));
      });
    }
    
    async function loadImage(url) {
      const image = new Image();
    
      image.src = url;
      image.crossOrigin = 'anonymous';
    
      return new Promise((resolve, reject) => {
        image.addEventListener('load', () => {
          resolve(image);
        });
      
        image.addEventListener('error', () => reject(
          new Error(`Error loading image: ${url}`)
        ));
      });
    }
    
    // Example
    
    const image = loadImage('https://habrastorage.org/r/w1560/getpro/habr/upload_files/799/62f/375/79962f375d90db7f7d926ff40d623456.png');
    
    await Promise.all([
      loadScript('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-core'),
      loadScript('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-converter'),
      loadScript('https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgl'),
      loadScript('https://cdn.jsdelivr.net/npm/@tensorflow-models/face-landmarks-detection@1.0.6/dist/face-landmarks-detection.min.js')
    ]);
    
    const model = faceLandmarksDetection.SupportedModels.MediaPipeFaceMesh;
    
    const detectorConfig = {
      runtime: 'tfjs', 
      solutionPath: 'https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh'
    };
    
    const detector = await faceLandmarksDetection.createDetector(model, detectorConfig);
    const faces = await detector.estimateFaces(await image);
    
    console.log(faces);
    Ответ написан
    1 комментарий
  • Снипет в для telegram minapp - как?

    @GrigoryMorozov
    Судя по URL из примера, вы не разделяете два разных варианта запуска мини-приложения:
    1. Direct Link Mini App. Пример — на первом скриншоте. Для настройки используйте команду /newapp. В процессе нужно будет указать URL, который в данном конкретном примере равен app (важно: это не какого-то специальное ключевое слово). Сниппет будет рендериться по прямой ссылке: https://t.me/DurgerKingBot/menu
    2. Main Mini App. Это то, что вы настроили. Главный результат — большая кнопка для открытия мини-приложения в окне информации о боте. Сниппет будет рендериться с GET-параметр startapp: https://t.me/DurgerKingBot?startapp

    Если необходимо, можно настроить оба варианта запуска одновременно.
    Ответ написан
    1 комментарий
  • Как шарить изображения в telegram mini apps js?

    @GrigoryMorozov
    Если мини-приложение запускается с помощью инлайн-кнопки, а вы хотите отправить изображение в чат с ботом, используйте серверный метод answerWebAppQuery. Реализация примерно такая:
    1. Отправляете сгенерированное изображение вместе с параметром initData собственному серверному скрипту
    2. Проверяете параметр initData, извлекаете из него query_id
    3. Сохраняете сгенерированное изображение
    4. Вызываете метод answerWebAppQuery с извлечённым query_id. В качестве параметра result передаёте InlineQueryResultPhoto со ссылкой на сгенерированное изображение
    5. Сгенерированное изображение спустя какое-то время можно удалить

    Альтернативно, если мини-приложение запускается по прямой ссылке, можно использовать клиентский метод switchInlineQuery. Предварительно выполните шаги 1-3 и сохраните ассоциацию пользователя со ссылкой на сгенерированное изображение.

    После вызова клиентского метода мини-приложение закроется, будет предложено выбрать чат (если передавался параметр choose_chat_types), а бот получит событие inline_query. Ответьте на него с помощью серверного метода answerInlineQuery, используя сохранённую ассоциацию (параметр results в данном случае — массив с одним элементом типа InlineQueryResultPhoto, cache_time должен быть небольшим, а is_personal — true).
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (5)