@drnkwtr
forblitz.ru dev

Перезапуск скрипта после вылета?

Добрый день. Столкнулся с такой проблемой, что очень часто прилетают ошибки с VKApi, вследствие чего бот ломается. При этом, из-за наличия двух циклов, сделать в самом начале while True: не получается, ибо бот входит в бесконечный цикл. Как сделать так, чтобы бот перезапускался после падения автоматически? Спасибо заранее.

# -*- coding: utf-8 -*-

import vk_api
import vk 
import time
import json
import urllib.request
import requests

token = "-"
token_user = "-"

welcome = 
start = 

session = vk.Session(access_token=token_user)
api = vk.API(session ,v='5.92', lang='ru')

vk = vk_api.VkApi(token=token)

def get_button(label, color, payload=""):
    return {
        "action:": {
            "type": "text",
            "payload": json.dumps(payload),
            "label": label
        },
        "color": color
    }

keyboard = {
   "one_time": False,
   "buttons":[
      [
         {
            "action":{
               "type":"open_link",
               "label":"Перейти на сайт forblitz.ru",
               "link":"https://forblitz.ru/"
            },
         },
      ],
            [
         {
            "action":{
               "type":"open_link",
               "label":"Приложение ForBlitz для Android",
               "link":"https://forblitz.ru/app/"
            },
         },
      ],
                  [
         {
            "action":{
               "type":"text",
               "label":"Установка и удаление"
            },
            "color":"positive"
         },
         {
            "action":{
               "type":"text",
               "label":"Список модов"
            },
            "color":"secondary"
         }
      ],
                  [
         {
            "action":{
               "type":"text",
               "label":"Заказать мод"
            },
            "color":"secondary"
         },
         {
            "action":{
               "type":"text",
               "label":"Мод не работает"
            },
            "color":"secondary"
         }
      ],
            [
         {
            "action":{
               "type":"open_app",
               "app_id": 5748831,
               "label":"Рассылка",
               "owner_id":-116432643
                     },
         },
         {
            "action":{
               "type":"text",
               "label":"Позвать человека"
            },
            "color":"negative"
         }
      ],
        [       {
            "action":{
               "type":"text",
               "label":"Статус работы приложения и сайта",
                     },
            "color":"primary"
         },
   ]
   ]
}

keyboard = json.dumps(keyboard, ensure_ascii=False).encode('utf-8')
keyboard = str(keyboard.decode('utf-8'))

while True:
        messages = vk.method("messages.getConversations", {"offset": 0, "count": 20, "filter": "unanswered"}) #получение всех бесед бота
        if messages["count"] >= 1:
            id = messages["items"][0]["last_message"]["from_id"]
            body = messages["items"][0]["last_message"]["text"]
            if body == "Привет":
                vk.method("messages.send", {"peer_id": id, "message": welcome, "random_id": 0})
            elif body == "Начать":
                vk.method("messages.send", {"peer_id": id, "message": start, "keyboard": keyboard, "random_id": 0})
            elif body == "Установка и удаление":
                vk.method("messages.send", {"peer_id": id, "message": install_and_remove, "random_id": 0})
            elif body == "Список модов":
                vk.method("messages.send", {"peer_id": id, "message": mod_list, "random_id": 0})
            elif body == "Заказать мод":
                vk.method("messages.send", {"peer_id": id, "message": mod_order, "random_id": 0})
            elif body == "Мод не работает":
                vk.method("messages.send", {"peer_id": id, "message": mod_not_working, "random_id": 0})
            elif body == "Статус работы приложения и сайта":
                vk.method("messages.send", {"peer_id": id, "message": "Статус работы приложения указан в статусе сообщества и обновляется каждые 30 минут.", "random_id": 0})
            elif body == "Позвать человека":
                vk.method("messages.send", {"peer_id": id, "message": call_human, "random_id": 0})
        time.sleep(1) #задержка перед ответом бота (в секундах)
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Python
software engineer
правильно юзать try
Ответ написан
XXXXPro
@XXXXPro
Fullstack Web developer
Если дело происходит под Linux, то написать соответствующий unit для systemd:
[Unit]
Description=Your Daemon
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Restart=on-failure
RestartSec=10s

ExecStart=/usr/bin/python3  /path/to/script

Под Windows тоже можно прописать скрипт как службу с возможностью рестарта в случае падения.

Ну и как совершенно правильно выше заметил Saboteur, чтобы скрипт не падал от ошибок, нужно использовать try/except.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы