📄 milyqq.java
字号:
if(id<1 || id > index.size()){helpInfo("ls");return;} id = indexToQQNumber(id); //得到了QQ号 String msg = "+===================该用户的详细信息====================+"; if(friends.containsKey(id)){ QQFriend friend = friends.get(id); msg += "\nQQ:" + friend.qqNum + "\t昵称:" + filterNewline(friend.nick) //+ "\t头像:" + friend.head + "\t性别:" + ((friend.gender ==QQ.QQ_GENDER_GG) ? "男 ":(friend.gender==QQ.QQ_GENDER_MM)?"女 ":"未知") + "\t年龄:" + friend.age +"\n会员:" + (((friend.userFlag & 0x1) !=0) ? "是" : "不是") +"\t移动QQ:" + (((friend.userFlag & 0x10) !=0) ? "是" : "不是") +"\t绑定手机:" + (((friend.userFlag & 0x40) !=0) ? "是" : "否") +"\t摄像头:" + (((friend.userFlag & 0x10) !=0) ? "有" : "无") +"\nTM登录:" + (((friend.userFlag & 0x20000) !=0) ? "是" : "否"); } if(friendStatus.containsKey(id)){ FriendStatus s = friendStatus.get(id); msg += "\t当前状态:" + getCurrentStatus(s.status) + "\t来自:" + Util.getIpStringFromBytes(s.ip) + ":" + s.port ; } msg += "\n备注:" + (remarks.containsKey(id) ? remarks.get(id).name : "-"); msg += "\n个性签名: "+(signatures.containsKey(id) ? signatures.get(id).sig : "-") +"\n"; msg += "+=======================================================+\n"; System.out.print(msg); } private void processCmdListAll(){ int i=0; String gender = new String(); String status = new String(); String nick = new String(); if(!index.isEmpty()) index.clear(); System.out.print( "+编号+--QQ号码---+年龄+性别+状态+------昵称(备注)-------+"); for (Map.Entry<Integer, QQFriend> entry : friends.entrySet()) { gender = ((entry.getValue().gender==QQ.QQ_GENDER_GG) ?"GG":(entry.getValue().gender==QQ.QQ_GENDER_MM)?"MM":"??"); status = getCurrentStatus( friendStatus.containsKey(entry.getKey()) ? friendStatus.get(entry.getKey()).status : QQ.QQ_STATUS_OFFLINE); nick = filterNewline(entry.getValue().nick) +(remarks.containsKey(entry.getKey()) ? ("\t(" + remarks.get(entry.getKey()).name + ")") : ""); index.add(entry.getKey()); System.out.printf("\n%4d | %-10d|%3d | %s |%s| %-16s", ++i, entry.getKey(), entry.getValue().age, gender, status, nick); if(i%20==0) doPause(); } System.out.printf("\n+-------------------------------------------------------+\n"); } private void processCmdListGroup(){ int i=0; if(!index.isEmpty()) index.clear(); System.out.print("+编号+--群号码---+------群名字-------+"); for (Map.Entry<Integer, ClusterInfo> entry : clusters.entrySet()) { index.add(entry.getKey()); System.out.printf("\n%4d | %-10d| %-16s",++i,entry.getKey(), filterNewline(entry.getValue().name)); if(i%20==0) doPause(); } System.out.printf("\n+------------------------------------+\n"); } private void processCmdListGroup(String clusterId){ if(!Util.isInt(clusterId)){ helpInfo("lsg"); return; } int gid = Integer.parseInt(clusterId); //群成员只能用群的编号来察看 if(gid<1 || gid>index.size()){helpInfo("lsg"); return; } gid = indexToQQNumber(gid); if(!index.contains(gid) || !clusters.containsKey(gid)){ helpInfo("lsg"); return; } System.out.print(" ==群:" + clusters.get(gid).name + "(" + gid + ")的成员列表==\n"); String description = clusters.get(gid).description; String notice = clusters.get(gid).notice; //转换成群内部ID gid=clusters.get(gid).clusterId; //得到一个群的成员列表 HashMap<Integer,QQFriend> oneCluster = members.get(gid); int i=0; String gender = new String(); String status = new String(); String nick = new String(); if(!index.isEmpty()) index.clear(); System.out.print( "+编号+--QQ号码---+年龄+性别+状态+------昵称(备注)-------+"); for (Map.Entry<Integer,QQFriend> entry : oneCluster.entrySet()){ index.add(entry.getKey()); gender = ((entry.getValue().gender==QQ.QQ_GENDER_GG) ?"GG":(entry.getValue().gender==QQ.QQ_GENDER_MM)?"MM":"??"); status = getCurrentStatus( friendStatus.containsKey(entry.getKey()) ? friendStatus.get(entry.getKey()).status : QQ.QQ_STATUS_OFFLINE); nick = filterNewline(entry.getValue().nick) +(remarks.containsKey(entry.getKey()) ? ("\t(" + remarks.get(entry.getKey()).name + ")") : ""); System.out.printf("\n%4d | %-10d|%3d | %s |%s| %-16s", ++i, entry.getKey(), entry.getValue().age, gender, status, nick); if(i%20==0) doPause(); } System.out.printf("\n+-------------------------------------------------------+\n"); System.out.printf("群描述: %s\n群通知: %s\n", description, notice); } private void processCmdInfo(String num){ if(!Util.isInt(num)) { helpInfo("info"); return; } client.getUserInfo(indexToQQNumber(Integer.parseInt(num))); } private void processCmdSig(){ if(!isSignatureOk) return; int i = 0; String nick = new String(); String remark_name = new String(); for (Map.Entry<Integer, Signature> entry : signatures.entrySet()) { nick = filterNewline(friends.containsKey(entry.getKey()) ? friends.get(entry.getKey()).nick : ""); remark_name = (remarks.containsKey(entry.getKey()) ? (" (" + remarks.get(entry.getKey()).name + ")") : ""); System.out.printf("[%d] QQ: %-10d 昵称: %s 备注名称: %s \n个性签名: %s\n\n", ++i,entry.getKey(),nick,remark_name,entry.getValue().sig); if(i%5==0) doPause(); } } private void processCmdCd(String arg){ if(!Util.isInt(arg) && !arg.equals("..")) { helpInfo("cd"); return; } try { if(arg.equals("..")){ chattingNo=0; chattingName=""; } else { int tempNo = indexToQQNumber(Integer.parseInt(arg)); if (friends.containsKey(tempNo)) { chattingNo = tempNo; chattingName = friends.get(tempNo).nick; chattingName = filterNewline(chattingName); chattingType = 0; } else if (clusters.containsKey(tempNo)) { chattingNo = clusters.get(tempNo).clusterId; chattingName = clusters.get(tempNo).name; chattingName = filterNewline(chattingName); chattingType = 1; } else { System.out.print("无效的编号,QQ号,群号!\n"); } } } catch (Exception ex) { helpInfo("cd"); if(isDebug) ex.printStackTrace(); } } private void processCmdSend(String num,String msg){ if(!Util.isInt(num)){ helpInfo("send"); return; } try { int tempNo = indexToQQNumber(Integer.parseInt(num)); if (friends.containsKey(tempNo)) { client.sendIM(tempNo, msg); processCmdCd(num); } else if (clusters.containsKey(tempNo)){ client.sendClusterIM(clusters.get(tempNo).clusterId, msg); processCmdCd(num); } else { System.out.print("无效的编号,QQ号,群号!\n"); } } catch (Exception ex) { helpInfo("send"); if(isDebug) ex.printStackTrace(); } } private void processCmdStatus(String num){ if(!Util.isInt(num)){ helpInfo("status"); return; } switch(Integer.parseInt(num)){ case 1: getCurrentStatus(); break; case 2: client.makeMeOnline(); break; case 3: client.makeMeHidden(); break; case 4: client.makeMeAway(); break; case 0: user.setStatus(QQ.QQ_STATUS_OFFLINE); client.sendPacket(new ChangeStatusPacket(user)); break; default: System.out.print(" 未知状态!!\n"); } } private void processCmdRemark(String num){ if(!Util.isInt(num)){ helpInfo("remark"); return; } client.downloadFriendRemark(indexToQQNumber(Integer.parseInt(num))); } public static void main(String[] args) { MilyQQ qq = new MilyQQ(); } private void requestSignature(){ ArrayList<Signature> sigs = new ArrayList<Signature>(); isSignatureOk = false; //对所有的QQ号进行排序 Collections.sort(qqNumList, new Comparator<Integer>() { public int compare(Integer s1, Integer s2) { return s1.intValue() -s2.intValue(); } }); for (int i=0; i<qqNumList.size() && i<33 ; i++) { Signature sig = new Signature(); sig.qq = qqNumList.get(i); sigs.add(sig); } client.getSignature(sigs); } private void requestSignature(int nextQQ){ ArrayList<Signature> sigs = new ArrayList<Signature>(); for (int i = qqNumList.indexOf(nextQQ) ; i<qqNumList.size() && i<qqNumList.indexOf(nextQQ)+33 ; i++) { Signature sig = new Signature(); sig.qq = qqNumList.get(i); sigs.add(sig); } client.getSignature(sigs); } public void qqEvent(QQEvent e) { switch (e.type) { case QQEvent.QQ_LOGIN_SUCCESS: processLoginSuccess(e); initStep = 1; break; case QQEvent.QQ_LOGIN_REDIRECT_NULL: System.out.print("地址重定向到0,随机选取其他服务器再登录.\n"); this.login(); break; case QQEvent.QQ_LOGIN_UNKNOWN_ERROR: System.out.print("未知的登录错误导致登陆失败,重新登录.\n"); this.login(); break; case QQEvent.QQ_CHANGE_STATUS_SUCCESS: System.out.print("改变状态完成.\n"); getCurrentStatus(); System.out.print(chattingName+">"); if (initStep == 1) { initStep = 2; client.getFriendList(); client.downloadFriend(0); } break; case QQEvent.QQ_CHANGE_STATUS_FAIL: System.out.print("改变状态失败.\n"); break; case QQEvent.QQ_GET_FRIEND_LIST_SUCCESS: processFriendList(e); break; case QQEvent.QQ_DOWNLOAD_GROUP_FRIEND_SUCCESS: processGroupFriend(e); break; case QQEvent.QQ_DOWNLOAD_GROUP_FRIEND_FAIL: System.out.print("下载好友分组失败, 注销!\n"); this.logout(); break; case QQEvent.QQ_GET_CLUSTER_INFO_SUCCESS: processClusterInfo(e); break; case QQEvent.QQ_GET_CLUSTER_INFO_FAIL: System.out.print("得到群信息错误. 注销!\n"); this.logout(); break; case QQEvent.QQ_GET_MEMBER_INFO_SUCCESS: processMemberInfo(e); break; case QQEvent.QQ_GET_MEMBER_INFO_FAIL: System.out.print("得到成员信息错误. 注销!\n"); this.logout(); break; case QQEvent.QQ_RECEIVE_CLUSTER_IM: processClusterIM(e); break; case QQEvent.QQ_RECEIVE_NORMAL_IM: client.qqEvent(e); processNormalIM(e); break; case QQEvent.QQ_CONNECTION_BROKEN: System.out.print("连接被打断, 重新连接...\n"); friendStatus.clear(); try {client.login();} catch (Exception ex) {if(isDebug) ex.printStackTrace();} break; case QQEvent.QQ_CONNECTION_LOST: System.out.print("连接被丢失, 重新连接...\n"); friendStatus.clear(); try {client.login();} catch (Exception ex) {if(isDebug) ex.printStackTrace();} break; case QQEvent.QQ_OPERATION_TIMEOUT: if(isDebug) System.out.print("操作超时...\n>"); if(e.operation==QQ.QQ_CMD_LOGIN || e.operation==QQ.QQ_CMD_REQUEST_LOGIN_TOKEN) { if(isLogin) this.logout(); System.err.print("登录超时, login命令重新登录或者exit 命令退出!\n>"); } break; case QQEvent.QQ_GET_FRIEND_ONLINE_SUCCESS: processFriendOnline(e); break; case QQEvent.QQ_FRIEND_CHANGE_STATUS: if(initStep >= stepCounter) processFriendChangeStatus(e); break; case QQEvent.QQ_GET_USER_INFO_SUCCESS: if(initStep >= stepCounter) processUserInfo(e); break; case QQEvent.QQ_GET_WEATHER_SUCCESS: processWeather(e); break; case QQEvent.QQ_GET_WEATHER_FAIL: System.out.print("请求天气操作失败...\n>"); break; case QQEvent.QQ_GET_SIGNATURE_SUCCESS: processSignature(e); break; case QQEvent.QQ_GET_SIGNATURE_FAIL: System.out.print("\n 请求个性签名失败...\n>"); System.out.print(chattingName + ">"); break; case QQEvent.QQ_RECEIVE_SYS_MESSAGE: if(isDebug){ System.out.print("\n 收到系统消息...\n>"); System.out.print(chattingName + ">"); } break; case QQEvent.QQ_REQUEST_SEND_FILE: if(isDebug){ System.out.print("\n 对方要求传文件...\n>"); System.out.print(chattingName + ">"); } break; case QQEvent.QQ_ACCEPT_SEND_FILE: break; case QQEvent.QQ_NOTIFY_FILE_TRANSFER_ARGS: break; case QQEvent.QQ_CANCEL_SEND_FILE: if(isDebug){ System.out.print("\n 对方取消了发送文件...\n>"); System.out.print(chattingName + ">"); } break; case QQEvent.QQ_REJECT_SEND_FILE: if(isDebug){ System.out.print("\n 对方拒绝接受文件...\n>"); System.out.print(chattingName + ">"); } break; case QQEvent.QQ_DOWNLOAD_FRIEND_REMARK_SUCCESS: processRemark(e); break; case QQEvent.QQ_BATCH_DOWNLOAD_FRIEND_REMARK_SUCCESS: processBatchRemark(e); break; } } private void processLoginSuccess(QQEvent e){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); try{ LoginReplyPacket p = (LoginReplyPacket) e.getSource(); user.setSessionKey(p.sessionKey); user.setLastLoginIp(p.lastLoginIp); user.setLoginTime(p.loginTime); user.setLastLoginTime(p.lastLoginTime); user.setServerIp(p.serverIp); user.setServerPort(p.port); user.setIp(p.ip); user.setPort(p.port); user.setClientKey(p.clientKey); String msg = "您上次在 " + sdf.format(new Date(p.lastLoginTime)) +" , 从 " +Util.getIpStringFromBytes(p.lastLoginIp)+ " 登录" + "\n 登录成功,等待状态改变." + "\n>"; System.out.print(msg); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processSignature(QQEvent e){ try{ SignatureOpReplyPacket p = (SignatureOpReplyPacket) e.getSource(); for(Signature s: p.signatures){ if(!signatures.containsKey(s.qq)) signatures.put(s.qq, s); } //还有更多,继续请求个性签名 if( (p.nextQQ-1)!=Collections.max(qqNumList)) { if(isDebug) System.out.print("请求个性签名.\n>"); requestSignature(p.nextQQ-1); } else { isSignatureOk = true; System.out.print("获取个性签名完成.\n>"); } } catch (Exception ex) { if(isDebug) ex.printStackTrace();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -