Пост

Поднимаем телеграм бота через прокси

Проблема

Проблема простая - телеграм заблокирован, а бота поднять нужно. Возможно это нужно сделать на виртуальном сервере или на 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()
  // ...
}
Авторский пост защищен лицензией CC BY 4.0 .

© Ainur. Некоторые права защищены.

Использует тему Chirpy для Jekyll