Андрей Смирнов
Время чтения: ~5 мин.
Просмотров: 1

Ещё один telegram-бот или реализация бота для знакомств

Инструкция по регистрации и настройке

Устанавливаются и запускаются программы практически одинаково:

  • сначала в поиске нужно найти необходимого бота;
  • затем выполнить его активацию, нажав на кнопку «Start»;
  • далее мастером настроек будет определен новый посетитель;
  • указывается пол для поиска (парни или девушки);
  • после этого заполняется небольшая анкета, куда вносятся личные данные, местонахождение и подтверждается совершеннолетие;
  • вслед за этим необходимо указать возрастную категорию, с которой желаете общаться (минимальный и максимальный возраст);
  • теперь осталось дождаться результатов поиска системы и выбрать из предложенного списка наиболее подходящего кандидата.

Бот-обработчик

Сам telegram предлагает два варианта получения обновлений: webhook или постоянно дергать сервера, проверяя обновления. Webhook имеет большое количество сложностей, поэтому проще просто проверять обновления.

Получение обновлений их обработка

Для того, чтобы не создавать велосипед(иногда бывает полезно), проще использовать готовое решение: Telegram.Bot by MrRoundRobin — отличная, очень удобная библиотека для работы с Telegram. Создаем в решение новый проект ConsoleApp, куда и устанавливаем этот пакет.

         private static readonly TelegramBotClient Bot = new TelegramBotClient(token);//Инициализация бота         static void Main(string[] args)         {             var me = Bot.GetMeAsync().Result;//Получаем имя бота, чтобы обозвать окошко консоли(когда ботов несколько, то так проще)             Console.Title = me.Username;              //Создаем обработчики событий             Bot.OnMessage += BotOnMessageReceived;              Bot.OnCallbackQuery += BotOnCallbackQueryReceived;             Bot.OnReceiveError += BotOnReceiveError;              //Начинаем проверять обновления             Bot.StartReceiving(Array.Empty());             Console.WriteLine($"Start listening for @{me.Username}");             Console.ReadLine();             Bot.StopReceiving();         }

Таким образом, мы начали проверку на обновления и поставили свои обработчики ошибок. BotOnMessageReceived — обработчик получения «обычных» сообщенийBotOnCallbackQueryReceived — обработчик нажатия кнопок, которые появляются под сообщением. Дело за малым, возможность оставить анкету и возможность пролистать остальные. Так что нужно отправить пользователю две кнопки: Регистрация и Дальше. Кнопка представляет объект InlineKeyboardButton, а все кнопки нужно упаковать в

IEnumerable<ienumerablee>  При открытии бота, ему сразу же отправляется сообщение с текстом "/start", так что нам нужно в BotOnMessageReceived обработать это сообщение и отправить в ответ наши кнопки. 
if (message.Text == "/start")                 {                     var inlineKeyboard = new InlineKeyboardMarkup(new[]                                 {                         new [] // first row                         {                             InlineKeyboardButton.WithCallbackData("Начать!", "Next"),                             InlineKeyboardButton.WithCallbackData("Регистрация", "Registration")                         }                     });                      Bot.SendTextMessageAsync(message.Chat.Id, "Добро пожаловать в lovebot! rnЧтобы перезапустить бота - /startrnЧтобы зарегистроваться или же изменить свою анкету - /registerrnЧтобы посмотреть количество пользователей бота - /statsrn По поводу возникших вопросов - @hahah2016", replyMarkup: inlineKeyboard);                     return;                 }

Регистрация

Для регистрации, нужно запоминать, что пользователь ввел ранее. То есть нам нужно создать хранилище памяти бота. Я просто создал класс, где описал логику заполнения данных. RegForm.cs

public class RegForm     {         public string tg_id { get; set; }         public string name { get; set; }         public string age { get; set; }         public string country { get; set; }         public string city { get; set; }         public string gender { get; set; }         public string photo { get; set; }         public string tg_username { get; set; }         public string tg_chat_id { get; set; }          public int stage;                  public RegForm(string id, string chat_id, string username)         {             stage = 1;             tg_id = id;             tg_username = username;         }          public (string, int) StageText(string id)         {             if (stage == 1)                 return ("Введите отображаемое имя:", stage);             if (stage == 2)                 return ("Введите возраст:", stage);             if (stage == 3)                 return ("Введите Вашу страну:", stage);             if (stage == 4)                 return ("Введите Ваш город:", stage);             if (stage == 5)                 return ("Введите Ваш пол:", stage);             else                  return ("Отправьте боту Ваше фото:", stage);         }           public bool SetParam(string param)         {             if (stage == 1)                 name = param;             if (stage == 2)                 age = param;             if (stage == 3)                 country = param;             if (stage == 4)                 city = param;             if (stage == 5)                 gender = param;             if (stage == 6)                 photo = param;             stage++;             return true;         }     }

В данном классе можно реализовать валидацию данных, например, не пропустить возраст в виде текста и т.п. А самой памятью выступает static Dictionary<string> registrations = ionary<string>();</string></string>, в кый мы добавляем новый KeyValuePair, при нажатии на кнопку. Чтобы бот знал, как ему реагировать на нажатие, нужно в BotOnCallbackQueryReceived добавить

var message = e.CallbackQuery;                 if (message.Data == "Registration")                 {                     RegForm form = new RegForm(message.From.Id.ToString(), message.Message.Chat.Id.ToString(), message.From.Username);//Создаем новую форму регистрации                     registrations.Add(message.From.Id.ToString(), form);//Добавляем форму в "память", где ключом будет telegram_id пользователя.                      var t = form.StageText(form.tg_id); //Получаем текст, который отправим пользователю, в зависимости  от стадии регистрации.                      Bot.SendTextMessageAsync(message.Message.Chat.Id, t.Item1);//отправляем сообщение пользователю.                      return;                 }

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

   using (Context db = new Context())                         {                             IMapper mapper = new MapperConfiguration(cfg => cfg.CreateMap<regform>()).CreateMapper();                    if (db.user.Where(x => x.tg_id == message.From.Id.ToString()).Count() != 0)                                 db.user.Update(mapper.Map<regform>(u));                                                     {                                 db.user.Add(mapper.Map<regform>(u));                                                  db.SaveChanges();                         }</regform></regform></regform>

Если пользователь уже имеет анкету, то просто обновим данные.Сохранение фото пользователя

if (message.Type == MessageType.Photo)                     {                          string file = Bot.GetFileAsync(message.Photo[message.Photo.Count() - 1].FileId).Result.FilePath;                         string filepath = message.From.Id + "." + file.Split('.').Last();                          using (FileStream fileStream = new FileStream("C:\images\" + filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite))                         {                             var st = Bot.DownloadFileAsync(file).Result;                             st.Position = 0;                             st.CopyTo(fileStream);                         }                         u.SetParam("C:\images\" + filepath);                     }

Показ остальных анкет

Для этого просто нужно брать данные из БД и отправлять пользователю. Для этого пишем простенький метод, который и будет брать данные из БД и возвращать их в удобном формате:

public static User GetRandom()         {             Stopwatch s = new Stopwatch();                 s.Start();             User u;             using (Context db = new Context())             {                 Random r = new Random();                 int count = db.user.Count();                 if (count > 1)                     count = count - 1;                 List<user> users = mapper.Map<list>, List<user>>(db.user.ToList());           u = users.ElementAtount));             }             Console.WriteLine("[" + DateTime.Now + "] For finding " + s.ElapsedMilliseconds + " ms");             s = null;             return u;         }</user></list></user>

Обработчик нажатия кнопки Next:

if (message.Data == "Next")                 {                     if (searchForms.Count != 0)                     {                         searchForms.Remove(message.From.Id.ToString());                     }                     IMapper mapper = new MapperConfiguration(cfg => cfg.CreateMap<regform>()).CreateMapper();             ser user = BaseWorker.GetRandom();                     SendAnket(user, message.Message.Chat.Id.ToString());//Метод, который создает форматирование в сообщении.                      return;                 }</regform>

</ienumerablee></pre>

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации