ilyalatt / Telega

C# Telegram MTProto Client
https://ilyalatt.github.io/Telega/
MIT License
58 stars 15 forks source link

Telega.TgNotAuthenticatedException: "Authentication is required." #21

Closed k-Sacr closed 5 years ago

k-Sacr commented 5 years ago

Привет. Использую 0.3.2-preview001, по примеру из Telega.Example/Program.cs.

В SignInViaCode(TelegramClient tg, Config cfg) при запросе кода var codeHash = await tg.Auth.SendCode(cfg.ApiHash, cfg.Phone); вылетает с Telega.TgNotAuthenticatedException: "Authentication is required."

Подскажите пожалуйста решение.

ps: Надеюсь я верно решил, что вы русский.

ilyalatt commented 5 years ago

@k-Sacr Привет. Надеюсь, исправил, попробуйте 0.3.2-preview002.

k-Sacr commented 5 years ago

Спасибо помогло. Можешь еще подсказать пожалуйста. как отправить сообщение пользователю зная его номер телефона?

ilyalatt commented 5 years ago

Найти пользователя по его телефону можно через импорт контактов, уже описывал это здесь #22. Можно не импортировать, а искать в списке имеющихся контактов. Вот простой пример, который каждый раз импортирует пользователя и отправляет ему сообщение (расширение .AssertSome() здесь)

static async Task SendMessage(TelegramClient tg, string userPhone, string message)
{
    const string tmpFirstName = "temporary";
    const string tmpLastName = "user";

    var importResponse = await tg.Call(new ImportContacts(
        contacts: Array(new InputContact(
            clientId: 0,
            phone: userPhone,
            firstName: tmpFirstName,
            lastName: tmpLastName
        ))
    ));
    var importedUser = importResponse.Users.Choose(User.AsTag).Single();

    await tg.Messages.SendMessage(
        peer: new InputPeer.UserTag(
            userId: importedUser.Id,
            accessHash: importedUser.AccessHash.AssertSome()
        ),
        message: message
    );
}
k-Sacr commented 5 years ago

Пробовал подобный метод, только через получение контактов, вот мой код:

public static async Task SendMessage(TelegramClient tg, string phone, string message)
        {
            try
            {
                var contacts = await tg.Contacts.GetContacts();
                var chats = contacts.AsTag().IfNone(() => throw new NotImplementedException());
                var user = chats.Users.Cast<User.Tag>().FirstOrDefault(x => x.Phone == phone);
                if (user != null)
                {
                    var inputPeer = new InputPeer.UserTag(user.Id, user.AccessHash.AssertSome());
                    await tg.Messages.SendMessage(
                        peer: inputPeer,
                        message: message
                    );
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

В chats.Users.Cast<User.Tag>().FirstOrDefault(x => x.Phone == phone); получаю

Exception Message="Не удалось привести тип объекта \"Telega.Rpc.Dto.Types.User\" к типу \"Tag\"."

ilyalatt commented 5 years ago

@k-Sacr Это случается потому, что User.Tag и User это разные классы, User.Tag находится внутри User, надо заменить .Cast<User.Tag>() на .Choose(User.AsTag)

k-Sacr commented 5 years ago

Спасибо, не заметил такой очевидной ошибки. С вами можно связаться в телеграме? Мы хотим использовать Telega в нашем проекте и хотелось бы с вами проконсультироваться так сказать.

ilyalatt commented 5 years ago

Да, можно, https://t.me/ilyalatt