You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块,便于在门户查看运行日志。

额外注意事项

  1. 敏感信息管理:不要硬编码api_id、api_hash、token,建议通过Azure Function的应用设置配置,然后用os.getenv("API_ID")获取。
  2. 依赖配置:确保requirements.txt中包含telethon,版本建议和本地测试时一致,避免兼容性问题:
    telethon>=1.30.0
    azure-functions>=1.17.0
    
  3. Python版本兼容:Azure Functions的Python运行时版本要和Telethon支持的版本匹配(比如Python 3.8+)。

内容的提问来源于stack exchange,提问作者mableguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:17:14