你好论坛用户))我有一个问题:我写了一个电报机器人,它从照片中提取某些信息并将其输入数据库。进一步的代码,在 - 解释之后。
private static async void BotOnPhotoReceived(object sender, MessageEventArgs messageEventArgs)
{
var message = messageEventArgs.Message;
try
{
if (message == null || message.Type != MessageType.PhotoMessage)
return;
var fileId = message.Photo[message.Photo.Length - 1].FileId;
var file = await Bot.GetFileAsync(fileId);
var stream = file.FileStream;
using (Stream output = new FileStream($"../../Photo/img{message.Chat.Id}{fileId}.jpg", FileMode.Append))
{
byte[] buffer = new byte[32 * 1024];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
await Bot.SendChatActionAsync(message.Chat.Id, ChatAction.Typing);
var FileUrl = @"D:\\128.png";
using (var streamm = System.IO.File.Open(FileUrl, FileMode.Open))
{
FileToSend fts = new FileToSend();
fts.Content = streamm;
fts.Filename = FileUrl.Split('\\').Last();
var test = await Bot.SendStickerAsync(message.Chat.Id, fts);
}
string imagePath = $"../../Photo/img{message.Chat.Id}{fileId}.jpg";
TextDetection newTD = new TextDetection();
string text = newTD.photo2string(imagePath);
string result = ParseString(text);
Console.WriteLine(Convert.ToDouble(result));
double result1 = Math.Abs(Convert.ToDouble(result));
DataBaseCon.InsertUser((int)message.Chat.Id, message.Chat.FirstName);
DataBaseCon.InsertAmount((int)message.Chat.Id, result1);
var keyboard = new Telegram.Bot.Types.ReplyMarkups.InlineKeyboardMarkup();
keyboard.InlineKeyboard = new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[][]
{
new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[]
{
new KeyboardButton("Продукты питания"),
new KeyboardButton("Техника"),
},
new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[]
{
new KeyboardButton("Транспорт"),
new KeyboardButton("Мобильная связь")
},
new Telegram.Bot.Types.InlineKeyboardButtons.InlineKeyboardButton[]
{
new KeyboardButton("Другое")
},
};
await Bot.SendTextMessageAsync(message.Chat.Id, "Выберите категорию товара, который вы приобрели", replyMarkup: keyboard);
await Task.Delay(1000);
bool flag = true;
Bot.OnCallbackQuery += (object sc, CallbackQueryEventArgs ev) =>
{
Task.Delay(5000);
if (ev.CallbackQuery.Data == "Транспорт" && flag)
{
DataBaseCon.InsertCategory((int)message.Chat.Id, "Транспорт");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на транспорт зафиксированы");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
}
else
if (ev.CallbackQuery.Data == "Мобильная связь" && flag)
{
DataBaseCon.InsertCategory((int)message.Chat.Id, "Мобильная связь");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на мобильную связь зафиксированы");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
}
else
if (ev.CallbackQuery.Data == "Продукты питания" && flag)
{
DataBaseCon.InsertCategory((int)message.Chat.Id, "Продукты питания");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на продукты питания зафиксированы");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
}
else
if (ev.CallbackQuery.Data == "Техника" && flag)
{
DataBaseCon.InsertCategory((int)message.Chat.Id, "Техника");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на технику зафиксированы");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
}
else
if (ev.CallbackQuery.Data == "Другое" && flag)
{
DataBaseCon.InsertCategory((int)message.Chat.Id, "Другое");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id, "Расходы на другую категорию зафиксированы");
Bot.AnswerCallbackQueryAsync(ev.CallbackQuery.Id);
}
flag = !flag;
};
if (flag)
{
await Bot.SendTextMessageAsync(message.Chat.Id, WalletKeeper.Constants.IT_IS_DONE);
}
}
catch (Exception e){
await Bot.SendTextMessageAsync(message.Chat.Id, WalletKeeper.Constants.FAILED);
}
}
如您所见,我在这里使用了按钮,但它们(或者更确切地说,它们的处理)存在问题。我上传了一张照片,然后我选择了将数据添加到(在数据库中)“交通”、“移动通信”等的类别,我遇到了以下问题:假设我第一次上传照片并选择了一个类别- 一切都很好,第二次 - 信息也输入正确,第三次我两次将一些数据输入数据库,我已经打破了我的整个脑袋(还有调试器),但是这个bug一直没有成立。据推测,问题是由于不正确使用async 和 await造成的。以防万一,我会发布更多代码。
static void Main(string[] args)
{
Bot.OnMessage += BotOnMessageReceived;
Bot.OnMessage += BotOnPhotoReceived;
var me = Bot.GetMeAsync().Result;
Console.Title = me.Username;
Bot.StartReceiving();
Console.ReadLine();
Bot.StopReceiving();
}
提前致谢))