66 lines
1.9 KiB
Markdown
66 lines
1.9 KiB
Markdown
# StringSession Conversion
|
|
|
|
## The Problem
|
|
SQLite-based Telethon sessions deadlock when accessed in parallel. The error:
|
|
```
|
|
sqlite3.OperationalError: database is locked
|
|
```
|
|
This happens because SQLite uses file-level locking. When multiple accounts try to connect simultaneously, the `.session` files lock each other out.
|
|
|
|
## The Fix: StringSession
|
|
Convert ALL sessions to in-memory StringSession format stored in a single JSON file. No file locking, no database contention.
|
|
|
|
## Converter Script
|
|
Located at: `C:\Users\User\Desktop\_PROJECTS\рассылка\session_converter.py`
|
|
|
|
### How It Works
|
|
```python
|
|
# For each .session file:
|
|
client = TelegramClient(session_path, API_ID, API_HASH)
|
|
await client.connect()
|
|
ss = client.session.save() # Returns StringSession string
|
|
string_sessions[phone] = ss
|
|
await client.disconnect()
|
|
```
|
|
|
|
### Output
|
|
`generated/sessions_strings.json`:
|
|
```json
|
|
{
|
|
"12894827641": "1AgAOMTQ5...",
|
|
"14066141705": "1BQANOTE3...",
|
|
...
|
|
}
|
|
```
|
|
|
|
## Usage in Join Script
|
|
```python
|
|
# Load
|
|
with open("generated/sessions_strings.json") as f:
|
|
string_sessions = json.load(f)
|
|
|
|
# Use
|
|
ss = string_sessions.get(phone) or string_sessions.get(name)
|
|
if not ss:
|
|
return {"status": "no_stringsession"}
|
|
|
|
client = TelegramClient(StringSession(ss), API_ID, API_HASH)
|
|
await client.connect()
|
|
```
|
|
|
|
## Conversion Results (2026-07-08)
|
|
- 222 sessions converted
|
|
- 137 new StringSessions created
|
|
- 9 failures (corrupted sessions)
|
|
|
|
## Why NOT SQLite Retry
|
|
- WAL mode doesn't fix parallel access
|
|
- Retry with exponential backoff adds latency
|
|
- Timeout-based retry still leaves windows for deadlock
|
|
- StringSession is simpler, faster, and zero-lock
|
|
|
|
## Pitfalls
|
|
- StringSession strings are long (~350 chars) — the JSON file can be large
|
|
- Invalid/corrupted .session files will fail conversion silently
|
|
- Some accounts may have both .session and StringSession — prefer StringSession
|
|
- The `generated/sessions_strings.json` file should be backed up before mass operations |