#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