使用地址:   ymlkl.jsp.fjjsp.net/wchat/index.do

使用的微信网页版接口来源自 gaosen的python 脚本  ,地址: https://github.com/0x5e/wechat-deleted-friends

gaosen的python代码中在拉取微信通讯录的好友接口上没有加上相关的认证参数,导致该python代码查找结果不正确,读取不了微信通讯录,始终显示 “通讯录0个好友”

此java版改正了这个错误

同时为了方便使用,避免安装java环境的限制,做成了网页版 ,PC上打开网页扫码就可以使用(查找时间较长,前端使用ajax轮询来更新后台的查找信息)

使用地址:   ymlkl.jsp.fjjsp.net/wchat/index.do


查找原理为通过微信网页版接口新建群聊并自动拉取好友,加不进来就是删除了你
(不在群聊里讲话,别人是看不见的~并不打扰好友)

主要接口通信源码:

package com.toltech.wchat.process;import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import org.apache.commons.lang.StringUtils;
import org.apache.http.client.ClientProtocolException;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.toltech.wchat.bean.Member;
import com.toltech.wchat.utils.HttpUtils;public class Client {private final static int MAX_GROUP_NUM = 35; // 每组人数private final static int INTERFACE_CALLING_INTERVAL = 30000; // 接口调用时间间隔,// 间隔太短容易出现"操作太频繁",// 会被限制操作半小时左右private final static int MAX_PROGRESS_LEN = 50;static int tip = 0;static String uuid;static String base_uri;static String redirect_uri;static String push_uri;static String skey;static String wxsid;static String wxuin;static String pass_ticket;static String deviceId = "e000000000000000";static String baserequest;static List<Member> memberList;static String my;static List<Member> allDeletedList =new ArrayList<Member>();public static void main(String[] args) throws Exception {try {if (getUUID()) {showQRImage();waitForLogin();while (!"200".equals(waitForLogin())) {}if (login()) {if (webwxinit()) {webwxgetcontact();int memberCount =memberList.size();System.err.println("通讯录共有"+memberCount+"好友");System.out.println("开始查找...");String chatRoomName =null;int group_num =memberCount/MAX_GROUP_NUM;if(memberCount% MAX_GROUP_NUM !=0)group_num+=1;for (int i=0;i<group_num;i++) {Map<String, Object> map=null;List<Member> userNames =new ArrayList<Member>();for(int j=0;j<MAX_GROUP_NUM;j++){if (i * MAX_GROUP_NUM + j >= memberCount)break;Member member = memberList.get(i * MAX_GROUP_NUM + j);userNames.add(member);}//新建群组/添加成员if(chatRoomName ==null){map  = createChatroom(userNames);chatRoomName = map.get("chatRoomName").toString();}elsemap =addMember(chatRoomName, userNames);List<Member> deletedList = (List<Member>) map.get("deletedList");allDeletedList.addAll(deletedList);// 删除成员deleteMember(chatRoomName, userNames);// 进度条System.out.println("新发现你被" +deletedList.size()+"人删除");if (i != group_num - 1){System.out.println("正在继续查找,请耐心等待...");//下一次进行接口调用需要等待的时间Thread.sleep(INTERFACE_CALLING_INTERVAL);}}int deleteCount =allDeletedList.size();System.out.println("结果汇总完毕,20s后可以重试");System.out.println("被删除的好友列表,共"+deleteCount +"人");for (Member member : allDeletedList) {for (Member mem : memberList) {if(member.getUserName().equals(mem.getUserName()))System.err.println(mem.getNickName()+"("+mem.getRemarkName()+")"); }}}}}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static boolean getUUID() throws Exception {StringBuffer url = new StringBuffer();url.append("https://login.weixin.qq.com/jslogin?");url.append("appid=wx782c26e4c19acffb");url.append("&fun=new");url.append("&lang=zh_CN");url.append("&_=" + String.valueOf(System.currentTimeMillis()));String data = HttpUtils.httpGet(url.toString());if (StringUtils.isNotBlank(data)) {String code = data.substring(data.indexOf("= ") + 1,data.indexOf(";"));uuid = data.substring(data.indexOf("\"") + 1,data.lastIndexOf("\""));System.out.println("code:" + code + ";uuid:" + uuid);if ("200".equals(code.trim()))return true;}return false;}public static void showQRImage() throws IOException {String url = "https://login.weixin.qq.com/qrcode/" + uuid;url = url + "?t=webwx&_=";url = url + String.valueOf(System.currentTimeMillis());String filename = HttpUtils.getImage(url);tip = 1;Runtime.getRuntime().exec("rundll32 c:\\Windows\\System32\\shimgvw.dll,ImageView_Fullscreen "+ filename);}public static String waitForLogin() throws Exception {StringBuffer url = new StringBuffer();url.append("https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?");url.append("tip=" + tip);url.append("&uuid=" + uuid);url.append("&_=" + String.valueOf(System.currentTimeMillis()));String data = HttpUtils.httpGet(url.toString());String code = data.substring(data.indexOf("=") + 1, data.indexOf(";")).trim();System.err.println(code);if ("201".equals(code)) {System.out.println("成功扫描,请在手机上点击确认以登录");} else if ("200".equals(code)) {System.out.println("正在登陆...");redirect_uri = data.substring(data.indexOf("\"") + 1,data.lastIndexOf("\""))+ "&fun=new";base_uri = redirect_uri.substring(0, redirect_uri.lastIndexOf("/"));String[][] services = { { "wx2.qq.com", "webpush2.weixin.qq.com" },{ "qq.com", "webpush.weixin.qq.com" },{ "web1.wechat.com", "webpush1.wechat.com" },{ "web2.wechat.com", "webpush2.wechat.com" },{ "wechat.com", "webpush.wechat.com" },{ "web1.wechatapp.com", "webpush1.wechatapp.com" } };push_uri = base_uri;for (String[] strings : services) {if (base_uri.indexOf(strings[0]) > -1) {push_uri = "https://" + strings[1] + "/cgi-bin/mmwebwx-bin";break;}}}return code;}public static boolean login() throws Exception {System.out.println("登录:" + redirect_uri);String data = HttpUtils.httpGet(redirect_uri);SAXBuilder saxBuilder = new SAXBuilder();StringReader reader = new StringReader(data);Document document = saxBuilder.build(reader);Element root = document.getRootElement();Element ret = root.getChild("ret");if ("0".equals(ret.getText())) {wxuin = root.getChild("wxuin").getText();wxsid = root.getChild("wxsid").getText();skey = root.getChild("skey").getText();pass_ticket = root.getChild("pass_ticket").getText();JSONObject j = new JSONObject();j.put("Uin", wxuin);j.put("Sid", wxsid);j.put("Skey", skey);j.put("DeviceID", deviceId);baserequest = j.toString();return true;}return false;}public static boolean webwxinit() throws Exception {String json = "{\"BaseRequest\":" + baserequest + "}";StringBuffer url = new StringBuffer();url.append(base_uri);url.append("/webwxinit?pass_ticket=" + pass_ticket);url.append("&skey=" + skey);url.append("&r=" + String.valueOf(System.currentTimeMillis()));String data = HttpUtils.postJson(url.toString(), json);System.out.println(data);JSONObject result = JSON.parseObject(data);my = result.getString("User");if ("0".equals(JSON.parseObject(result.getString("BaseResponse")).getString("Ret")))return true;return false;}public static void webwxgetcontact() throws ClientProtocolException,IOException {String json = "{\"BaseRequest\":" + baserequest + "}";StringBuffer url = new StringBuffer();url.append(base_uri);url.append("/webwxgetcontact?pass_ticket=" + pass_ticket);url.append("&skey=" + skey);url.append("&r=" + String.valueOf(System.currentTimeMillis()));String data = HttpUtils.postJson(url.toString(), json);String memberListString = JSONObject.parseObject(data).getString("MemberList");memberList = JSON.parseArray(memberListString, Member.class);// 倒序遍历,不然删除的时候出问题..String[] specialUsers = { "newsapp", "fmessage", "filehelper", "weibo","qqmail", "tmessage", "qmessage", "qqsync", "floatbottle","lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp","blogapp", "facebookapp", "masssendapp", "meishiapp","feedsapp", "voip", "blogappweixin", "weixin","brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11","gh_22b87fa7cb3c", "officialaccounts", "notification_messages","wxitil", "userexperience_alarm" };Iterator<Member> it = memberList.iterator();while(it.hasNext()){Member member = it.next();if((member.getVerifyFlag() & 8) != 0)//# 公众号/服务号it.remove();else if(member.getUserName().indexOf("@@")>-1)//# 群聊it.remove();else if(member.getUserName().equals(JSONObject.parseObject(my).getString("UserName")))//自己it.remove();else{for (String string : specialUsers) {if(member.getUserName().equals(string)){it.remove();break;}}}}}public static Map<String,Object> createChatroom(List<Member> userNames) throws ClientProtocolException, IOException{Map<String,Object> map = new HashMap<String,Object>();StringBuffer memberList=new StringBuffer();for (Member member : userNames) {memberList.append("{\"UserName\":\""+ member.getUserName()+"\"},");}StringBuffer url = new StringBuffer();url.append(base_uri);url.append("/webwxcreatechatroom?pass_ticket=" + pass_ticket);url.append("&skey=" + skey);url.append("&r=" + String.valueOf(System.currentTimeMillis()));String json = "{\"BaseRequest\":" + baserequest + "," + "\"MemberCount\":"+userNames.size() +",\"MemberList\":["+memberList.toString().substring(0, memberList.toString().length()-1) +"],\"Topic\": \"\"}";System.err.println(json);String data = HttpUtils.postJson(url.toString(), json);String chatRoomName = JSONObject.parseObject(data).getString("ChatRoomName");System.out.println(data);map.put("chatRoomName", chatRoomName);List<Member> memlists = JSON.parseArray(JSONObject.parseObject(data).getString("MemberList"),Member.class);List<Member> deletedList = new ArrayList<Member>();List<Member> blockedList = new ArrayList<Member>();if(memlists!=null && memlists.size()>0){for (Member member : memlists) {if(member.getMemberStatus()==4)// 被对方删除了deletedList.add(member);else if(member.getMemberStatus()==3)// 被加入黑名单blockedList.add(member);}}map.put("deletedList", deletedList);map.put("blockedList", blockedList);return map;}public static boolean deleteMember(String chatRoomName, List<Member> userNames) throws ClientProtocolException, IOException{StringBuffer url = new StringBuffer();url.append(base_uri);url.append("/webwxupdatechatroom?fun=delmember&pass_ticket=" + pass_ticket);StringBuffer members = new StringBuffer();for (Member member : userNames) {members.append(userNames+",");}String memberlist = members.toString().substring(0,members.toString().length()-1);String json = "{\"BaseRequest\":" + baserequest + "," + "\"ChatRoomName\":" +chatRoomName +",\"DelMemberList\":" +memberlist +"}";String data = HttpUtils.postJson(url.toString(), json);JSONObject result = JSON.parseObject(data);if ("0".equals(JSON.parseObject(result.getString("BaseResponse")).getString("Ret")))return true;return false;}public static Map<String,Object> addMember(String chatRoomName, List<Member> userNames) throws ClientProtocolException, IOException{Map<String,Object> map = new HashMap<String,Object>();StringBuffer url = new StringBuffer();url.append(base_uri);url.append("/webwxupdatechatroom?fun=addmember&pass_ticket=" + pass_ticket);StringBuffer members = new StringBuffer();for (Member member : userNames) {members.append(member.getUserName()+",");}String memberlist = members.toString().substring(0,members.toString().length()-1);String json = "{\"BaseRequest\":" + baserequest + "," + "\"ChatRoomName\":" +chatRoomName +",\"AddMemberList\":" +memberlist +"}";String data = HttpUtils.postJson(url.toString(), json);List<Member> memlists = JSON.parseArray(JSONObject.parseObject(data).getString("MemberList"),Member.class);List<Member> deletedList = new ArrayList<Member>();List<Member> blockedList = new ArrayList<Member>();if(memlists!=null && memlists.size()>0){for (Member member : memlists) {if(member.getMemberStatus()==4)// 被对方删除了deletedList.add(member);else if(member.getMemberStatus()==3)// 被加入黑名单blockedList.add(member);}}map.put("deletedList", deletedList);map.put("blockedList", blockedList);return map;}
}

接口通信用到的http  post 发送josn数据方法

public static String postJson(String url, String parameters) throws ClientProtocolException, IOException {DefaultHttpClient client = new DefaultHttpClient() ;client.getParams().setParameter(CoreProtocolPNames.USER_AGENT,"Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.2) Gecko/20090803 Fedora/3.5.2-2.fc11 Firefox/3.5.2");HttpPost httpPost = new HttpPost(url);System.out.println(url);if(parameters!=null){StringEntity s = new StringEntity(parameters);s.setContentEncoding("UTF-8");s.setContentType("application/json");//发送json数据需要设置contentTypehttpPost.setEntity(s);}HttpResponse response = client.execute(httpPost);HttpEntity entity = response.getEntity();return EntityUtils.toString(entity,"utf-8");}

http get请求方法

public static String httpGet(String url) throws Exception {DefaultHttpClient client = new DefaultHttpClient() ;client.getParams().setParameter(CoreProtocolPNames.USER_AGENT,"Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.2) Gecko/20090803 Fedora/3.5.2-2.fc11 Firefox/3.5.2");HttpGet get = new HttpGet(url);HttpResponse response = client.execute(get);HttpEntity entity = response.getEntity();return EntityUtils.toString(entity,"utf-8");}

java 网页版 找出删除你的微信好友(翻译修改自python脚本)相关推荐

  1. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...

    <基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc>由会员分享,可免费在线阅读全文,更多与<基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述& ...

  2. java web聊天室论文_基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc...

    基于java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc 还剩 52页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价 ...

  3. java网页版加好友功能实现思路

    刚毕业出来工作,感觉像条咸鱼...,闲来无事就写了个基于SSM的在线影院的项目,想加个类似网页版QQ的功能,包括加好友及聊天.一直不知道存放好友的数据表(t_friend)该怎么设计?按传统的设计思路 ...

  4. Java第三大的数,Java通过排序找出数组第三大数字

    Java通过排序找出数组第三大数字 1 方式一:对数组进行排序并返回第三大数字 通过对数组进行排序并返回第三大数字,我们可以找到java中的第三大数字.让我们看看完整的示例,以找到java数组中的第三 ...

  5. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...

    基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述 本科生毕业论文(设计) 题 目: 基于Java网页版聊天室的设计与实现 姓 名:学 院: 理学院 专 业: 信息与计算科学 班 级: 信 ...

  6. java 算法之找出数组中第二大的数

    1.如果仅考虑实现功能而不考虑效率,可以先通过排序算法将数组排序,然后根据数组下标来访问数组中第二大的数,,最快的排序算法一般为快速排序算法,但是其时间复杂度为(nlogn),根据下标访问需要便利一遍 ...

  7. python批量删除微信好友_我用Python找出了删除我微信的所有人并将他们自动化删除了...

    不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟 )之后,缓缓拿出了手机,打开微信,找到通讯录中 ...

  8. python批量删除微信好友_我用 Python 找出了删除我微信的所有人并将他们自动化删除了...

    1. 概述 不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟)之后,缓缓拿出了手机,打开微信,找 ...

  9. Java头文件找出循环依赖_Node.js 如何找出循环依赖的文件?如何解决循环依赖问题?...

    本文重点是讲解如何解决循环依赖这个问题.关心这个问题是如何产生的,可以自行谷歌. 如何重现这个问题 // a.js const {sayB} = require('./b.js') sayB() fu ...

最新文章

  1. SQL SERVER特殊行转列案列一则
  2. 设计模式 — 行为型模式 — 中介者模式
  3. keras 模型用于预测时的注意事项
  4. ADAS方案设计成功关键:图像处理技术
  5. 如何使用Jekyll+GitHub Pages搭建个人博客站点
  6. ThreadPoolExecutor的execute源码分析
  7. mr利用mapjoin计算出每个部门的总工资以及部门名称
  8. 导入功能 php,php Excel 导入功能
  9. 中国少数民族文学馆在内蒙古呼和浩特揭幕
  10. mysql命令行大全
  11. jQuery文档操作之删除操作
  12. 了解java虚拟机mdash;串行回收器(6)
  13. Python打印杨辉三角
  14. 拯救行动 OpenJ_Bailian - 4116
  15. 全桥电路与半桥电路如何连接在一起
  16. 华三h3c系列交换机ACL实践
  17. 汕尾督办pc端和移动端
  18. Java 基本数据类型(八种基本数据类型)
  19. 证监会计算机类笔试上岸经验,2019国考证监会想妥妥上岸? 这6大考情你必须知晓...
  20. 应用层: HTTP 与 HTTPS协议

热门文章

  1. 从OBS Studio到体育直播的极速体验
  2. 重新认识数据结构:从空间占用开始
  3. linux ospf 命令,用bird 在linux netns里配置ospf两个点互相发现
  4. 图像分割之U2-Net介绍
  5. VScode连接Linux出现:Host key verification failed.过程试图写入的管道不存在。
  6. rocketmq-client-cpp简单使用
  7. TFN新款 迷彩OT
  8. hge养成类游戏《见习小恶魔威力加强版》源代码
  9. 国外问卷调查好下卡吗?
  10. GIS地理信息系统及海洋应用(赵玉新,李刚)