Python Slack bot не имеет права отправлять сообщения в канал только при запуске из Crontab

#python #linux #cron #slack #slack-api

#python #linux #cron #slack #slack-api

Вопрос:

Я успешно настроил Slack-бота для отправки сообщений по определенным общедоступным каналам. Однако он просто отказывается работать с crontab Linux из-за того, что, по-видимому, является несанкционированным (несмотря на то, что он авторизован при запуске вне crontab)

Для целей тестирования я настроил очень простой скрипт barebones:

 import sys
import os
from slack.web.client import WebClient

sys.stderr = open("slackbot_errorinfo.txt", "w")
sys.stout = open("slackbot_output.txt", "w")

print("Slackbot test printed info")
slack_client = WebClient(os.environ.get("SLACK_BOT_TOKEN"))
response = slack_client.chat_postMessage(channel="testing", text="slackbot test message")
print(response)

 

Когда я выполняю этот скрипт непосредственно в терминале, сообщение успешно доставляется на желаемый канал slack. Например, вот так:

 python3 /home/Username/Desktop/slacktest.py
 

Однако затем я тестирую, используя ту же самую команду в crontab, например :

 33 12 03 01 * python3 /home/Username/Desktop/slacktest.py
 

В приведенном выше случае сообщение не доставляется, и я получаю следующую ошибку в "slackbot_errorinfo.txt" стандартном файле ошибок:

 "/home/Username/Desktop/slacktest.py", line 10, in <module>
    response = slack_client.chat_postMessage(channel="testing", text="slackbot test message")   File
"/home/Username/.local/lib/python3.6/site-packages/slack/web/client.py",
line 1077, in chat_postMessage
    return self.api_call("chat.postMessage", json=kwargs)   File "/home/Username/.local/lib/python3.6/site-packages/slack/web/base_client.py",
line 150, in api_call
    return self._sync_send(api_url=api_url, req_args=req_args)   File "/home/Username/.local/lib/python3.6/site-packages/slack/web/base_client.py",
line 248, in _sync_send
    additional_headers=headers,   File "/home/Username/.local/lib/python3.6/site-packages/slack/web/base_client.py",
line 377, in _urllib_api_call
    use_sync_aiohttp=False,   File "/home/Username/.local/lib/python3.6/site-packages/slack/web/slack_response.py",
line 194, in validate
    raise e.SlackApiError(message=msg, response=self) slack.errors.SlackApiError: The request to the Slack API failed. The
server responded with: {'ok': False, 'error': 'not_authed'}```
 

Я не понимаю, как бот может быть авторизован при выполнении скрипта в обычной командной строке, но не при использовании того же скрипта в crontab.

Я уже подтвердил, что:

  • Используемый интерпретатор / исполняемый файл Python одинаков в обоих случаях (он используется /usr/bin/python3 как в обычной командной строке, так и в crontab
  • В os.environ.get("SLACK_BOT_TOKEN") обоих случаях вывод дает один и тот же ключ

Если кто-нибудь сможет помочь объяснить это, это было бы очень ценно.

Комментарии:

1. Если это находится в /etc/crontab, он запускается от имени root и понятия не имеет, каковы ваши переменные среды.

2. если в переменных среды нет ПУТИ, вам придется указать абсолютный путь к исполняемым файлам, возможно /usr/bin/python3