Загрузка...

Простейший бот для Телеги [C#]

Тема в разделе C# создана пользователем Falweek 21 июл 2018. 647 просмотров

Загрузка...
  1. Falweek
    Falweek Автор темы 21 июл 2018 Купил как то раз мужик шляпу, а она ему как раз 14 12 июн 2017
    Начал изучать C# и решил попробовать написать простенького бота для Телеги. Решил поделиться, вдруг кому то пригодится, для тех, кто начинает
    P.S Как только разберусь с InLine Кнопками, могу добавить, если кому то интересно будет

    Что нам необходимо : Библиотека Newtonsoft.Json (Проект - Управление пакетами Nuget -- там в поиск ****аете )

    Объявляем переменные:

    Код

    int update_id = 0; // Для сообщений
    int count = 0; // Уровень тупости ( писал для друзей, это не обязательно)
    string messageFromId = ""; // ID отправителя
    string messageText = ""; // Текст сообщения для бота
    string token = ""; // Токен Вашего бота
    Так как РКН блокирует все сервисы Телеграмма, а нам необходимо будет отправлять запросы и скачивать строку, то необходимы ******. Тут все просто

    Код

    WebClient webClient = new WebClient(); // Собсна сам клиент, который все и будет делать
    webClient.Proxy = new WebProxy("Любой айпишник валидного ******. Я юзал https");
    Далее еще одна переменная, в которой по сути указан просто адрес нашего бота :

    Код
    string startUrl = $"https://api.telegram.org/bot{token}";
    Затем бесконечный цикл (while (true)), в котором пишем следующее :

    Код

    Thread.Sleep(100); // Что б не было спама
    string url = $"{startUrl}/getUpdates?offset={update_id + 1}"; // прибавляем к id сообщения +1, чтоб считалось прочитанным
    string response = webClient.DownloadString(url); // Скачиваем строку с ответом, которую мы получили при запросе на url
    var arr = JObject.Parse(response)["result"].ToArray(); // json массив (если можно так назвать?), в котором хранятся сообщения
    После этого, создаем еще один цикл перебора по нашему массиву с ответами


    Код
     foreach (var message in arr) // logic

    {
    string s1 = Convert.ToString(message["update_id"]);
    update_id = Convert.ToInt32(s1);
    Затем идет конструкция try ... catch в которую мы пишем следующее :


    Код
     try

    {

    messageFromId = message["message"]["from"]["id"].ToString();
    Console.WriteLine($"{update_id} {messageFromId} {messageText}");
    string userMessage = message["message"]["text"].ToString();

    if (userMessage == "Тут Ваша команда")
    {
    // Ответ для пользователя
    var whoispidorname = message["message"]["from"]["first_name"].ToString(); // Тут мы получаем Имя пользователя
    var whoispidorlastname = message["message"]["from"]["last_name"].ToString(); // Фамилию
    messageText += whoispidorname + whoispidorlastname; // Сам текст сообщения, который отправит бот
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}"; // Запрос
    webClient.DownloadString(url); // Загрузка запроса
    messageText = ""; // Делаем переменную пустую

    }
    Другой пример
    Код
    else if (userMessage == "")

    {
    messageText += ""; // Ваше сообщения для юзера
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    }
    Так как наш бот умеет принимать только текст, а остальное нам надо как то просто обработать и не крашануться, то тут используем catch :

    Код
    catch (System.NullReferenceException) 

    {

    messageText += "Something"; // Текст сообщения
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    Вот и все. Повторюсь, только начинаю, если кто - чего подскажет, буду благодарен.
    Полный код

    Код
     static void Main(string[] args)

    {

    int update_id = 0; // for message
    int count = 0; // this count of the level of stupidity
    string messageFromId = ""; // id user from got message
    string messageText = ""; // text messag
    string token = ""; // token your bot


    WebClient webClient = new WebClient();
    webClient.Proxy = new WebProxy("199.195.251.143:03128");
    string startUrl = $"https://api.telegram.org/bot{token}"; // start
    while (true)
    {

    Thread.Sleep(100); // for antispam
    string url = $"{startUrl}/getUpdates?offset={update_id + 1}"; // i am do +1 for the message has been read
    string response = webClient.DownloadString(url); // download string

    var arr = JObject.Parse(response)["result"].ToArray(); // this array of all message

    foreach (var message in arr) // logic
    {
    string s1 = Convert.ToString(message["update_id"]); // id message
    update_id = Convert.ToInt32(s1); // convert
    try
    {

    messageFromId = message["message"]["from"]["id"].ToString();
    Console.WriteLine($"{update_id} {messageFromId} {messageText}");
    string userMessage = message["message"]["text"].ToString();

    if (userMessage == "?") // any command
    {
    //its response for users command
    var whoispidorname = message["message"]["from"]["first_name"].ToString();
    var whoispidorlastname = message["message"]["from"]["last_name"].ToString();
    messageText += whoispidorname + whoispidorlastname;
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";

    }
    // the same
    else if (userMessage == "")
    {
    messageText += ""; // text message for users
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    }
    //something
    else if (userMessage == "")
    {
    messageText += "somethingTextForUsers";
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    }

    else
    {
    messageText += "Введите команду\nВведите слово Команды, если не знакомы со списком команд";
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";

    }
    }
    catch (System.NullReferenceException) // The bot is broken when you receive something, in addition to the text
    {
    if (count < 3)
    {
    messageText += "Something";
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    count++;
    }
    else if (count == 3)
    {
    messageText += "Something";
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    count++;
    }
    else if(count > 3)
    {
    messageText += "Something";
    url = $"{startUrl}/sendMessage?chat_id={messageFromId}&text={messageText}";
    webClient.DownloadString(url);
    messageText = "";
    }
    }
    }
    }
    }
     
    21 июл 2018 Изменено
  2. nsmk_inactive95033
    nsmk_inactive95033 21 июл 2018 Заблокирован(а) 182 19 мар 2017
    ебать
    whoispidorlastname
    :D
     
  3. DiLittle228
    DiLittle228 21 июл 2018 No Problem, DUDE 4 8 мар 2018
    Бот годный. Надо попробовать
     
  4. Falweek
    Falweek Автор темы 21 июл 2018 Купил как то раз мужик шляпу, а она ему как раз 14 12 июн 2017
    Да я просто для друзей писал, а там выводило, кто пидор, поэтому так и назвал переменную :D
     
  5. Allkatraz
    Allkatraz 26 июл 2018 0 29 июн 2018
  6. Allkatraz
    Allkatraz 26 июл 2018 0 29 июн 2018
    Я отправлю себе в лс. Т.е. в messageFromId должен быть мой id моего акка в телеге?
     
  7. Falweek
    Falweek Автор темы 26 июл 2018 Купил как то раз мужик шляпу, а она ему как раз 14 12 июн 2017
    Там показывает id последнего человека, который отправил сообщение боту. То есть, если ты отправил боту сообщение, то id будет твой, если друг, то id твоего друга
     
  8. Allkatraz
    Allkatraz 27 июл 2018 0 29 июн 2018
    Я хочу сделать обычную отправку сообщения ботом себе в лс. Сам запрос правильный http://prntscr.com/kboe1t . В чем тогда проблема?
    Код
    string MyID = "XXXXXX";
    string messageText = "Test";
    string token = "XXXXXXXXX;
    WebClient webClient = new WebClient();
    webClient.Proxy = new WebProxy("138.197.157.68:8080");
    string startUrl = $"https://api.telegram.org/bot{token}";
    string url = $"{startUrl}/sendMessage?chat_id={MyID}&text={messageText}";
    webClient.DownloadString(url);
     
Top