Первым делом посмотрел публикации на infostart, но в большинстве решений просят денег или платные сервисы или методы подключения к Whatsapp устарели.
Поэтому начал искать решение в тех языках программирования, в которых разбираюсь.
Вышел на решение whatsapp-web.js (https://www.npmjs.com/package/whatsapp-web.js/v/1.16.4-alpha.0)
Для того, чтобы воспользоватся npm, нужно установить node.js (https://nodejs.org/en/)
Node.js нужно будет установить на всех компьютерах пользователей, которые будут работать с рассылкой (или терминальном сервере).
Далее скачиваю пакет в папку на компьютере
Для этого нужно
- Открываем cmd
- Проверяем, что node.js установлен: node -v
- Открываем пустую папку в которой и будет наш проект к примеру (D:\Whatsapp)
Набираем команду: npm init (На все вопросы жмем интер)
- Устанавливаем пакет whatsapp-web.js
npm i whatsapp-web.js
- Создаем в папке файл index.js
- В файл нужно добавить логику рассылки, к примеру, как в примере на страничке npm whatsapp-web.js
const { Client,LocalAuth } = require('whatsapp-web.js');
const client = new Client({
authStrategy: new LocalAuth(),
puppeteer: { headless: false }
});
client.on('qr', (qr) => {
// Generate and scan this code with your phone
console.log('QR RECEIVED', qr);
});
client.on('ready', () => {
console.log('Client is ready!');
});
client.on('message', msg => {
if (msg.body == '!ping') {
msg.reply('pong');
}
});
client.initialize();
- запускаем проект
node index.js
- после запуска должна вылезти форма авторизации в Whatsapp
На телефоне открываем Whatsapp (Связанные устройства) и сканируем q-code для авторизации.
Пошлем на этот номер команду !ping, то бот нам ответит pong
На этом задача минимум решена.
У нас запущен бот, который отвечает на сообщения. Мы влияем из файла index.js, что будет отправлено в Whatsapp.
Начинаем решать основную задачу.
Мне рассылку из 1с нужно делать не с левого номера (бота), а с номера менеджера, чтобы контрагенты не видели разницы между рассылкой и обычными сообщениями менеджера и контрагенты могли отвечать на сообщения.
1. В 1с нужно создать справочник номераWhatsapp или регистр сведений (измерение контрагент, ресурс номерWhatsapp). или добавить реквизит номерWhatsapp в справочник контрагентов.
У меня это Справочник "предопределенные константы", в которой есть табличная часть с двумя реквизитами.
2. Рассылку из 1с будут запускать на терминальном сервере все содержимое папки Whatsapp поместим на терминальный сервер в папку (C:\Program Files (x86)\Whatsapp\)
3. Установим node.js на терминальном сервере
Создал в 1с обработку
(Кнопки добавить и записать служат для добавления новых контрагентов с номером)
Обработка генерирует строку !комадна для бота и Json.
- команда !senddebit
- json массив массивов (номер Whatsapp и сумма):
[
[79951231212,4445630.5],
[79041231212,-57113968],
[79771231212,-5322.81]
]
После нажатия кнопки "Отправить в Whatsapp":
1. Формируются данные для отправки
2. Строка с данными автоматически копируется в буфер обмена
3. Всплывает окно авторизации в Whatsapp (авторизоваться должен пользователь от чего номера будет рассылка).
4. После авторизации пользователь должен вставить текст из буфера обмена в сообщение любому номеру (желательно второму своему, потому что это сообщение мы и будем ловить, обрабатывать и рассылать)
Но для того, чтобы index.js обработал новую команду !senddebit, нужно его доработать.
На этот раз ловим сообщение, которое отправили мы сами (без разницы кому) и которое начинается на !senddebit
Вместо события client.on('message', буду использовать событие client.on('message_create' которое ловит все сообщения, в том числе, которые мы создали сами.
client.on('message_create', async msg => {
if (msg.fromMe) {
if (msg.body.startsWith('!senddebit ')) {
const messagesJson = msg.body.replace('!senddebit ','')
const arrMessages = JSON.parse(messagesJson)
if (Array.isArray(arrMessages)) {
arrMessages.forEach(async n_m=>{
let number = n_m[0]+'';
let sum = n_m[1];
number = number.includes('@c.us') ? number : `${number}@c.us`;
if (number.length==16 && sum!='') {
let type = 'задолженность'
if (Number(sum)<0) {
type = 'предоплата'
sum = sum *-1
}
let message =
`Добрый день!
Ваша ${type} составляет ${sum}`
let chat = await msg.getChat();
chat.sendSeen();
client.sendMessage(number, message);
}
})
}
}
}
});
В итоге контрагенту приходит сообщение
Если вам понравилась статья, поставьте плюсик, мне будет приятно)
Тестировал:
1С:Комплексная автоматизация 2 (2.4.13.209)
Платформа 1С:Предприятие 8.3 (8.3.19.1467)