Telethon: OperationalError: база данных заблокирована

Извиняюсь, если это глупый вопрос.

Я пробую telethon впервые, и он не синхронизируется с моим API телеграммы.

Я получаю IP-адрес, когда набираю этот код:

Но я получаю это сообщение, когда пытаюсь подключиться, чтобы запустить или подключить клиент:

И наконец, я получаю OperationalError: database is locked ошибка при попытке войти с помощью телефона.

Сообщение об ошибке полностью:

-------------------------------------------------------------------- 

OperationalError Traceback (most recent 
 call last)
<ipython-input-13-880bc0e4ea12> in <module>()
  1 from telethon import TelegramClient, sync
 ----> 2 client = TelegramClient('session_name', api_id, api_hash)
  3 
  4 client.connect()
  5 if not client.is_user_authorized():

 /anaconda3/lib/python3.7/site- 
 packages/telethon/client/telegrambaseclient.py in __init__(self, 
 session, api_id, api_hash, connection, use_ipv6, proxy, timeout, 
 request_retries, connection_retries, retry_delay, auto_reconnect, 
 sequential_updates, flood_sleep_threshold, device_model, 
 system_version, app_version, lang_code, system_lang_code, loop, 
 base_logger)
 221                 DEFAULT_DC_ID,
 222                 DEFAULT_IPV6_IP if self._use_ipv6 else 
 DEFAULT_IPV4_IP,
 --> 223                 DEFAULT_PORT
 224             )
 225 

 /anaconda3/lib/python3.7/site-packages/telethon/sessions/sqlite.py 
 in set_dc(self, dc_id, server_address, port)
184     def set_dc(self, dc_id, server_address, port):
185         super().set_dc(dc_id, server_address, port)
--> 186         self._update_session_table()
187 
188         # Fetch the auth_key corresponding to this data center

/anaconda3/lib/python3.7/site-packages/telethon/sessions/sqlite.py 
in _update_session_table(self)
205         # some more work before being able to save auth_key's 
 for

206         # multiple DCs. Probably done differently.
 --> 207         c.execute('delete from sessions')
208         c.execute('insert or replace into sessions values 
(?,?,?,?)', (
209             self._dc_id,

OperationalError: database is locked

Что означает объект сопрограммы AuthMethods._start? Почему это дает базу данных заблокирована?

6 ответов

Решение

Ссылаясь на документацию Telethon, база данных будет заблокирована, если вы не закроете ее должным образом.

Вы используете тот же session файл от многих TelegramClient одновременно.

Первый

In [9] client.start()

TelegramClient запущен

второй

In [13] client.connect()

TelegramClient уже активен

Это также вызывает database is locked ошибка. Больше информации:

Чтобы решить печально известную

OperationalError: база данных заблокирована

ошибка, вызванная sqllite3, одно из решений - найти <SESSION_NAME>.sessionфайл, созданный при первом запуске кода, и удалите его. Telethon помещает эти файлы в ту же папку, что и ваш код Python или Jupyter Notebook. Или, в качестве альтернативы, вы можете использовать Python для автоматического удаления файла:

import os
import sys
os.chdir(sys.path[0])

if f"{SESSION_NAME}.session" in os.listdir():
    os.remove(f"{SESSION_NAME}.session")

предполагая, что вы используете SESSION_NAME строковая переменная для хранения параметра имени сеанса TelegramClient() функция.

перед созданием сеанса

      pid = check_output(['fuser', 'anon.session'])
 if pid:
    check_output(['kill', pid])

У вас здесь 2 проблемы, первая проблема связана с аутентификацией, я думаю, я расскажу о проблеме блокировки базы данных:

Имя сеанса, которое вы передали, уже используется или активно, поэтому заблокировано.

Он становится именем файла сеанса, если вы используете строку в качестве параметра, например, здесь вы передали "имя", это один из способов создания сеанса.

в противном случае вы можете использовать объект telethon.sessions.abstract.Session и передать его в качестве параметра, это второй способ.

И в-третьих, вы можете просто передать None.

Если это None, сеанс не будет сохранен, и вы должны вызвать log_out(), когда закончите.

client =  TelegramClient(None, api_id, api_hash)

Надеюсь это поможет.

Если вам просто нужно избавиться от этой проблемы в Linux и снова запустить программу, выполните следующие действия.

Шаг 1 - Найдите файл сеанса. Вы можете найти файл с именем xxxxxxxxx.session в том же каталоге, где у вас сохранен скрипт python.

Шаг 2 - запустить fuser xxxxxxxxx.session (замените xxxxxxxxx.session именем файла, найденным на шаге 1)

Шаг 3 - Вы увидите ответ с целым числом (Пример - 590219)

Шаг 4 - Запуск kill -9 590219 (замените 590219 целым числом, найденным на шаге 3)

Теперь снова запустите вашу программу

Если ты client.start() в 'if __name__ == '__main__':', вы не можете войти в приложение Telegram, и у вас будет

OperationalError: база данных заблокирована. Вы должны удалить 'if name =='main'' перед client.start()

Другие вопросы по тегам