Meu nome é Vlad, por profissão sou militar, mas trabalho em período parcial em uma empresa de automação comercial, onde faço programação em .net.
Breve histórico
No momento da próxima discrepância de convergência com minha ex-noiva (regular), ela disse que, por tédio, procurava homens por encontros através de um telegrama-bot, que poderia enviar fotos e geolocalização e buscar pessoas próximas. Prometi escrever algo semelhante se fugirmos novamente.
Yara é para você.Esqueci-me com segurança, mas na próxima ociosidade, rolei o site
com um cupcake sobre um fundo verde , onde me deparei com uma seção em que as pessoas simplesmente postavam um post com uma foto, escreviam brevemente sobre si mesmas e indicavam contatos.
Então surgiu a ideia de escrever seu bot, o que ajudaria as pessoas a encontrar amigos ou qualquer outra pessoa.
Desafio
Crie um bot em que qualquer pessoa que queira conversar possa postar informações curtas sobre si e aguardar até escrever para ele.

Preparação para o trabalho
Como criar um bot através do BotFather não conhece apenas quem não está interessado, por isso não preencherei o artigo com informações extras.Armazenamento de "perfis"
Inicialmente, criei o projeto ClassLibrary, que eu usaria para trabalhar com dados.
Primeiro, você precisa decidir como armazenar os dados do usuário. Para fazer isso, precisamos "descrever" o usuário.
public class user { [Key] public string tg_id { get; set; }
Para armazenamento, foi selecionado o banco de dados PostgreSQL, que foi implantado em um servidor remoto.
Primeiro, defina o EntityFramework, através do NuGet. Simplifica de maneira irrealista a vida ao trabalhar com o banco de dados.
Para trabalhar, você precisa do pacote:
NpgSQL.EntityFrameworkCore.PostgreSQL
E para migrações, é necessário um pacote:
Microsoft.EntityFrameworkCore.Tools
Para não lidar com a criação rotineira da tabela, simplesmente criamos o próprio modelo de dados (nossa classe acima) e configuramos a conexão com o banco de dados.
public DbSet<user> user { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(connectionString); }
Além disso, realizamos a migração.
Para fazer isso, no Package Manager Console, execute os comandos:
enable-migrations
Ative o mecanismo de migração
Add-migration * *
Crie uma migração
update-database
Atualizando o banco de dados
Agora, em nosso banco de dados, duas tabelas aparecerão: o histórico de migrações e a própria tabela de usuários.

Depois de resolver o problema de armazenamento de dados e conexão com o banco de dados, você pode continuar escrevendo o próprio manipulador de bot.
Bot manipulador
O próprio Telegram oferece duas opções para receber atualizações: o webhook ou puxa constantemente o servidor, procurando atualizações. O Webhook tem muitas dificuldades, por isso é mais fácil verificar se há atualizações.
Receba atualizações, processe-as
Para não criar uma bicicleta (às vezes é útil), é mais fácil usar uma solução pronta:
Telegram.O Bot by MrRoundRobin é uma biblioteca excelente e muito conveniente para trabalhar com o Telegram.
Criamos um novo projeto ConsoleApp na solução, onde instalamos este pacote.
private static readonly TelegramBotClient Bot = new TelegramBotClient(token);
Assim, começamos a procurar atualizações e instalamos nossos manipuladores de erros.
BotOnMessageReceived
- um manipulador para receber mensagens "regulares"
BotOnCallbackQueryReceived
- o manipulador para pressionar os botões que aparecem sob a mensagem.
O caso é pequeno, a capacidade de deixar um questionário e a capacidade de rolar pelo resto. Então, você precisa enviar ao usuário dois botões: Registro e Avançar. Um botão representa um objeto
InlineKeyboardButton
e todos os botões precisam ser empacotados em
IEnumerable<IEnumerable<InlineKeyboardButton>>
Quando o bot é aberto, uma mensagem com o texto "/ start" é imediatamente enviada a ele, portanto, precisamos processar essa mensagem em
BotOnMessageReceived
e enviar nossos botões em resposta.
if (message.Text == "/start") { var inlineKeyboard = new InlineKeyboardMarkup(new[] { new []
Registo
Para se registrar, você precisa lembrar o que o usuário digitou anteriormente. Ou seja, precisamos criar um armazenamento de bot. Acabei de criar uma classe em que descrevi a lógica do preenchimento de dados.
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; } }
Nesta classe, você pode implementar a validação de dados, por exemplo, não perca a idade na forma de texto, etc.
E a própria memória é o
static Dictionary<string, RegForm> registrations = new Dictionary<string, RegForm>();
no qual adicionamos um novo KeyValuePair, com o clique de um botão.
Para que o bot saiba como responder ao clique, é necessário adicionar
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);
Da mesma forma, ao processar os dados recebidos, você pode preencher o formulário e salvar os dados.
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(); }
Se o usuário já tiver um perfil, basta atualizar os dados.
Salvando a foto do usuário 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 outros perfis
Para fazer isso, você só precisa pegar os dados do banco de dados e enviá-los ao usuário.
Para fazer isso, escrevemos um método simples que pega os dados do banco de dados e os retorna em um 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; }
Manipulador de cliques do botão Próximo:
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());
Conclusão
Por toda a sua simplicidade, o público gostou do bot.
Em menos de um dia, 134 usuários deixaram seus perfis, houve um feedback positivo. E sem publicidade especial - há apenas uma publicação no site, que não obteve vantagens particularmente positivas.
Bots são um velho esquecido que encontrou uma nova vida. Eles realmente ajudam a automatizar muitos processos e até procuram um parceiro na Internet. Ignorando sites de namoro monetizados.
Obrigado por ler até o fim.
Boa sorte, divirta-se, não coma neve amarela.