I have a python/telethon Telegram bot project consisting of a single python file, an SQLite databse, and a config file. The bot runs fine on my local system in a virtual environment (all three files are in the same directory) but when I attempt to run the python file on ubuntu server, I'm running into the following error.
Project files are in /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
Below are the contents of 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))
These are the contents of config.ini:
; DO NOT MODIFY THE LINE BELOW!!! ([default])
[default]
; EDITABLE FIELDS:
api_id = 000000
api_hash = 000000000000000000
bot_token = 00000000000000000000000000
I checked permissions on all three files, and am getting the following:
-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
TelegramClientby default tries to create a sqlite file for stroing the session information.since you have named your session
"sessions/Bot", it tries to find a folder named"sessions"and then create a db file named"Bot". But it can't find the folder.To fix this error, you can either change your
session_nameto just a filename like"Bot". Or you can also just create an empty folder namesessionsand it should work well.Hope this helps!