wiz0u / WTelegramClient

Telegram Client API (MTProto) library written 100% in C# and .NET
https://wiz0u.github.io/WTelegramClient/
MIT License
956 stars 156 forks source link

Failed to reuse a Session file with my own FileStream #234

Closed llyppi closed 7 months ago

llyppi commented 7 months ago

File created WTelegram.session from verification_code

string Config(string what)
            {
                if (what == "api_id") return "*****3268";
                if (what == "api_hash") return "***********e4213cc42e2197db5de67";
                if (what == "phone_number") return "******8892884";
                if (what == "verification_code") return null; // let WTelegramClient ask the user with a console prompt 
                if (what == "first_name") return "John";      // if sign-up is required
                if (what == "last_name") return "Doe";        // if sign-up is required
                if (what == "password") return null;     // if user has enabled 2FA
                return null;
            }
var stream = new MemoryStream(
                  Uteis.GetFile(Uteis.RootPath() +Path.DirectorySeparatorChar+"WTelegram.session"));
var client = new WTelegram.Client(Config,stream);

WTelegram.WTException: 'Exception while reading session file: The input data is not a complete block. Use the correct api_hash/id/key, or delete the file to start a new session'

wiz0u commented 7 months ago

The default WTelegramClient session store (when you leave it null in constructor) doesn't generate session files in a format compatible with the stream of data expected when you give your own session store

If you want to pass your own (custom) file stream in constructor, start with an empty file and generate a new session (with verification code). It will update/write to that file a correct stream of data for later reuse/resume of the session.

lucaswhob commented 6 months ago

Hello Please Provide Example I Have Exactly Same This Error ! I Create Session with this method clienttelegram = new WTelegram.Client(12XXX,"bXXXX",HttpContext.Current.Server.MapPath("~/tempkey.session")); Create File Session Successfully And Logon Ok ! But Afte Reuse Session Exception throw static string Config(string what) { switch (what) { case "api_id": return "12XXXXX"; case "api_hash": return "bd4XXXXXX"; case "phone_number": return "+9891XXXX"; case "verification_code": return ""; case "first_name": return ""; case "last_name": return ""; case "password": return ""; default: return null; } } clienttelegram = new WTelegram.Client(Config, File.Open(HttpContext.Current.Server.MapPath("~/tempkey.session"), FileMode.Open)); Please Help Me Thx

wiz0u commented 6 months ago

Yes, it's the same issue as OP

In one case you pass just the pathname

HttpContext.Current.Server.MapPath

and in the other case, you pass a FileStream

File.Open(HttpContext.Current.Server.MapPath

Those leads to different file storage formats that are incompatible. Either use only pathnames, or only FileStreams, but don't mix both to resume sessions.

When dealing with files, I recommend you only use pathnames (not FileStream), the format is optimized for performance.

To use a pathname with the Config callback constructor, have the Config method reply to "session_pathname".

lucaswhob commented 6 months ago

hello thx for reply . but when reuse session second contructor of WTelegram Accept Only Session Can not pass string to second contructor of new Wtelegram Second Time for resuse call : clienttelegram = new WTelegram.Client(Config, File.Open(HttpContext.Current.Server.MapPath("/tempkey.session"),