Как добиться, чтобы бот по Username находил User_id?
Пишу что-то вроде хелпдеска, работающего с ТГ Ботом + GoogleForms + AppScripts.
Удалось реализовать функцию уведомлений через ID (если писать напрямую user_id), но мне необходимо чтобы сотрудник писал свой "username" и по нему уже бот сам находил "user_id". Да, я читал что боту нужно написать первым или прожать команду /start, однако все равно при выполнении этих действий - бот не высылает уведомления по "user_id" а при тесте "Возврата ID из username" бот пишет что _"Пользователь не зарегистрирован. Попросите написать боту в личные сообщения".
Желаемое поведение: Боту написали "/start", он извлек "username", по нему нашел "user_id" и сохранил его себе в память, чтобы если пользователь мог создавать новые заявки, гарантированно получая уведомления о их статусе.
Сам код можно найти тут: https://drive.google.com/file/d/17qyXHHuV232sqR9v0efqjlJesoITwTpj/view?usp=sharing
// ====== ОБРАБОТКА ЛИЧНЫХ СООБЩЕНИЙ ====== //
function processPrivateMessage(message) {
try {
console.log("Обработка личного сообщения:", JSON.stringify(message));
if (!message?.from) {
console.error("Нет данных отправителя");
return;
}
const user = message.from;
// Проверяем обязательные поля
if (!user.id || !user.username) {
console.error("Неполные данные пользователя:", user);
sendPlainMessage("❌ Для регистрации необходим username в настройках Telegram", null, user.id);
return;
}
const originalUsername = user.username;
const normalizedUsername = originalUsername
.toLowerCase()
.replace(/^@/, '')
.trim();
// Сохраняем все варианты
const variations = [
`user_${normalizedUsername}`,
`user_@${normalizedUsername}`
];
variations.forEach(variation => {
PropertiesService.getScriptProperties().setProperty(variation, user.id.toString());
console.log(`Сохранено: ${variation} = ${user.id}`);
});
// Отправляем подтверждение
sendPlainMessage(
"✅ Регистрация успешна!\nТеперь вы будете получать уведомления о заявках.",
null,
user.id
);
// Уведомление админа
sendAdminNotification(`? Зарегистрирован пользователь:
Username: @${normalizedUsername}
ID: ${user.id}
Время: ${new Date().toLocaleString()}`);
} catch (error) {
console.error("Ошибка обработки ЛС:", error);
sendAdminNotification(`⚠️ Ошибка регистрации: ${error.message}`);
}
}
// ====== ПОИСК ПОЛЬЗОВАТЕЛЯ ====== //
function findUserIdByUsername(username) {
try {
if (!username || typeof username !== 'string') return null;
const cleanUsername = username
.toLowerCase()
.replace(/^@/, '')
.trim();
const variations = [
`user_${cleanUsername}`,
`user_@${cleanUsername}`
];
const scriptProperties = PropertiesService.getScriptProperties();
for (const variation of variations) {
const userId = scriptProperties.getProperty(variation);
if (userId) {
console.log(`Найден пользователь: ${variation} = ${userId}`);
return userId;
}
}
console.log("Пользователь не найден для:", cleanUsername);
return null;
} catch (error) {
console.error("Ошибка поиска:", error);
return null;
}
}