zkrvndm
@zkrvndm
Архитектор решений

Как открыть диалог в WhatsApp Web при помощи JavaScript?

Здравствуйте. Возникла необходимость открыть диалог имитацией клика на сам диалог во вкладке слева.

Однако, вызов click() напрямую не сработал и даже передача событий click/mouseup через diapatchEvent() не помогла.

Подскажите, пожалуйста, не сталкивался ли кто-то из вас ранее с такой же проблемой на WhatsApp и как вы ее решили?

Я знаю, что можно открыть диалог в WhatsApp вставив на страницу невидимую ссылку примерно такого вида: https://api.whatsapp.com/send?phone=79997775533
И затем кликнуть по ней. Однако мне данный способ не слишком нравится, хотелось бы попробовать найти другое решение.
  • Вопрос задан
  • 412 просмотров
Решения вопроса 1
zkrvndm
@zkrvndm Автор вопроса
Архитектор решений
Нашел на иностранном сайте, как симулировать клики на React. Ниже пример, который подходит и для WhatsApp:
const mouseClickEvents = ['mousedown', 'click', 'mouseup'];

function simulateMouseClick(element){
  mouseClickEvents.forEach(mouseEventType =>
    element.dispatchEvent(
      new MouseEvent(mouseEventType, {
          view: window,
          bubbles: true,
          cancelable: true,
          buttons: 1
      })
    )
  );
}

// Ищем диалог по номеру телефона:
var element = document.querySelector('span[title="+7 905 837-96-43"]');
simulateMouseClick(element); // Симулируем событие клика

Данный способ оказался рабочим, можно использовать. В целом оказалось достаточно одного события mousedown:
// Ищем диалог с по номеру телефона:
dialog = document.querySelector('span[title="+7 905 837-96-43"]');

// Вызываем событие mousedown на найденном элементе:
dialog.dispatchEvent(
  new MouseEvent('mousedown', {
      bubbles: true
  })
);

При этом bubbles является параметром обязательным, без него не работает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kocherman
@kocherman
Так получаешь координаты элемента контакта:

document.querySelector('span[title=...]').getBoundingClientRect()


Вычисляешь среднюю точку, потом получаешь массив элементов по координатам этой точки:

document.elementsFromPoint( x, y );

Поробуй пройтись по всем элементам. Используй в dispatchEvent() не только ClickEvent, можно так же TouchEvent, MoutionEvent, FocusEvent.

И список событий есть в devinspector5f6066d97a694100571963.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект
22 нояб. 2024, в 23:55
3000 руб./за проект