通过Crontab运行Python脚本无报错但无法发送Telegram消息
问题排查与解决方案
1. 修正Crontab的错误输出重定向
你的Crontab命令中错误输出重定向写法有误,&2>1应改为2>&1,否则脚本的错误信息不会被写入日志,导致你无法看到Telegram发送失败的具体原因。修正后的命令:
00 12 * * * /usr/bin/python3 /root/data/App/Briefing/main.py >> /home/main.log 2>&1
注:DISPLAY=:0是针对图形界面程序的,你的脚本无需该环境变量,可直接移除。
2. 解决工作目录不一致问题
Crontab默认工作目录为用户主目录(如/root),而你的脚本使用相对路径读取checkpoint.csv、spiegel.csv等文件,这会导致Crontab运行脚本时找不到这些文件。
解决方法二选一:
- 在脚本开头添加切换工作目录的代码:
import os # 切换到脚本所在目录 os.chdir(os.path.dirname(os.path.abspath(__file__))) - 将所有
pd.read_csv的路径改为绝对路径,例如:pd.read_csv('/root/data/App/Briefing/checkpoint.csv', sep=';')
3. 给Telegram发送函数添加异常捕获
你的sendMessage函数未做任何异常处理,即使发送失败也不会输出错误信息。修改send.py,添加异常捕获并打印错误:
import telebot def sendMessage(msg): try: bot = telebot.TeleBot("XXXXXX") bot.send_message(chat_id="@morgenbriefing", text=msg, parse_mode="MarkdownV2") print("Telegram消息发送成功") except Exception as e: print(f"Telegram消息发送失败: {str(e)}")
修改后错误信息会被写入日志,你就能明确是格式错误、API问题还是网络问题导致的失败。
4. 完善MarkdownV2格式转义
Telegram的MarkdownV2对特殊字符转义要求严格,你的createMsg函数仅转义了部分字符,可能存在遗漏(如_、[、]等)。可补充转义规则:
s = s.replace("-", "\\-") s = s.replace(".", "\\.") s = s.replace("(", "\\(") s = s.replace(")", "\\)") s = s.replace("*", "\\*") s = s.replace("!", "\\!") s = s.replace("_", "\\_") s = s.replace("[", "\\[") s = s.replace("]", "\\]") s = s.replace("=", "\\=") s = s.replace("`", "\\`")
或者直接使用telebot内置的转义工具简化操作:
from telebot import util # 替换原有的手动转义代码 thema = util.escape_markdown(data['Thema'][i], version=2) zsm = util.escape_markdown(data['Zusammenfassung'][i], version=2)
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

