Статья Создание Telegram бота с обходом блокировки в РФ (C#)

Irval

Главный Модератор
Главный Модератор

Irval

Главный Модератор
Главный Модератор
Статус
Оффлайн
Регистрация
31 Май 2019
Сообщения
245
Реакции
84
Доброго времени суток
После моей недавней темы о создании бота для Telegram на C# (клик) несколько человек писали мне в лс с вопросом об обходе блокировки Telegram на территории РФ без использования VPN или покупных прокси. Итак я решил помочь всем тем, кто не хочет покупать дорогие сервера в другие странах или использовать платный VPN/прокси.

Для реализации данной функции нам понадобится библиотека из прошлой темы - Telegram.Bot для .Net. Установить ее можно с помощью менеджера пакетов NuGet или же другим удобным для вас методом. Официальный репозиторий на GitHub -
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Также понадобится библиотека Regex для работы с регулярными выражениями и успешного парсинга нужных нам прокси. Устанавливать ее не нужно, так как она уже включена в фреймворк.

Вы можете модифицировать уже существующий код или же использовать предложенный мною:

C#:
class Program
    {
        private static StringBuilder builder = new StringBuilder();
        static TelegramBotClient bot;

        static void Main(string[] args)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            var url = new Uri("[URL]https://top-proxies.ru/free_proxy/fre_proxy_api.php[/URL]"); // Ваш url
            ParseProxy(url);
            Console.WriteLine("Перебор прокси");
            while (!TestProxy(builder.ToString()))
            {
                ParseProxy(url);
                Console.WriteLine("Прокси сервер не отвечает: " + builder);
            }
            Console.WriteLine("Прокси найден: " + builder);
            var spl = builder.ToString().Split(':');

            var proxy = new WebProxy(new Uri($"http://{spl[0]}:{spl[1]}/"), true);

            bot = new TelegramBotClient("токен", proxy);

            Console.WriteLine("Прокси запущен!");

            bot.OnMessage += MessageReceived;

            var me = bot.GetMeAsync().Result;
            Console.WriteLine(me.FirstName);

            bot.StartReceiving();
            Console.ReadLine();
            bot.StopReceiving();
        }

        static bool TestProxy(string host)
        {
            Ping ping = new Ping();

            try
            {
                PingReply reply = ping.Send(host.Split(':')[0], 2000);
                if (reply == null) return false;

                return (reply.Status == IPStatus.Success);
            }
            catch (PingException e)
            {
                Console.WriteLine("Прокси не прошел проверку!\n"+e.ToString());
                return false;
            }
        }

        private static void MessageReceived(object sender, Telegram.Bot.Args.MessageEventArgs e)
        {
            try
            {
                var Message = e.Message;
                string name = Message.From.FirstName;
                Console.WriteLine($"{name} отправил сообщение: '{Message.Text}'");
                switch (Message.Text)
                {
                    case "/start":
                        bot.SendTextMessageAsync(e.Message.Chat.Id, $"Привет, {name}!");
                        break;
                    default:
                        bot.SendTextMessageAsync(e.Message.Chat.Id, "Команда не распознана!");
                        break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Во время выполнения кода произошла ошибка:\n{ex}");
            }
        }

        public static void ParseProxy(Uri uri)
        {
            string pattern = @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,6}";
            using (var wc = new WebClient())
            {
                wc.Encoding = Encoding.UTF8;
                var regex = new Regex(pattern);
                Match match = regex.Match(wc.DownloadString(uri));
                while (match.Success)
                {
                    builder = new StringBuilder();
                    builder.Append(match.Value);
                    break;
                }
            }
        }
    }
Подробного объяснения код не требует, так как он достаточно прост, и если вам что-то непонятно или же возникают какие-либо ошибки во время его выполнения - можете отписать в тему, постараюсь помочь :hi:. Также не забывайте изменить токен бота, чтобы все успешно работало. Можете сменить url сайта, с которого идет парсинг прокси, главное, чтобы они находились в формате ip:port.
 
Последнее редактирование:
Сверху