Mi nombre es Vlad, de profesión soy militar, pero trabajo a tiempo parcial en una empresa de automatización de negocios, donde hago programación en .net.
Breve antecedentes
En el momento de la próxima convergencia-discrepancia con mi ex novia (regular), ella dijo que por aburrimiento estaba buscando chicos para citas a través de un telegram-bot, que podría enviar fotos y geolocalización y recoger a las personas que están cerca. Prometí que escribiría algo similar si huíamos de nuevo.
Yara es para ti.Lo olvidé con seguridad, pero en el momento de la siguiente inactividad, me desplacé por el sitio web
con un pastelito sobre un fondo verde , donde encontré una sección donde la gente acaba de publicar una publicación con una foto, escribió brevemente sobre ellos e indicó contactos.
Entonces surgió la idea de escribir su bot, lo que ayudaría a las personas a encontrar amigos o cualquier otra persona.
Desafío
Cree un bot donde cualquiera que quiera chatear pueda publicar información corta sobre sí mismo y simplemente esperar hasta que le escriban.

Preparación para el trabajo
Cómo crear un bot a través de BotFather no solo conoce al que no le interesa, por lo que no llenaré el artículo con información adicional.Almacenamiento de "perfiles"
Inicialmente, creé el proyecto ClassLibrary, que iba a usar para trabajar con datos.
Primero debe decidir cómo almacenar los datos del usuario. Para hacer esto, necesitamos "describir" al usuario.
public class user { [Key] public string tg_id { get; set; }
Para el almacenamiento, se seleccionó la base de datos PostgreSQL, que se implementó en un servidor remoto.
Primero, configure el EntityFramework, a través de NuGet. Simplifica de manera poco realista la vida al trabajar con la base de datos.
Para trabajar, necesitas el paquete:
NpgSQL.EntityFrameworkCore.PostgreSQL
Y para las migraciones se requiere un paquete:
Microsoft.EntityFrameworkCore.Tools
Para no lidiar con la creación rutinaria de la tabla, simplemente creamos el modelo de datos en sí (nuestra clase anterior) y establecemos la conexión a la base de datos.
public DbSet<user> user { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(connectionString); }
Además llevamos a cabo la migración.
Para hacer esto, en la consola de Package Manager, ejecute los comandos:
enable-migrations
Encienda el mecanismo de migración.
Add-migration * *
Crea una migración
update-database
Actualizando la base de datos
Ahora en nuestra base de datos aparecerán dos tablas: el historial de migraciones y la propia tabla de usuario.

Después de resolver el problema de almacenar datos y conectarse a la base de datos, puede proceder a escribir el controlador de bot en sí.
Handler bot
Telegram en sí ofrece dos opciones para recibir actualizaciones: webhook o extraer constantemente el servidor, buscando actualizaciones. Webhook tiene muchas dificultades, por lo que es más fácil simplemente buscar actualizaciones.
Recibe actualizaciones, procesalas
Para no crear una bicicleta (a veces es útil), es más fácil usar una solución preparada:
Telegram. Bot de MrRoundRobin es una biblioteca excelente y muy conveniente para trabajar con Telegram.
Creamos un nuevo proyecto ConsoleApp en la solución, donde instalamos este paquete.
private static readonly TelegramBotClient Bot = new TelegramBotClient(token);
Por lo tanto, comenzamos a buscar actualizaciones e instalamos nuestros manejadores de errores.
BotOnMessageReceived
: un controlador para recibir mensajes "regulares"
BotOnCallbackQueryReceived
: el controlador para presionar los botones que aparecen debajo del mensaje.
El caso es pequeño, la capacidad de dejar un cuestionario y la capacidad de desplazarse por el resto. Por lo tanto, debe enviar al usuario dos botones: Registro y Siguiente. Un botón representa un objeto
InlineKeyboardButton
, y todos los botones deben estar empaquetados en
IEnumerable<IEnumerable<InlineKeyboardButton>>
Cuando se abre el bot, se le envía de inmediato un mensaje con el texto "/ start", por lo que debemos procesar este mensaje en
BotOnMessageReceived
y enviar nuestros botones en respuesta.
if (message.Text == "/start") { var inlineKeyboard = new InlineKeyboardMarkup(new[] { new []
Registro
Para registrarse, debe recordar lo que el usuario ingresó anteriormente. Es decir, necesitamos crear un almacenamiento de bot. Acabo de crear una clase donde describí la lógica de llenar datos.
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; } }
En esta clase, puede implementar la validación de datos, por ejemplo, no perder la edad en forma de texto, etc.
Y la memoria en sí es el
static Dictionary<string, RegForm> registrations = new Dictionary<string, RegForm>();
en el que agregamos un nuevo KeyValuePair, con el clic de un botón.
Para que el bot sepa cómo responder al clic, debe agregar
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);
Y de la misma manera, procesando los datos recibidos, puede completar el formulario y guardar los datos.
using (Context db = new Context()) { IMapper mapper = new MapperConfiguration(cfg => cfg.CreateMap<RegForm, User>()).CreateMapper(); if (db.user.Where(x => x.tg_id == message.From.Id.ToString()).Count() != 0) db.user.Update(mapper.Map<RegForm, tgbot_base.classes.user>(u)); else { db.user.Add(mapper.Map<RegForm, tgbot_base.classes.user>(u)); } db.SaveChanges(); }
Si el usuario ya tiene un perfil, simplemente actualice los datos.
Guardando foto de usuario 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); }
Mostrar otros perfiles
Para hacer esto, solo necesita tomar datos de la base de datos y enviarlos al usuario.
Para hacer esto, escribimos un método simple que tomará datos de la base de datos y los devolverá en un formato conveniente:
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<tgbot_base.classes.user>, List<User>>(db.user.ToList()); u = users.ElementAt(r.Next(0, count)); } Console.WriteLine("[" + DateTime.Now + "] For finding " + s.ElapsedMilliseconds + " ms"); s = null; return u; }
Siguiente botón haga clic en controlador:
if (message.Data == "Next") { if (searchForms.Count != 0) { searchForms.Remove(message.From.Id.ToString()); } IMapper mapper = new MapperConfiguration(cfg => cfg.CreateMap<RegForm, User>()).CreateMapper(); User user = BaseWorker.GetRandom(); SendAnket(user, message.Message.Chat.Id.ToString());
Conclusión
A pesar de su simplicidad, al público le gustó el bot.
En menos de un día, 134 usuarios dejaron sus perfiles, hay comentarios positivos. Y sin publicidad especial, solo hay una publicación en el sitio, que no obtuvo más ventajas.
Los bots son un viejo olvidado que ha encontrado una nueva vida. Ayudan a automatizar realmente muchos procesos e incluso a buscar pareja en Internet. Sin pasar por sitios de citas monetizados.
Gracias por leer hasta el final.
Buena suerte, diviértete, no comas nieve amarilla.