PDA

Просмотр полной версии : Учим Телеграм бота обходить блокировку


Se1dhe
17.03.2019, 20:31
Все уже давно в курсе, что РКН пытается блочить ТГ на территории РФ. Сам клиент заблочить у них пока так и не получилось, а вот боты работать перестают.

Тут мы научим нашего бота работать через 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

org
.
telegram

telegrambots
-
abilities

4.1
.2

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
17.03.2019, 20:36
а размещать бота за пределами РФ?

Se1dhe
17.03.2019, 20:40
Дак никто не запрещает. Это один из вариантов обхода.

gattsu
17.03.2019, 20:46
даже у бота скрыт ip

скрыл ip?

Se1dhe
17.03.2019, 20:50
Для халявщиков можно дописать регистрацию бота с анонимным прокси. Парсим список открытых прокси ->пишем куда-нить -> при реге бота перебираем живые.

Bloomfield
17.03.2019, 22:58
Можно сделать еще проще, с помощью nginx сделать proxy_pass до api.telegram.org, хост, естественно указать свой (alert.example.com) и отправлять все пакеты туда.

Когда первый раз пытался обойти блокировку с помощью прокси, оказалось, что интернет-провайдер ЦОДа блокирует все заголовки (в том числе и которые отправляются с помощью прокси). Как говорится - пришлось импровизировать.

Se1dhe
17.03.2019, 23:06
Можно сделать еще проще, с помощью nginx сделать proxy_pass до api.telegram.org, хост, естественно указать свой (alert.example.com) и отправлять все пакеты туда.
Когда первый раз пытался обойти блокировку с помощью прокси, оказалось, что интернет-провайдер ЦОДа блокирует все заголовки (в том числе и которые отправляются с помощью прокси). Как говорится - пришлось импровизировать.


Мне было проще реализовать это программно, т.к. боты стоят у клиентов на разных серверах.

Bloomfield
17.03.2019, 23:13
Мне было проще реализовать это программно, т.к. боты стоят у клиентов на разных серверах.


А если будет ситуация такая как у меня (блокировка в заголовке) встречается, кстати - довольно часто, по этой причине пришлось поднимать общий сервер для всех проектов - что будете делать? Просто праздное любопытство, не более.

Se1dhe
18.03.2019, 00:14
А если будет ситуация такая как у меня (блокировка в заголовке) встречается, кстати - довольно часто, по этой причине пришлось поднимать общий сервер для всех проектов - что будете делать? Просто праздное любопытство, не более.


Ну если столкнусь, там и посмотрим. За все время с момента блокировки - не сталкивался. Да и тема была создана в ознакомительных целях, т.к. в и в иннете, и лично у меня люди интересовались несколько раз о программном методе обхода блокировки. А, и да, описаный вами вариант о поднятии посредника это один большой костыль, т.к. бот имеет свойство отваливаться из-за таймаута.

Bloomfield
18.03.2019, 00:24
Ну если столкнусь, там и посмотрим. За все время с момента блокировки - не сталкивался. Да и тема была создана в ознакомительных целях, т.к. в и в иннете, и лично у меня люди интересовались несколько раз о программном методе обхода блокировки. А, и да, описаный вами вариант о поднятии посредника это один большой костыль, т.к. бот имеет свойство отваливаться из-за таймаута.


Ни разу не отваливался, работает идеально Костыль - да, зато не нужно бегать менять прокси.

Se1dhe
18.03.2019, 00:27
Ни разу не отваливался, работает идеально Костыль - да, зато не нужно бегать менять прокси.


а его никто не заставляет менять) Или 1$ жалко ?)

Bloomfield
18.03.2019, 00:50
а его никто не заставляет менять) Или 1$ жалко ?)


Если у нас есть где nginx ткнуть, то естественно там стоит и прокси, но - как я сказал выше - такой вариант не сработал.