Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData()
my code
`#!/usr/bin/env python3
-- coding: utf-8 --
"""
Telegram Desktop tdata dosyalarını Telethon session dosyalarına dönüştürme script'i
Bu script opentele kütüphanesini kullanarak numaralar klasöründeki her bir hesabın
tdata'sını sessions klasörüne session dosyası olarak kaydeder.
"""
import os
import asyncio
import sys
from pathlib import Path
try:
from opentele.td import TDesktop
from opentele.tl import TelegramClient
from opentele.api import API, UseCurrentSession
from opentele.exception import OpenTeleException
except ImportError:
print("❌ Opentele kütüphanesi yüklü değil!")
print("Yüklemek için: pip install opentele")
sys.exit(1)
class TDataToSessionConverter:
def init(self, numaralar_dir="numaralar", sessions_dir="sessions"):
self.numaralar_dir = Path(numaralar_dir)
self.sessions_dir = Path(sessions_dir)
# Sessions klasörünü oluştur
self.sessions_dir.mkdir(exist_ok=True)
def check_tdata_files(self, tdata_path):
"""tdata klasörünün gerekli dosyaları içerip içermediğini kontrol et"""
tdata_path = Path(tdata_path)
required_files = [
'key_datas',
'settings',
'settingss'
]
missing_files = []
for file in required_files:
if not (tdata_path / file).exists():
missing_files.append(file)
# En az bir user data klasörü olmalı
user_dirs = [d for d in tdata_path.iterdir() if d.is_dir() and len(d.name) == 16]
return {
'valid': len(missing_files) == 0 and len(user_dirs) > 0,
'missing_files': missing_files,
'user_dirs': len(user_dirs),
'has_accounts': len(user_dirs) > 0
}
def find_phone_directories(self):
"""Numaralar klasöründeki telefon numarası klasörlerini bul"""
phone_dirs = []
if not self.numaralar_dir.exists():
print(f"❌ {self.numaralar_dir} klasörü bulunamadı!")
return phone_dirs
for item in self.numaralar_dir.iterdir():
if item.is_dir() and item.name.startswith('+'):
tdata_path = item / "tdata"
if tdata_path.exists():
# tdata dosyalarını kontrol et
check_result = self.check_tdata_files(tdata_path)
phone_dirs.append({
'phone': item.name,
'tdata_path': str(tdata_path),
'session_name': f"{item.name.replace('+', '')}.session",
'tdata_valid': check_result
})
else:
print(f"⚠️ {item.name} klasöründe tdata bulunamadı")
return phone_dirs
async def convert_single_tdata(self, phone_info):
"""Tek bir tdata'yı session'a dönüştür"""
phone = phone_info['phone']
tdata_path = phone_info['tdata_path']
session_name = phone_info['session_name']
session_path = self.sessions_dir / session_name
tdata_check = phone_info['tdata_valid']
print(f"\n🔄 {phone} dönüştürülüyor...")
print(f" Tdata: {tdata_path}")
print(f" Session: {session_path}")
# tdata dosyalarını kontrol et
if not tdata_check['valid']:
if not tdata_check['has_accounts']:
print(" ❌ tdata klasöründe hesap verisi bulunamadı!")
print(" 💡 Bu genellikle şu durumları gösterir:")
print(" • Telegram Desktop'ta hiç oturum açılmamış")
print(" • Oturum zaten kapatılmış")
print(" • tdata dosyaları eksik veya hasarlı")
return False
if tdata_check['missing_files']:
print(f" ⚠️ Eksik dosyalar: {', '.join(tdata_check['missing_files'])}")
print(f" 📊 Bulunan kullanıcı klasörleri: {tdata_check['user_dirs']}")
try:
# TDesktop istemcisini yükle
print(" 📂 Tdata yükleniyor...")
tdesk = TDesktop(tdata_path)
# Hesap bilgilerini kontrol et
if len(tdesk.accounts) == 0:
print(" ❌ tdata'dan hiç hesap yüklenemedi!")
print(" 💡 Muhtemel sebepler:")
print(" • Hesap şifreli (local passcode)")
print(" • Telegram Desktop'ta oturum kapalı")
print(" • tdata dosyaları hasarlı")
return False
print(f" ✅ {len(tdesk.accounts)} hesap yüklendi")
# Resmi API kullan (Telegram iOS API'si rastgele cihaz bilgileriyle)
print(" 🔑 API yapılandırılıyor...")
api = API.TelegramIOS.Generate()
# Session dosyası zaten varsa kullan, yoksa mevcut session'ı kullan
if session_path.exists():
print(" ♻️ Mevcut session dosyası bulundu, güncelleniyor...")
else:
print(" ✨ Yeni session dosyası oluşturuluyor...")
# TDesktop session'ını Telethon'a dönüştür
client = await tdesk.ToTelethon(str(session_path), UseCurrentSession, api)
# Bağlan ve test et
print(" 🔌 Telegram'a bağlanıyor...")
await client.connect()
# Hesap bilgilerini al
if await client.is_user_authorized():
me = await client.get_me()
username = f"@{me.username}" if me.username else "kullanıcı adı yok"
print(f" ✅ Başarılı! Kullanıcı: {me.first_name} ({username})")
print(f" 📞 Telefon: {me.phone}")
else:
print(" ⚠️ Hesap authorized değil, ama session oluşturuldu")
# Bağlantıyı kapat
await client.disconnect()
return True
except OpenTeleException as e:
print(f" ❌ OpenTele Hatası: {str(e)}")
if "No account has been loaded" in str(e):
print(" 💡 Bu hata genellikle şu durumlarda oluşur:")
print(" • Telegram Desktop'ta local passcode (şifre) ayarlanmış")
print(" • tdata dosyaları hasarlı veya eksik")
print(" • Hesap daha önceden silinmiş")
elif "not logged in" in str(e).lower():
print(" 💡 Hesap giriş yapmamış durumda")
# Hatalı session dosyasını sil
if session_path.exists():
try:
session_path.unlink()
print(" 🗑️ Hatalı session dosyası silindi")
except:
pass
return False
except Exception as e:
print(f" ❌ Beklenmeyen Hata: {str(e)}")
# Hatalı session dosyasını sil
if session_path.exists():
try:
session_path.unlink()
print(" 🗑️ Hatalı session dosyası silindi")
except:
pass
return False
async def convert_all(self):
"""Tüm tdata dosyalarını dönüştür"""
print("🚀 Telegram tdata → session dönüştürücü başlatılıyor...")
phone_dirs = self.find_phone_directories()
if not phone_dirs:
print("❌ Dönüştürülecek telefon numarası klasörü bulunamadı!")
return
print(f"📋 {len(phone_dirs)} hesap bulundu:")
for info in phone_dirs:
status = "✅" if info['tdata_valid']['valid'] else "⚠️"
print(f" {status} {info['phone']}")
successful = 0
failed = 0
# Her bir hesabı sırayla dönüştür
for phone_info in phone_dirs:
try:
if await self.convert_single_tdata(phone_info):
successful += 1
else:
failed += 1
except KeyboardInterrupt:
print("\n⏹️ İşlem kullanıcı tarafından durduruldu")
break
except Exception as e:
print(f"❌ Beklenmeyen hata: {str(e)}")
failed += 1
print(f"\n📊 Dönüştürme tamamlandı!")
print(f" ✅ Başarılı: {successful}")
print(f" ❌ Başarısız: {failed}")
print(f" 📁 Session dosyaları: {self.sessions_dir}")
if failed > 0:
print(f"\n💡 Başarısız olan hesaplar için:")
print(f" • Telegram Desktop'ta hesabın oturum açık olduğundan emin olun")
print(f" • Local passcode (kilit) varsa kaldırın")
print(f" • tdata klasörünün tam ve hasarsız olduğunu kontrol edin")
async def main():
"""Ana fonksiyon"""
print("=" * 60)
print(" Telegram Desktop → Telethon Session Dönüştürücü")
print("=" * 60)
converter = TDataToSessionConverter()
await converter.convert_all()
if name == "main":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\n👋 Görüşürüz!")
except Exception as e:
print(f"\n💥 Kritik hata: {str(e)}")
sys.exit(1) `
output:
Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData()
Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData()
my code
`#!/usr/bin/env python3
-- coding: utf-8 --
"""
Telegram Desktop tdata dosyalarını Telethon session dosyalarına dönüştürme script'i
Bu script opentele kütüphanesini kullanarak numaralar klasöründeki her bir hesabın
tdata'sını sessions klasörüne session dosyası olarak kaydeder.
"""
import os
import asyncio
import sys
from pathlib import Path
try:
from opentele.td import TDesktop
from opentele.tl import TelegramClient
from opentele.api import API, UseCurrentSession
from opentele.exception import OpenTeleException
except ImportError:
print("❌ Opentele kütüphanesi yüklü değil!")
print("Yüklemek için: pip install opentele")
sys.exit(1)
class TDataToSessionConverter:
def init(self, numaralar_dir="numaralar", sessions_dir="sessions"):
self.numaralar_dir = Path(numaralar_dir)
self.sessions_dir = Path(sessions_dir)
async def main():
"""Ana fonksiyon"""
print("=" * 60)
print(" Telegram Desktop → Telethon Session Dönüştürücü")
print("=" * 60)
if name == "main":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\n👋 Görüşürüz!")
except Exception as e:
print(f"\n💥 Kritik hata: {str(e)}")
sys.exit(1) `
output:
Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData()