使用Telegram API发送消息并存储会话(不使用bot API)

时间:2018-01-19 08:27:03

标签: java android session telegram sendmessage

我想实现一个非常简单的Java Telegram Client,它能够发送和接收消息并在多个启动时存储会话。我已经设法验证并接收消息

api = new TelegramApi(apiState, new AppInfo(API_ID, "console", "1", "1", "en"), new ApiCallback() {
            @Override
            public void onAuthCancelled(TelegramApi api) {
                Log.d(TAG, "-----------------CANCELLED----------------");
                Log.d(TAG, api.getApiContext().toString());
            }

            @Override
            public void onUpdatesInvalidated(TelegramApi api) {
                Log.d(TAG, "-----------------INVALIDATED----------------");
                Log.d(TAG, api.getApiContext().toString());
            }

            @Override
            public void onUpdate(TLAbsUpdates tlAbsUpdates) {
                Log.d(TAG, "-----------------UPDATE----------------");
                Log.d(TAG, tlAbsUpdates.toString());
                if (tlAbsUpdates instanceof TLUpdateShortMessage) {
                    Log.d(TAG, "-----------------UPDATE CHAT MESSAGE----------------");
                    int senderId = ((TLUpdateShortMessage) tlAbsUpdates).getUserId();
                    Log.d(TAG, "Message from " + senderId);
                    String message = ((TLUpdateShortMessage) tlAbsUpdates).getMessage();
                    Log.d(TAG, message);
                    activity.appendMessage(TAG, message);
                }
            }
        });
        api.switchToDc(2);
        TLConfig config = null;
        try {
            config = api.doRpcCallNonAuth(new TLRequestHelpGetConfig());
        } catch (TimeoutException | IOException e) {
            e.printStackTrace();
        }
        apiState.updateSettings(config);

但是,我很难向其他用户发送消息。首先,如果我可以向用户发送消息就足够了(之前通过检索senderId,之前在onUpdate方法中可以看到)。但是,如果有人也可以帮助我检索我保存的联系人的ID,那将是完美的。

此外,我想在多个初创公司中存储会话,因为我得到了FLOOD_WAIT错误(420),如果我经常测试我的代码。

为此,我使用https://github.com/rubenlagus/TelegramApi/blob/51713e9b6eb9e0ae0d4bbbe3d4deffff9b7f01e4/src/main/java/org/telegram/bot/kernel/engine/MemoryApiState.java及其使用的类(例如TLPersistence),它存储并加载ApiState。但是,显然它不存储登录状态,因为每次更新代码时我都必须验证我的号码。 顺便说一下,我正在使用Api第66层(https://github.com/rubenlagus/TelegramApi/releases)。

更新1: 发送邮件的问题解决了我自己:

private void sendMessageToUser(int userId, String message) {
        TLInputPeerUser peer = new TLInputPeerUser();
        peer.setUserId(userId);
        TLRequestMessagesSendMessage messageRequest = new TLRequestMessagesSendMessage();
        messageRequest.setFlags(0);
        messageRequest.setPeer(peer);
        messageRequest.setRandomId(new SecureRandom().nextLong());
        messageRequest.setMessage(message);
        api.doRpcCallNonAuth(messageRequest, 1500, new RpcCallback<TLAbsUpdates>() {
            @Override
            public void onResult(TLAbsUpdates tlAbsUpdates) {
                Log.d(TAG, "-----------------------MESSAGE SENT-----------------------");
            }

            @Override
            public void onError(int i, String s) {
                Log.d(TAG, "-----------------------MESSAGE SENT ERROR-----------------------");
                Log.d(TAG, String.valueOf(i));
                if(s != null) {
                    Log.d(TAG, s);
                }
            }
        });
    }

然而,现在我被困在寻找我的联系人的userIds。

首次更新后,请留下:

  • 保存会话状态(和登录状态)
  • 查找联系人的userIds

更新2: 我设法获取已经存在对话框的用户。这对我的用例来说已经足够了,但加载所有联系人都是完美的。这是如何从现有对话框加载用户:

 private int getUserId(String phone) throws InterruptedException {
        TLRequestMessagesGetDialogs dialogs = new TLRequestMessagesGetDialogs();
        dialogs.setOffsetId(0);
        dialogs.setLimit(20);
        dialogs.setOffsetPeer(new TLInputPeerUser());
        CountDownLatch latch = new CountDownLatch(1);
        api.doRpcCallNonAuth(dialogs, 1500, new RpcCallback<TLAbsDialogs>() {
            @Override
            public void onResult(TLAbsDialogs tlAbsDialogs) {
                Log.d(TAG, "----------------------getUsers--------------------");
                for(TLAbsUser absUser : ((TLDialogs) tlAbsDialogs).getUsers()) {
                    users.add((TLUser) absUser);
                }
                latch.countDown();
            }

            @Override
            public void onError(int i, String s) {
                Log.d(TAG, "----------------------getUsers ERROR--------------------");
                latch.countDown();
            }
        });
        latch.await();
        for(TLUser user : users) {
            if(user.getPhone().equals(phone)) {
                return user.getId();
            }
        }
        return 0;
    }

第二次更新后,剩下:

  • 保存会话状态(和登录状态)
  • 从联系人而不是对话框中获取用户ID

0 个答案:

没有答案