Как заставить webhooks работать с nginx + gunicorn + django + pytelegrambotapi - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь развернуть бота telegram (usign pyTelegramBotApi) на django, используя nginx + gunicorn.У меня уже есть fomain и Let's Encrypt cert для него, https работает и страницы, представленные django, доступны.Но я понятия не имею, почему бот не получает никаких данных.Я что-то не так делаю на этапе развертывания?

Представление Django для работы с веб-хоками:

def telegram(request):
    if request.method == 'POST':
        json_string = request.POST.get()
        update = telebot.types.Update.de_json(json_string)
        bot.process_new_updates([update])
    return HttpResponse('')


def set_hook(request):
    bot.remove_webhook()
    bot.set_webhook(url='https://<my domain>.tk/bot{}'.format(API_TOKEN))
    return HttpResponse('')

Конфигурация nginx:

server {
    server_name <my domain>.tk www.<my domain>.tk default_server;
    listen 80;

    return 301 https://<my domain>.tk;
}

server {
    server_name www.<my domain>.tk;
    listen 443 ssl http2;

    ssl_certificate /etc/letsencrypt/live/<my domain>.tk/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<my domain>.tk/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/<my domain>.tk/chain.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=31536000";

    return 301 https://<my domain>.tk$request_uri;
}

server {

    server_name <my domain>.tk;
    listen 443 ssl http2;

    ssl_certificate /etc/letsencrypt/live/<my domain>.tk/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<my domain>.tk/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/<my domain>.tk/chain.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=31536000";

    add_header X-Frame-Options "SAMEORIGIN";

    location /.well-known {
        root /var/www/html; # Понадобится для letsencrypt
    }

    location = /favicon.ico {
        alias /home/ubuntu/<my domain>/static/favicon.ico;
    }
    location = /robots.txt {
        alias /home/ubuntu/<my domain>/static/robots.txt;
    }

    location /static/ {
        root /home/ubuntu/<my domain>/;
    }
    location /media/ {
        root /home/ubuntu/<my domain>/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/<my domain>/socket.sock;
    }
}

Служба GUnicorn conf:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/<my domain>/
ExecStart=/home/ubuntu/<my domain>/venv/bin/gunicorn --access-logfile - --error-logfile error.log --workers 2 --bind unix:/home/ubuntu/<my domain>/socket.sock fri_weekend_bot.wsgi:application

[Install]
WantedBy=multi-user.target

1 Ответ

0 голосов
/ 23 апреля 2019

Моя проблема заключалась в том, чтобы прятаться внутри части Джанго.По умолчанию все представления django требуют авторизации CSRF.Все, что мне нужно было сделать, это поместить декоратор @csrf_exempt в представление telegram (), чтобы избежать этого.

@csrf_exempt
def telegram(request):
    if request.method == 'POST':
        json_string = json.dumps(json.loads(request.body))
        update = telebot.types.Update.de_json(json_string)
        bot.process_new_updates([update])
    return HttpResponse('')
...