Skip to content

Tdata to session Error Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData() #136

@atillakesicioglu

Description

@atillakesicioglu

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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions