/// <summary> /// Генерит jsonчик и отправляет его фейсбуку /// </summary> /// <param name="model"></param> /// <returns></returns> private async Task <int> Send(SendMessageModel model) { string jsonContent = JsonConvert.SerializeObject(model, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); jsonContent = BotTextHelper.SmileCodesReplace(jsonContent, SocialNetworkType.Facebook); HttpResponseMessage responce; StringContent content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); string url = $"https://graph.facebook.com/v2.6/me/messages?access_token={_token}"; using (var client = new HttpClient()) { using (var r = await client.PostAsync(new Uri(url), content)) { responce = r; string responceString = await r.Content.ReadAsStringAsync(); if (responceString.ToLower().Contains("error")) { Logging.Logger.Error($"Facebook Api Send: NOT OK!! {responceString}"); return(1); } else { return(0); } } } }
/// <summary> /// Маршрутизатор текстовых сообщений /// </summary> /// <param name="thisQuery"></param> /// <param name="type"></param> /// <param name="Bot"></param> /// <param name="botUser"></param> /// <param name="text"></param> /// <param name="Requests"></param> /// <returns></returns> public async Task <int> SendText(string text) { TelegramBotClient telegram = null; FacebookApiHelper facebook = null; int IsError = 0; if (type == SocialNetworkType.Telegram) { telegram = (TelegramBotClient)Bot; } if (type == SocialNetworkType.Facebook) { facebook = (FacebookApiHelper)Bot; } if (type == SocialNetworkType.VK) { //var cont = new SenderContext("Z_Messages"); //cont.Message.Add(new BotMessage { BotUserVKID = botUser.BotUserVKID, Text = text, DateTime = DateTime.Now, IsSended = false }); //cont.SaveChanges(); Requests.Add(new VKApiRequestModel(ulong.Parse(botUser.BotUserVKID), text)); } if (type == SocialNetworkType.Telegram) { text = BotTextHelper.SmileCodesReplace(text); await telegram.SendTextMessageAsync(botUser.BotUserTelegramID, text); } if (type == SocialNetworkType.Facebook) { IsError = await facebook.SendMessage(botUser.BotUserFacebookID, text); } return(IsError); }
public async Task <HttpResponseMessage> PostMessage(JObject jsonResponce) { DateTime TimeToStartAnswer = DateTime.Now; var telegramResponce = jsonResponce.ToObject <Update>(); Logging.Logger.Debug($"PostMessage message={jsonResponce}"); if (telegramResponce == null) { Logging.Logger.Error("Пустой запрос"); return(new HttpResponseMessage(HttpStatusCode.OK)); } if (telegramResponce.Type == UpdateType.MessageUpdate) { var _Bot = new Telegram.Bot.Api(_token); await _Bot.SendChatActionAsync(telegramResponce.Message.Chat.Id, ChatAction.Typing); if (telegramResponce.Message.Text == null) { await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, "Простите, но я не поняла вас \U0001F614"); } else { try { // кэшируем #region string trimmedLoweredQuery = telegramResponce.Message.Text.ToLower().Trim(QueryAnaliser.splitters); var thisQuery = new BotUserQuery { IsError = 0 }; var mbFunctional = new MallBotFunctional(); var mbDBHelper = new MallBotDBHelper(); var mbApiFunctional = new MallBotApiTelegramFunctional(); string MainCachedItemKey = "MainDataOfBot"; string RadugaCachedItemKey = "RadugaDataOfBot"; MallBotModel MainDataOfBot = null; MallBotModel RadugaDataOfBot = null; var dbMainContext = new MallBotContext(); dbMainContext.Configuration.ProxyCreationEnabled = false; var dbRadugaContext = new MallBotContext(1); dbMainContext.Configuration.ProxyCreationEnabled = false; object MaindataFromCache = MemoryCache.Default.Get(MainCachedItemKey, null); object RadugadataFromCache = MemoryCache.Default.Get(RadugaCachedItemKey, null); if (trimmedLoweredQuery == "update") { if (MaindataFromCache != null) { MemoryCache.Default.Remove(MainCachedItemKey, null); } if (RadugadataFromCache != null) { MemoryCache.Default.Remove(RadugaCachedItemKey, null); } MaindataFromCache = null; RadugadataFromCache = null; } if (MaindataFromCache == null || RadugadataFromCache == null) { List <int?> ids = new List <int?> { 3, 5 }; MainDataOfBot = new MallBotModel(dbMainContext, ids); ids = new List <int?> { 1 }; RadugaDataOfBot = new MallBotModel(dbRadugaContext, ids); string[] TimeOfExpiration = ConfigurationManager.AppSettings["TimeOfExpiration"].ToString().Split(':'); CacheItemPolicy cip = new CacheItemPolicy() { AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(int.Parse(TimeOfExpiration[0])).AddMinutes(int.Parse(TimeOfExpiration[1])).AddSeconds(int.Parse(TimeOfExpiration[2]))) }; MemoryCache.Default.Set(new CacheItem(MainCachedItemKey, (object)MainDataOfBot), cip); MemoryCache.Default.Set(new CacheItem(RadugaCachedItemKey, (object)RadugaDataOfBot), cip); } else { MainDataOfBot = (MallBotModel)MaindataFromCache; RadugaDataOfBot = (MallBotModel)RadugadataFromCache; } #endregion var botUsers = dbMainContext.BotUser.ToList(); var botUser = botUsers.FirstOrDefault(x => x.BotUserTelegramID == telegramResponce.Message.Chat.Id.ToString()); QueryAnaliserResult answer = null; MallBotModel DataOfBot = null; var customers = MainDataOfBot.Customers; customers.AddRange(RadugaDataOfBot.Customers); var IsTutorial = true; if ( #region botUser == null || trimmedLoweredQuery == "place" || trimmedLoweredQuery == "место" || trimmedLoweredQuery == "сменить тц" || trimmedLoweredQuery == "тц" || botUser.CustomerName == "newuser" || trimmedLoweredQuery == "help" && (botUser.CustomerName == "newuser" || botUser.CustomerName == "empty") || trimmedLoweredQuery == "помощь" && (botUser.CustomerName == "newuser" || botUser.CustomerName == "empty") #endregion ) { if (trimmedLoweredQuery == "help" || trimmedLoweredQuery == "помощь") { var message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%priorityhelp%").Text; message = message.Replace("%place%", "/place"); message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); } else { if (botUser == null) { dbMainContext = mbDBHelper.AddBotUser(ulong.Parse(telegramResponce.Message.Chat.Id.ToString()), 2, null, telegramResponce.Message.From.FirstName, telegramResponce.Message.From.LastName, 0, null, "ru_RU", false, dbMainContext); botUser = dbMainContext.BotUser.FirstOrDefault(x => x.BotUserTelegramID == telegramResponce.Message.Chat.Id.ToString()); } botUser.CustomerName = "empty"; if (botUser.LevelTutorial != 4) { botUser.LevelTutorial = 0; } botUser.ModifiedDate = DateTime.Now; dbMainContext.SaveChanges(); var message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%mallselect%").Text; message = message.Replace("%mall1%", "1. " + customers[0].Name + " " + customers[0].City); message = message.Replace("%mall2%", "2. " + customers[1].Name + " " + customers[1].City); message = message.Replace("%mall3%", "3. " + customers[2].Name + " " + customers[2].City); message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); } } else { if (botUser.CustomerName == "empty") { var qa = new QueryAnaliser(); var res = mbFunctional.SearchCustomer(qa.NormalizeQuery(telegramResponce.Message.Text), customers); if (res.Count != 0) { var findedCustomer = customers.FirstOrDefault(x => x.CustomerID == res[0].ID); var message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%mallselectsucces%").Text; message = message.Replace("%findedmall%", findedCustomer.Name + " " + findedCustomer.City); message = message.Replace("%place%", "/place"); message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); botUser.CustomerName = res[0].Name; dbMainContext.SaveChanges(); if (botUser.LevelTutorial != 4) { answer = await mbApiFunctional.doTutorial(botUser, telegramResponce.Message.Text, _Bot, telegramResponce.Message.Chat.Id, dbMainContext, MainDataOfBot); } } else { var message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%mallselectfail%").Text; message = message.Replace("%notfindedmall%", telegramResponce.Message.Text); message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); } } else { if (botUser.CustomerName == RadugaDataOfBot.Customers[0].Name) { DataOfBot = RadugaDataOfBot; DataOfBot.Texts = MainDataOfBot.Texts; } else { DataOfBot = mbDBHelper.SelectData(MainDataOfBot, botUser, customers); } // Блок для описания команд if (trimmedLoweredQuery.Contains("testfunc")) // команды для разработчиков { await mbApiFunctional.doDebelopersCommands(trimmedLoweredQuery, DataOfBot, _Bot, telegramResponce.Message.Chat.Id); } else // команды для пользователей { var message = ""; switch (trimmedLoweredQuery) { case "start": message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%start%").Text; message = message.Replace("%help%", "/help"); message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "update": message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%cacheupdate%").Text; message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "clear": botUser.LevelTutorial = 0; botUser.CustomerName = "newuser"; botUser.ModifiedDate = DateTime.Now; dbMainContext.SaveChanges(); message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%clear%").Text; message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "skip": botUser.LevelTutorial = 4; botUser.ModifiedDate = DateTime.Now; dbMainContext.SaveChanges(); message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%skip%").Text; message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "привет": case "hello": case "здравствуйте": case "пряффки": case "hi": message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%hello%").Text; message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "пока": case "до свидания": case "спасибо": case "покеда": case "досвидули": case "большоеспасибо": case "прощай": message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%thkx%").Text; message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "помощь": case "help": case "как это работает": case "хелп": message = MainDataOfBot.Texts.FirstOrDefault(x => x.Locale == botUser.Locale && x.Key == "%help%").Text; message = message.Replace("%place%", "/place"); message = message.Replace("%tutorial%", "/tutorial"); message = message.Replace("%help%", "/help"); message = BotTextHelper.SmileCodesReplace(message); await _Bot.SendTextMessageAsync(telegramResponce.Message.Chat.Id, message); break; case "что делать": case "tutorial": case "обучение": case "туториал": answer = await mbApiFunctional.doTutorial(botUser, telegramResponce.Message.Text, _Bot, telegramResponce.Message.Chat.Id, dbMainContext, DataOfBot, true); break; default: if (botUser.LevelTutorial != 4) { answer = await mbApiFunctional.doTutorial(botUser, telegramResponce.Message.Text, _Bot, telegramResponce.Message.Chat.Id, dbMainContext, DataOfBot); } else { var mbFunctionalAnalizer = new MallBotFunctionalAnalizeTelegramHelper(); answer = await mbFunctionalAnalizer.AnaliseDoWorkResult(telegramResponce.Message.Text, telegramResponce.Message.Chat.Id, DataOfBot, _Bot, botUser); IsTutorial = false; } break; } } } } //пишем в базу запрос if (botUser != null) { if (DataOfBot == null) { mbDBHelper.AddBotQuery(botUser, ulong.Parse(telegramResponce.Message.Chat.Id.ToString()), 2, answer, telegramResponce.Message.Text, IsTutorial, TimeToStartAnswer, thisQuery); } else { mbDBHelper.AddBotQuery(botUser, ulong.Parse(telegramResponce.Message.Chat.Id.ToString()), 2, answer, telegramResponce.Message.Text, IsTutorial, TimeToStartAnswer, thisQuery); } } return(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("ok"), }); } catch (Exception exc) { Logging.Logger.Error(exc); return(new HttpResponseMessage(HttpStatusCode.OK)); } } } return(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("ok"), }); }
public async Task <int> Wall_Post(string groupID, string message, byte[] image = null) { try { var handler = new HttpClientHandler(); handler.CookieContainer = new CookieContainer(); using (var client = new HttpClient(handler)) { message = BotTextHelper.SmileCodesReplace(message, SocialNetworkType.VK); message = message.Replace("\\n", "\n"); message = HttpUtility.UrlEncode(message); string responceString; if (image != null) { var url = $"https://api.vk.com/method/photos.getWallUploadServer?access_token={_apptoken}&group_id={groupID}"; using (var responce = await client.GetAsync(url)) { responceString = responce.Content.ReadAsStringAsync().Result; if (responceString.Contains("error") || !responce.IsSuccessStatusCode) { Logging.Logger.Error($"VK Api Wall Post GetUrl: NOT OK {responceString}"); return(1); } } JObject json = JObject.Parse(responceString); var uploadImageUrl = json["response"]["upload_url"].ToString(); //Загружаем изображение MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(image), "photo", "photo.jpg"); using (var responce = await client.PostAsync(uploadImageUrl, form)) { responceString = responce.Content.ReadAsStringAsync().Result; if (responceString.Contains("error") || !responce.IsSuccessStatusCode) { Logging.Logger.Error($"VK Api Wall Post LoadPhotoToVkServ: NOT OK {responceString}"); return(1); } } json = JObject.Parse(responceString); var photo = json["photo"]; var server = json["server"]; var hash = json["hash"]; url = $"https://api.vk.com/method/photos.saveWallPhoto?access_token={_apptoken}&group_id={groupID}&server={server}&photo={photo}&hash={hash}"; using (var responce = await client.GetAsync(url)) { responceString = responce.Content.ReadAsStringAsync().Result; if (responceString.Contains("error") || !responce.IsSuccessStatusCode) { Logging.Logger.Error($"VK Api SavePhotoToVkServ: NOT OK {responceString}"); return(1); } } json = JObject.Parse(responceString); var attachment = json["response"][0]["id"].ToString();//photo{owner_id}_{pid} url = $"https://api.vk.com/method/wall.post?owner_id=-{groupID}&message={message}&attachments={attachment}&access_token={_apptoken}"; using (var res = await client.GetAsync(url)) { responceString = res.Content.ReadAsStringAsync().Result; if (responceString.Contains("error") || !res.IsSuccessStatusCode) { Logging.Logger.Error($"Vk Api SendMessageWithPhoto: NOT OK {responceString}"); return(1); } } return(0); } else { var url = $"https://api.vk.com/method/wall.post?owner_id=-{groupID}&message={message}&access_token={_apptoken}"; using (var res = await client.GetAsync(url)) { responceString = res.Content.ReadAsStringAsync().Result; if (responceString.Contains("error") || !res.IsSuccessStatusCode) { Logging.Logger.Error($"Vk Api SendMessageWithPhoto: NOT OK {responceString}"); return(1); } } return(0); } } } catch (Exception exc) { Logging.Logger.Error(exc); return(1); } }
/// <summary> /// Не больше 25 сообщений за раз. /// </summary> /// <param name="Requests"></param> /// <returns></returns> public async Task <int> SendAllRequests(List <VKApiRequestModel> Requests) { var handler = new HttpClientHandler(); handler.CookieContainer = new CookieContainer(); var httpClient = new HttpClient(handler); string uploadImageUrl = ""; var IsError = 0; string url = ""; HttpResponseMessage responce = null; var responceString = ""; JObject json = null; if (Requests.Where(x => x.Type == RequestType.SendMessageWithPhoto).Count() > 0) { // получаем url для загрузки изображений на сервак url = $"https://api.vk.com/method/photos.getMessagesUploadServer?access_token={_token}&v=5.57"; responce = await httpClient.GetAsync(url); responceString = responce.Content.ReadAsStringAsync().Result; if (responceString.Contains("error")) { IsError = 1; Logging.Logger.Error($"VK Api Get Url: NOT OK {responceString}"); } json = JObject.Parse(responceString); uploadImageUrl = json["response"]["upload_url"].ToString(); } string ids = ""; string messages = ""; string types = ""; string photos = ""; string hashs = ""; string servers = ""; foreach (var item in Requests) { ids += item.User_ID.ToString() + ", "; messages += "\"" + item.Message.Replace("\"", "\\\"") + "\", "; types += ((int)item.Type).ToString() + ", "; if (item.Type == RequestType.SendMessageWithPhoto) { //Загружаем изображение MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(item.Photo), "photo", "photo.jpg"); responce = await httpClient.PostAsync(uploadImageUrl, form); responceString = responce.Content.ReadAsStringAsync().Result; if (responceString.Contains("error")) { IsError = 1; Logging.Logger.Error($"VK Api Load: NOT OK {responceString}"); } json = JObject.Parse(responceString); var photo = json["photo"]; var server = json["server"]; var hash = json["hash"]; if (photo.ToString() == "[]") { await SendMessage(item.User_ID, "Опаньки! Мы попали на неудачный сервер. Мы уже на пути к тому, чтобы устранить эту проблему, но пока я не смогу ответить на ваши вопросы 3("); IsError = 1; return(IsError); } photos += "\"" + photo.ToString().Replace("\"", "\\\"") + "\", "; servers += "\"" + server.ToString() + "\", "; hashs += "\"" + hash.ToString() + "\", "; } else { photos += "\"empty\", "; servers += "\"empty\", "; hashs += "\"empty\", "; } } // передает в скрип "code" параметры var code = Properties.Resources.SendMessageWithPhotoSkript; code = code.Replace("Pids", ids.Remove(ids.Length - 2)); code = code.Replace("Pmessages", messages.Remove(messages.Length - 2)); code = code.Replace("Phashs", hashs.Remove(hashs.Length - 2)); code = code.Replace("Pphotos", photos.Remove(photos.Length - 2)); code = code.Replace("Pservers", servers.Remove(servers.Length - 2)); code = code.Replace("Ptypes", types.Remove(types.Length - 2)); code = code.Replace("Pcount", Requests.Count.ToString()); code = BotTextHelper.SmileCodesReplace(code, SocialNetworkType.VK); code = HttpUtility.UrlEncode(code); //генерим контент для пост запроса string data = "code=" + code + "&access_token=" + _token + "&v=5.53"; StringContent parametrs = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded"); //вызываем метод, параметром которого является скрипт, который выполнится на строне vk.com без лимитов (почти) url = $"https://api.vk.com/method/execute"; using (var client = new HttpClient()) { using (var r = await client.PostAsync(new Uri(url), parametrs)) { responce = r; responceString = await r.Content.ReadAsStringAsync(); if (responceString.Contains("error")) { IsError = 1; Logging.Logger.Error($"VK Api Execute: NOT OK {responceString}, data {data}"); } } } return(IsError); }