我有一个 python/telethon Telegram 机器人项目,由一个 python 文件、一个 SQLite 数据库和一个配置文件组成。该机器人在虚拟环境中的本地系统上运行良好(所有三个文件都在同一目录中),但是当我尝试在 ubuntu 服务器上运行 python 文件时,我遇到了以下错误。
项目文件位于
/usr/local/bin/project/
:
Traceback (most recent call last):
File "/usr/local/bin/project/script.py", line 19, in <module>
client = TelegramClient(session_name, API_ID, API_HASH).start(bot_token=BOT_TOKEN)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/telethon/client/telegrambaseclient.py", line 289, in __init__
session = SQLiteSession(session)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/telethon/sessions/sqlite.py", line 47, in __init__
c = self._cursor()
^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/telethon/sessions/sqlite.py", line 242, in _cursor
self._conn = sqlite3.connect(self.filename,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: unable to open database file
以下是script.py的内容:
import configparser
import re
from telethon import TelegramClient, Button, events
import sqlite3
from datetime import datetime
import traceback
print("Initializing configurations...")
config = configparser.ConfigParser()
config.read('config.ini', encoding='utf-8')
API_ID = config.get('default','api_id')
API_HASH = config.get('default','api_hash')
BOT_TOKEN = config.get('default','bot_token')
session_name = "sessions/Bot"
# Start the bot session
client = TelegramClient(session_name, API_ID, API_HASH).start(bot_token=BOT_TOKEN)
@client.on(events.NewMessage(pattern="(?i)/start"))
async def start(event):
sender = await event.get_sender()
SENDER = str(sender.id)
await event.reply('Hello!.')
##### MAIN
if __name__ == '__main__':
try:
print("Initializing Database...")
# Connect to local database
db_name = 'database.db'
conn = sqlite3.connect(db_name, check_same_thread=False)
# Create the cursor
crsr = conn.cursor()
print("Connected to the database")
# Command that creates the "customers" table
sql_command = """CREATE TABLE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
lname VARCHAR(200),
fname VARCHAR(200),
note VARCHAR(200));"""
crsr.execute(sql_command)
print("All tables are ready")
print("Bot Started")
client.run_until_disconnected()
except Exception as error:
print('Cause: {}'.format(error))
这些是
config.ini
的内容:
; DO NOT MODIFY THE LINE BELOW!!! ([default])
[default]
; EDITABLE FIELDS:
api_id = 000000
api_hash = 000000000000000000
bot_token = 00000000000000000000000000
我检查了所有三个文件的权限,并得到以下信息:
-rw-r--rw- 1 root root 10601 Mar 4 00:52 script.py
-rw-rw-rw- 1 root root 716800 Mar 4 00:52 database.db
-rw-r--rw- 1 root root 195 Mar 4 00:52 config.ini
TelegramClient
默认情况下尝试创建一个 sqlite 文件来存储会话信息。
传递给 TelegramClient 构造函数的第一个参数是会话,默认为会话名称(或完整路径)。 https://docs.telethon.dev/en/stable/concepts/sessions.html
由于您已将会话命名为
"sessions/Bot"
,因此它会尝试查找名为 "sessions"
的文件夹,然后创建名为 "Bot"
的数据库文件。但找不到该文件夹。
要修复此错误,您可以将
session_name
更改为类似 "Bot"
的文件名。或者您也可以只创建一个空文件夹名称sessions
,它应该可以正常工作。
希望这有帮助!