Python Azure定时触发函数部署后Telethon报只读数据库错误求助
解决Azure Function部署Telethon时的"只读数据库"错误
问题根源
Azure Functions的/home/site/wwwroot运行目录是只读的,而你当前使用Telethon的默认SQLite Session(bot.session文件)会尝试在该目录下创建并写入会话数据,这直接触发了OperationalError: attempt to write a readonly database错误。本地环境因为工作目录有读写权限,所以不会出现这个问题。
解决方案
1. 改用内存Session替代SQLite Session
对于Telegram机器人来说,不需要持久化会话数据,使用MemorySession可以完全避免文件读写操作,从根源解决权限问题。
2. 优化异步代码逻辑
原代码存在重复调用client.start()、异步调用冗余的问题,需要简化逻辑,避免不必要的操作。
修改后的完整代码
import asyncio from datetime import datetime, timezone from telethon import TelegramClient from telethon.sessions import MemorySession # 导入内存Session from telethon.tl.types import InputPeerUser import azure.functions as func import logging # 建议把这些敏感信息放到Azure Function的应用设置中,用os.getenv获取 api_id = '2xxxxxxx' api_hash = 'xxxxxxxxxxxxxxxxxx6yyyyyyy' token = '6664444-knfdkjnxxxxx-xxxxx' async def send_telegram_message(client, receiver, message): # 客户端已经初始化完成,无需重复start和connect await client.send_message(receiver, message) await client.disconnect() async def main(mytimer: func.TimerRequest) -> None: utc_timestamp = datetime.utcnow().replace( tzinfo=timezone.utc).isoformat() if mytimer.past_due: logging.info('The timer is past due!') logging.info('Python timer trigger function ran at %s', utc_timestamp) message = "Hello, this is a test message from Azure Function" receiver = InputPeerUser(1111111, 0) # 使用MemorySession初始化客户端,避免文件读写 client = TelegramClient(MemorySession(), api_id, api_hash) await client.start(bot_token=token, max_attempts=10) try: logging.info('Trying to send telegram message') # 直接await异步函数,无需手动创建任务 await send_telegram_message(client, receiver, message) logging.info('Telegram message sent successfully') except Exception as e: logging.error(f'Failed to send message: {str(e)}')
关键改动说明
- 替换Session类型:用
MemorySession()替代默认的文件型Session,完全跳过本地数据库文件的创建和写入。 - 简化异步调用:移除了冗余的
loop.create_task,直接await异步函数,符合Azure Functions的异步运行逻辑。 - 避免重复初始化:原代码中
telegram_main里重复调用client.start()和client.connect(),现在只在主函数中初始化一次客户端。 - 改用logging替代print:Azure Functions中建议使用官方的
logging模块,便于在门户查看运行日志。
额外注意事项
- 敏感信息管理:不要硬编码
api_id、api_hash、token,建议通过Azure Function的应用设置配置,然后用os.getenv("API_ID")获取。 - 依赖配置:确保
requirements.txt中包含telethon,版本建议和本地测试时一致,避免兼容性问题:telethon>=1.30.0 azure-functions>=1.17.0 - Python版本兼容:Azure Functions的Python运行时版本要和Telethon支持的版本匹配(比如Python 3.8+)。
内容的提问来源于stack exchange,提问作者mableguy
相关产品推荐
相关产品推荐

