telethon sqlite3.OperationalError:数据库已锁定

问题描述 投票:0回答:1

所以基本上我正在创建 telegram python 机器人。它在我的本地系统中运行良好。我创建了两个不同的脚本,一个用于从一个通道获取消息,第二个用于处理该消息并使用机器人将该消息发送到另一个通道。到目前为止,一切都进展顺利。我将其部署在具有相同会话名称的 Fly.io 中后出现问题。我尝试了很多事情和技巧。但无法解决问题。

这是我的完整代码:

telethon_client.py

从 telethon.sync 导入 TelegramClient,事件 从芹菜进口芹菜 导入操作系统 导入 json

初始化 Celery 应用程序

app = Celery('任务',broker=broker_url)

初始化 Telethon 客户端

客户端= TelegramClient(会话文件,api_id,api_hash)

设置事件处理程序来侦听新消息

@client.on(events.NewMessage)

async def telethon_new_message(event): 聊天标题 = 事件.聊天.标题 message_text = 事件.message.text

if chat_title in chat_titles:
    # Send a task to the Celery worker
    app.send_task("tasks.handle_new_message", args=[message_text])

if name == "main": # 启动 Telethon 客户端 使用 TelegramClient(session_file, api_id, api_hash) 作为客户端: 客户端.start() 客户端.connect() client.add_event_handler(telethon_new_message, events.NewMessage()) print("正在监听新消息...") 客户端.disconnect()

这是我的芹菜工人

从 telethon.sync 导入 TelegramClient,事件 从芹菜进口芹菜 从助手导入 count_non_flipkart_links_and_messages、get_amazon_product_category、find_tag、keep_tag_param、send_telegram_message、expand_short_url 导入操作系统 导入异步

初始化 Celery 应用程序

app = Celery('任务',broker=broker_url)

处理传入消息的功能

@app.task def handle_new_message(message_text): print(f"新消息:{message_text}") link_count, 对应的消息 = count_non_flipkart_links_and_messages(message_text)

updated_message = str(message_text)

for message in corresponding_messages:
    current_url = expand_short_url(message)
    # category, current_url = get_amazon_product_category(message)

    if current_url != "":
        updated_url = find_tag(current_url)
        updated_message = updated_message.replace(message, keep_tag_param(updated_url))


print(updated_message)

asyncio.run(send_telegram_message(sending_channel, updated_message))

print("Message sent successfully!")

部署后,它运行一段时间很顺利,但过了一段时间后,他们说由于在不同的 ip 中使用相同的会话文件名。 Sqlite 数据库被锁定。有人可以帮忙吗?

回溯(最近一次调用最后一次): 文件“/home/kashyap/projects/telegram-bot/telethon_client.py”,第 37 行,位于 使用 TelegramClient(session_file, api_id, api_hash) 作为客户端: 文件“/home/kashyap/.local/lib/python3.10/site-packages/telethon/client/telegrambaseclient.py”,第 308 行,在 init 中 会话.set_dc( 文件“/home/kashyap/.local/lib/python3.10/site-packages/telethon/sessions/sqlite.py”,第 168 行,在 set_dc 中 self._update_session_table() 文件“/home/kashyap/.local/lib/python3.10/site-packages/telethon/sessions/sqlite.py”,第 194 行,在 _update_session_table 中 c.execute('从会话中删除') sqlite3.OperationalError:数据库已锁定

python sqlite bots telegram-bot telethon
1个回答
0
投票

Celery 可能使用线程。 Telethon 使用

asyncio

您可以将

asyncio
threading
结合起来,但这并不简单。

如果您不需要 Celery 或

threading
提供的功能,您可以直接使用
asyncio
来生成所需数量的任务。

否则,您可能应该有一个专用线程,其中有一个

asyncio
事件循环和 Telethon 在其中运行。然后通过例如与它进行通信排队。

或者您可以使用

asyncio
搜索 Celery 以了解可以做什么。

© www.soinside.com 2019 - 2024. All rights reserved.