Proxy setup¶
In some locations Telegram Bots API urls will be unavailable. In this case all examples will just throw exception like:
Exception in thread "main" java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at io.ktor.network.sockets.SocketImpl.connect$ktor_network(SocketImpl.kt:36)
at io.ktor.network.sockets.SocketImpl$connect$1.invokeSuspend(SocketImpl.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
Process finished with exit code 1
There are several ways to solve this problem:
- Built-in proxy config (will require some socks or http proxy server)
- System-configured VPN or proxy
- Your own Bot API Server
Using Ktor Client built-in proxy¶
First of all, you will need to use one more library:
build.gradle:
Dependency note
In the snippet above was used version 2.3.5
which is actual for TelegramBotAPI
at the moment of filling this documentation (october 11 2023
, TelegramBotAPI
version 9.2.2
) and you can update version of this dependency in case if it is outdated.
For configuring proxy for your bot inside your program, you can use next snippet:
val botToken = "HERE MUST BE YOUR TOKEN" // (1)
val bot = telegramBot(botToken) { // (2)
client = HttpClient(OkHttp) { // (3)
engine { // (4)
config { // (5)
proxy( // (6)
Proxy( // (7)
Proxy.Type.SOCKS, // (8)
InetSocketAddress("127.0.0.1", 1080) // (9)
)
)
}
}
}
}
- Here we are just creating variable
botToken
- Start creating bot
- Setting
HttpClient
of our bot. On the time of documentation filling,OkHttp
is one of the engines inKtor
system which supports socks proxy. More you can read on Ktor site in subparts about engines and proxy - Start setting up of
HttpClient
engine - Start setting up of
HttpClient
engine configuration - Start setting up of proxy
- Creating proxy info object
- Saying that it is
Socks
proxy - Creating address. Note that
"127.0.0.1"
and1080
are configurable parameters
More complex and flexible variant¶
You may try to use custom engine for ktor. For example:
// JVM
// OkHttp engine
// Socks5 proxy
val bot = telegramBot(botToken) {
val proxyHost = "your proxy host"
val proxyPort = 1080 //your proxy port
val username = "proxy username"
val password = "proxy password"
val proxyAddr = InetSocketAddress(proxyHost, proxyPort)
val proxy = Proxy(Proxy.Type.SOCKS, proxyAddr)
Authenticator.setDefault(object : Authenticator() {
protected val passwordAuthentication: PasswordAuthentication?
protected get() {
if (requestingHost.lowercase() == proxyHost.lowercase()) {
if (proxyPort == requestingPort) {
return PasswordAuthentication(username, password.toCharArray())
}
}
return null
}
})
this.client = HttpClient(OkHttp) {
engine {
config {
proxy(proxy)
}
}
}
}