Поднимаем телеграм бота через прокси
Проблема
Проблема простая - телеграм заблокирован, а бота поднять нужно. Возможно это нужно сделать на виртуальном сервере или на Raspberry Pi - без разницы, проделывать нужно будет примерно одинаковые шаги:
- установить tor и прокси (в данном случае privoxy)
- задать необходимые конфигурации
- настроить и запустить бота
Установка и конфигурация
Устанавливаем tor и pivoxy. На Ubuntu это делается просто.
1
2
$ apt install tor
$ apt install privoxy
Далее нужно залезть в конфигурации tor /etc/tor/torrc и раскомментировать следующую строку.
1
2
SOCKSPort 127.0.0.1:9050
# SOCKSPolicy accept
Задать следующие конфигурации pivoxy в файле /etc/privoxy/config.
1
2
listen-address 127.0.0.1:8118
forward-socks5t / localhost:9050 .
Перезапустить сервисы.
1
2
$ sudo service privoxy restart
$ sudo service tor restart
Убедиться, что открыты сконфигурированные порты для tor и privoxy.
1
2
3
4
5
6
$ sudo netstat -tlnp | grep tor
tcp 0 0 127.0.0.1:9050 0.0.0.0:* LISTEN 2279/tor
tcp 0 0 127.0.0.1:9051 0.0.0.0:* LISTEN 2279/tor
$ sudo netstat -tlnp | grep privoxy
tcp 0 0 127.0.0.1:8118 0.0.0.0:* LISTEN 2306/privoxy
tcp6 0 0 ::1:8118 :::* LISTEN 2306/privoxy
Проверка работоспособности
Сначала проверим работоспособность на curl. Задаем переменные окружения:
1
2
$ export http_proxy=http://localhost:8118/
$ export https_proxy=$http_proxy
Делаем запрос и видим, что подключение есть.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ curl -i -X GET https://api.telegram.org/bot<token>/getMe
HTTP/1.1 200 Connection established
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Sat, 11 Jan 2020 18:21:24 GMT
Content-Type: application/json
Content-Length: 107
Connection: keep-alive
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Expose-Headers: Content-Length,Content-Type,Date,Server,Connection
{"ok":true,"result":{"id":458886928,"is_bot":true,"first_name":"bot","username":"Bot"}}
Поднимаем бота
Здесь все зависит от того на каком языке и с применением каких библиотек вы делаете бота. В моем случае, на scala опциональное использование прокси выглядит примерно следующим образом.
1
2
3
4
5
6
7
8
9
10
11
object Application extends App
{
val bot = if (proxyStatus == "enable") {
new TgProxyBot(token, host, port)
} else {
new TgBot(token)
}
bot.run()
// ...
}