Java 使用电报API发送消息并存储会话(不使用bot API)
我想实现一个非常简单的Java电报客户端,它能够发送和接收消息,并跨多个启动存储会话。我已经设法验证并接收消息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) {
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
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