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

Java 使用电报API发送消息并存储会话(不使用bot API),java,android,session,telegram,sendmessage,Java,Android,Session,Telegram,Sendmessage,我想实现一个非常简单的Java电报客户端,它能够发送和接收消息,并跨多个启动存储会话。我已经设法验证并接收消息 api = new TelegramApi(apiState, new AppInfo(API_ID, "console", "1", "1", "en"), new ApiCallback() { @Override public void onAuthCancelled(TelegramApi api) {

我想实现一个非常简单的Java电报客户端,它能够发送和接收消息,并跨多个启动存储会话。我已经设法验证并接收消息

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)

为此,我使用了存储和加载ApiState的类及其使用的类(例如TLPersistence)。但是,显然它不存储登录状态,因为每次更新代码时,我都必须验证我的号码。 顺便说一下,我使用的是Api第66层()

更新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);
                }
            }
        });
    }
private void sendMessageToUser(int userId,String message){
TLInputPeerUser peer=新的TLInputPeerUser();
peer.setUserId(userId);
TlRequestMessagesSendMessageRequest=新建TLRequestMessagesSendMessage();
messageRequest.setFlags(0);
messageRequest.setPeer(peer);
messageRequest.setRandomId(新的SecureRandom().nextLong());
messageRequest.setMessage(message);
api.doRpcCallNonAuth(messageRequest,1500,新的RpcCallback(){
@凌驾
public void onResult(TLAbsUpdates TLAbsUpdates){
Log.d(标记“------------------------------------消息已发送-----------------”;
}
@凌驾
公共void onError(int i,字符串s){
Log.d(标记“------------------------------------消息发送错误-----------------”;
Log.d(标记、字符串、值(i));
如果(s!=null){
日志d(标签s);
}
}
});
}
但是,现在我一直在寻找联系人的用户名

第一次更新后,将保留以下内容:

  • 保存会话状态(和登录状态)
  • 查找联系人的用户ID
更新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;
    }
private int getUserId(字符串电话)抛出InterruptedException{
TLRequestMessagesGetDialogs dialogs=新建TLRequestMessagesGetDialogs();
对话框.setOffsetId(0);
对话框。设置限制(20);
setOffsetPeer(新的TLInputPeerUser());
CountDownLatch闩锁=新的CountDownLatch(1);
api.dorpcallnonauth(对话框,1500,新的RpcCallback(){
@凌驾
public void onResult(TLAbsDialogs TLAbsDialogs){
Log.d(标记“------------------------------------getUsers---------------------------”;
对于(TLAbsUser absUser:((TLDialogs)tlabdialogs.getUsers()){
添加((TLUser)absUser);
}
倒计时();
}
@凌驾
公共void onError(int i,字符串s){
Log.d(标记“------------------------------------getUsers错误---------------------------”;
倒计时();
}
});
satch.wait();
for(TLUser:users){
if(user.getPhone().equals(phone)){
返回user.getId();
}
}
返回0;
}
第二次更新后,将保留以下内容:

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