Учим Телеграм бота обходить блокировку

Se1dhe

Интересующийся
Участник
Сообщения
87
Розыгрыши
0
Репутация
-5
Реакции
34
Баллы
394
Все уже давно в курсе, что РКН пытается блочить ТГ на территории РФ. Сам клиент заблочить у них пока так и не получилось, а вот боты работать перестают.

Тут мы научим нашего бота работать через http proxy. Отдельное спасибо человеку с ником "Vyacheslav @bvn13"


Тело нашего пустого бота:

Java:
public class MyBot extends AbilityBot {

    protected MyBot(String botToken, String botUsername) {
        super(botToken, botUsername);
    }

    public int creatorId() {
        return 0;
    }

    public Ability hello() {
        return Ability.builder()
                .name("test")
                .info("hello bot")
                .locality(ALL)
                .privacy(PUBLIC)
                .action(ctx -> silent.send("hello!", ctx.chatId()))
                .build();
    }
}
Регистрация и его запуск:


Java:
public class Main {

    private static String BOT_NAME = "My test bot";
    private static String BOT_TOKEN = "..." /* your bot's token here */;


    public static void main(String[] args) {
        try {

            ApiContextInitializer.init();

            // Create the TelegramBotsApi object to register your bots
            TelegramBotsApi botsApi = new TelegramBotsApi();

            // Register your newly created AbilityBot
            MyBot bot = new MyBot(BOT_TOKEN, BOT_NAME);

            botsApi.registerBot(bot);

        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}
Подключаем зависимость:
Java:
Maven
  <!--TelegramAPI-->
    <dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots-abilities</artifactId>
        <version>4.1.2</version>
    </dependency>
Gradle
  // telegram bot api
    compile 'org.telegram:telegrambots:3.6.1'
Дальше пример реализации классов

В классе бота:
Java:
public class MyBot extends AbilityBot {

    protected MyBot(String botToken, String botUsername, DefaultBotOptions options) {
        super(botToken, botUsername, options);
    }
  
    /* ... */
  
}
В регистрации, если прокся без авторизации:

Java:
public class Main {

    private static String BOT_NAME = "My test bot";
    private static String BOT_TOKEN = "..." /* your bot's token here */;

    private static String PROXY_HOST = "..." /* proxy host */;
    private static Integer PROXY_PORT = 3128 /* proxy port */;

    public static void main(String[] args) {
        try {
          
              ApiContextInitializer.init();
            // Create the TelegramBotsApi object to register your bots
            TelegramBotsApi botsApi = new TelegramBotsApi();

            // Set up Http proxy
            DefaultBotOptions botOptions = ApiContext.getInstance(DefaultBotOptions.class);

            HttpHost httpHost = new HttpHost(PROXY_HOST, PROXY_PORT);

            RequestConfig requestConfig = RequestConfig.custom().setProxy(httpHost).setAuthenticationEnabled(false).build();
            botOptions.setRequestConfig(requestConfig);
            botOptions.setHttpProxy(httpHost);

            // Register your newly created AbilityBot
            MyBot bot = new MyBot(BOT_TOKEN, BOT_NAME, botOptions);

            botsApi.registerBot(bot);

        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}
С авторизацией:

Java:
public class Main {

    private static String BOT_NAME = "My test bot";
    private static String BOT_TOKEN = "..." /* your bot's token here */;

    private static String PROXY_HOST = "..." /* proxy host */;
    private static Integer PROXY_PORT = 3128 /* proxy port */;
    private static String PROXY_USER = "..." /* proxy user */;
    private static String PROXY_PASSWORD = "..." /* proxy password */;

    public static void main(String[] args) {
        try {

            ApiContextInitializer.init();

            // Create the TelegramBotsApi object to register your bots
            TelegramBotsApi botsApi = new TelegramBotsApi();

            // Set up Http proxy
            DefaultBotOptions botOptions = ApiContext.getInstance(DefaultBotOptions.class);

            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    new AuthScope(PROXY_HOST, PROXY_PORT),
                    new UsernamePasswordCredentials(PROXY_USER, PROXY_PASSWORD));

            HttpHost httpHost = new HttpHost(PROXY_HOST, PROXY_PORT);

            RequestConfig requestConfig = RequestConfig.custom().setProxy(httpHost).setAuthenticationEnabled(true).build();
            botOptions.setRequestConfig(requestConfig);
            botOptions.setCredentialsProvider(credsProvider);
            botOptions.setHttpProxy(httpHost);

            // Register your newly created AbilityBot
            MyBot bot = new MyBot(BOT_TOKEN, BOT_NAME, botOptions);

            botsApi.registerBot(bot);

        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}

Ну, собсно, все.
 
Последнее редактирование модератором:

gattsu

Поклонник кармы
Проверенный
Сообщения
178
Розыгрыши
0
Репутация
1 460
Реакции
312
Баллы
706
а размещать бота за пределами РФ?
 

Se1dhe

Интересующийся
Участник
Сообщения
87
Розыгрыши
0
Репутация
-5
Реакции
34
Баллы
394
Дак никто не запрещает. Это один из вариантов обхода.
 

gattsu

Поклонник кармы
Проверенный
Сообщения
178
Розыгрыши
0
Репутация
1 460
Реакции
312
Баллы
706
даже у бота скрыт ip

скрыл ip?
 

Se1dhe

Интересующийся
Участник
Сообщения
87
Розыгрыши
0
Репутация
-5
Реакции
34
Баллы
394
Для халявщиков можно дописать регистрацию бота с анонимным прокси. Парсим список открытых прокси ->пишем куда-нить -> при реге бота перебираем живые.
 

Bloomfield

Поклонник кармы
Местный
Сообщения
507
Розыгрыши
0
Репутация
1 332
Реакции
191
Баллы
709
Можно сделать еще проще, с помощью nginx сделать proxy_pass до api.telegram.org, хост, естественно указать свой (alert.example.com) и отправлять все пакеты туда.
Когда первый раз пытался обойти блокировку с помощью прокси, оказалось, что интернет-провайдер ЦОДа блокирует все заголовки (в том числе и которые отправляются с помощью прокси). Как говорится - пришлось импровизировать.
 
  • Мне нравится
Реакции: kick

Se1dhe

Интересующийся
Участник
Сообщения
87
Розыгрыши
0
Репутация
-5
Реакции
34
Баллы
394
Можно сделать еще проще, с помощью nginx сделать proxy_pass до api.telegram.org, хост, естественно указать свой (alert.example.com) и отправлять все пакеты туда.
Когда первый раз пытался обойти блокировку с помощью прокси, оказалось, что интернет-провайдер ЦОДа блокирует все заголовки (в том числе и которые отправляются с помощью прокси). Как говорится - пришлось импровизировать.
Мне было проще реализовать это программно, т.к. боты стоят у клиентов на разных серверах.
 

Bloomfield

Поклонник кармы
Местный
Сообщения
507
Розыгрыши
0
Репутация
1 332
Реакции
191
Баллы
709
Мне было проще реализовать это программно, т.к. боты стоят у клиентов на разных серверах.
А если будет ситуация такая как у меня (блокировка в заголовке) встречается, кстати - довольно часто, по этой причине пришлось поднимать общий сервер для всех проектов - что будете делать? Просто праздное любопытство, не более.
 

Se1dhe

Интересующийся
Участник
Сообщения
87
Розыгрыши
0
Репутация
-5
Реакции
34
Баллы
394
А если будет ситуация такая как у меня (блокировка в заголовке) встречается, кстати - довольно часто, по этой причине пришлось поднимать общий сервер для всех проектов - что будете делать? Просто праздное любопытство, не более.
Ну если столкнусь, там и посмотрим. За все время с момента блокировки - не сталкивался. Да и тема была создана в ознакомительных целях, т.к. в и в иннете, и лично у меня люди интересовались несколько раз о программном методе обхода блокировки. А, и да, описаный вами вариант о поднятии посредника это один большой костыль, т.к. бот имеет свойство отваливаться из-за таймаута.
 

Bloomfield

Поклонник кармы
Местный
Сообщения
507
Розыгрыши
0
Репутация
1 332
Реакции
191
Баллы
709
Ну если столкнусь, там и посмотрим. За все время с момента блокировки - не сталкивался. Да и тема была создана в ознакомительных целях, т.к. в и в иннете, и лично у меня люди интересовались несколько раз о программном методе обхода блокировки. А, и да, описаный вами вариант о поднятии посредника это один большой костыль, т.к. бот имеет свойство отваливаться из-за таймаута.
Ни разу не отваливался, работает идеально :) Костыль - да, зато не нужно бегать менять прокси.
 

Se1dhe

Интересующийся
Участник
Сообщения
87
Розыгрыши
0
Репутация
-5
Реакции
34
Баллы
394

Bloomfield

Поклонник кармы
Местный
Сообщения
507
Розыгрыши
0
Репутация
1 332
Реакции
191
Баллы
709
а его никто не заставляет менять) Или 1$ жалко ?)
Если у нас есть где nginx ткнуть, то естественно там стоит и прокси, но - как я сказал выше - такой вариант не сработал.
 
Сверху Снизу