微信怎么查找谁删除你,微信快速查找删了你的人

  微信怎么查找谁删除你,微信快速查找删了你的人

  微信好友长时间不联系可能会被对方删除,但微信不会主动通知你。那我们用python写一个工具来查一下谁删了你的微信。

  

导语:

  你好,你好~边肖不知道你有没有经历过。想联系一个很久没联系的朋友,发现对方早就把你删了,而你还是一无所知。反正边肖经历过!

  每个人的微信通讯录里都有一些“僵尸粉”。他们默默的躺在联系人列表里。你以为对方还是朋友,其实对方已经把你从好友列表里删除了。怎么能筛选出这群人?

  

正文:

  写剧本之前,需要做好以下准备。

  Root后的一个Android手机或者模拟器,如果没有Root设备,建议使用网易牧牧模拟器Android开发环境,Android Studiosqlcipher图形化工具自动化工具:在Python虚拟环境下安装pocoui UI。

  整个操作分为三步,分别是破解微信数据库筛选出通讯录中的好友,模拟给好友转账获取僵尸粉数据,删除所有僵尸粉。

  

第 1 步,我们需要破解微信 App 的数据库。

  这里只是简单说说破解过程。如果想一键破解微信通讯录数据,可以跳过这一步,直接使用本文末尾提供的APK。

  首先,我们使用AndroidStudio创建一个新项目。项目初始化时,我们授予应用管理员权限,修改微信目录的读写权限。

  //微信App的目录

  公共静态最终字符串WX _根_路径=/data/data/com . Tencent . mm/;

  /**

  *执行linux指令

  *

  * @param paramString

  */

  公共静态void execRootCmd(String paramString)

  {

  尝试

  {

  process local process=runtime . get runtime()。exec(苏);

  object local object=local process . get output stream();

  data output stream localDataOutputStream=new data output stream((output stream)local object);

  string str=string . value of(paramString);

  localObject=str \ n

  localdataoutputstream . writebytes((String)local object);

  localdataoutputstream . flush();

  localdataoutputstream . writebytes( exit \ n );

  localdataoutputstream . flush();

  local process . wait for();

  local object=local process . exit value();

  } catch(异常localException)

  {

  local exception . printstacktrace();

  }

  }

  //获取权限

  ROOT utils . execrootcmd( chmod 777-R WX _根_路径);

  然后,获取微信数据库的密码。

  微信数据库的密码由设备的imei和微信的uid通过md5算法生成。

  /**

  *根据imei和uin生成的md5码,获取数据库的密码(去掉前七位的小写字母)

  *

  * @param imei

  * @param uin

  * @返回

  */

  公共静态字符串getDbPassword(字符串imei,字符串uin)

  {

  if(text utils . isempty(imei) text utils . isempty(uin))

  {

  Log.d(xag ,初始化数据库密码失败:imei或uid为空);

  返回“密码错误”;

  }

  圣

  ring md5 = MD5Utils.md5(imei + uin);

   assert md5 != null;

   return md5.substring(0, 7).toLowerCase();

  }

  接着,就可以使用 SQLCipher 依赖库来对微信数据库进行查询,我们需要为项目添加如下依赖,方便操作数据库。

  

  //我们需要对项目增加依赖

  implementation net.zetetic:android-database-sqlcipher:3.5.4@aar

  利用上面得到的密码打开加密数据库,然后查询「rcontact」表获取微信通讯录内所有的好友的微信号、昵称、用户名等数据。

  

  /**

   * 连接数据库

   * <p>

   * 常用库介绍:【rcontact】联系人表,【message】聊天消息表

   *

   * @param dbFile

   */

  private void openWxDb(File dbFile, String db_pwd)

  {

   //所有联系人

   List<Contact> contacts = new ArrayList<>();

   SQLiteDatabase.loadLibs(this);

   SQLiteDatabaseHook hook = new SQLiteDatabaseHook()

   {

   public void preKey(SQLiteDatabase database)

   {

   }

   public void postKey(SQLiteDatabase database)

   {

   atabase.rawExecSQL("PRAGMA cipher_migrate;"); //兼容2.0的数据库

   }

   };

   try

   {

   //打开数据库连接

   SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, db_pwd, null, hook);

   //查询所有联系人

   //过滤掉本人、群聊、公众号、服务号等一些联系人

   //verifyFlag != 0:公众号、服务号

   //注意黑名单用户,我-设置-隐私-通讯录黑名单

   Cursor c1 = db.rawQuery(

   "select * from rcontact where verifyFlag =0 and type not in (2,4,8,9,33,35,256,258,512,2051,32768,32770,32776,33024,65536,65792,98304) and username not like \"%@app\" and username not like \"%@qqim\" and username not like \"%@chatroom\" and encryptUsername!=\"\"",

   null);

   while (c1.moveToNext())

   {

   String userName = c1.getString(c1.getColumnIndex("username"));

   String alias = c1.getString(c1.getColumnIndex("alias"));

   String nickName = c1.getString(c1.getColumnIndex("nickname"));

   int type = c1.getInt(c1.getColumnIndex("type"));

   contacts.add(new Contact(userName, alias, nickName));

   }

   Log.d("xag", "微信通讯录中,联系人数目:" + contacts.size() + "个");

   for (int i = 0; i < contacts.size(); i++)

   {

   Log.d("xag", contacts.get(i).getNickName());

   }

   c1.close();

   db.close();

   } catch (Exception e)

   {

   Log.e("xag", "读取数据库信息失败" + e.toString());

   Toast.makeText(this, "读取微信通信录失败!", Toast.LENGTH_SHORT).show();

   }

   Toast.makeText(this, "读取微信通信录成功!", Toast.LENGTH_SHORT).show();

  }

  需要注意的是,数据库中 rcontact 表的数据比较杂乱,除了正常的好友数据,黑名单好友、已删除好友、公众号、微信群等数据也包含在内,需要我们通过 type 和 verifyFlag 字段进行筛选。

  

  为了便于 Python 操作,最后将查询的好友数据写入到 csv 文件中。

  

  /***

   * 写入数据到csv中

   * @param output_path

   * @param contacts

   */

  public static void writeCsvFile(String output_path, List<Contact> contacts)

  {

   try

   {

   File file = new File(output_path);

   //删除之前保存的文件

   if (file.exists())

   {

   file.delete();

   }

   BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));

   // 添加头部名称

   bw.write("userName" + "," + "alias" + "," + "nickName");

   bw.newLine();

   for (int i = 0; i < contacts.size(); i++)

   {

   bw.write(contacts.get(i).getUserName() + "," + contacts.get(i).getAlias() + "," + contacts.get(i).getNickName());

   bw.newLine();

   }

   bw.close();

   } catch (IOException e)

   {

   e.printStackTrace();

   }

  }

  

第 2 步,我们需要模拟给好友转账,来判断这个好友关系是否正常。

  首先,我们需要初始化 Airtest,然后利用 adb 把第 1 步生成的数据从手机里导出到本地。

  

  def __init_airtest(self):

   """

   初始化Airtest

   :return:

   """

   device_1 = Android(822QEDTL225T7)

   # device_1 = Android(emulator-5554)

   connect_device("android:///")

   self.poco = AndroidUiautomationPoco(device_1, screenshot_each_action=False)

   auto_setup(__file__)

  def export_wx_db_from_phone(target_path):

   """

   从手机中导出通信录数据

   :param target_path:

   :return:

   """

   # 微信通信录数据

   wx_db_source_path = "/data/data/com.xingag.crack_wx/wx_data.csv"

   # 导出到本地

   os.popen(adb pull %s %s % (wx_db_source_path, target_path))

  然后就是一系列自动化操作。

  打开微信,遍历好友列表,拿到每一个好友的微信号去搜索好友,跳转到好友的聊天界面。

  

  def __to_friend_chat_page(self, weixin_id):

   """

   点击到一个好友的聊天界面

   :param weixin_id:

   :param weixin_name:

   :return:

   """

   # 1、点击搜索

   element_search = self.__wait_for_element_exists(self.id_search)

   element_search.click()

   print(点击搜索)

   # 2、搜索框

   element_search_input = self.__wait_for_element_exists(self.id_search_input)

   element_search_input.set_text(weixin_id)

   # 3、搜索列表

   element_search_result_list = self.__wait_for_element_exists(self.id_search_result_list)

   # 3.1 是否存在对应的联系人,如果存在就在第一个子View布局下

   # 注意:可能出现最常用的聊天列表,这里需要进行判断

   index_tips = 0

   for index, element_search_result in enumerate(element_search_result_list.children()):

   # 联系人的Tips

   # if element_search_result_list.children()[0].offspring(self.id_contact_tips).exists():

   if element_search_result.offspring(text=self.text_contact_tips).exists():

   index_tips = index

   break

   # 4、点击第一个联系人进入聊天界面

   element_search_result_list.children()[index_tips + 1].click()

  接着尝试着给对方转账,如果好友关系正常,就会跳出一个支付页面让输入密码。

  

  def __judge_is_friend(self, weixin_id, weixin_name):

   """

   判断是不是微信好友

   :param weixin_id: 微信号

   :return:

   """

   # 尝试给好友转账,设置一个小额度,以防止刷脸直接支付了

   # 如果对方是你的好友,接下来会让你输入密码,关掉页面就行了

   # 如果对方不是你的好友,会提示不是你的好友,不能继续操作了

   # 5、点击好友界面的+按钮

   self.poco(self.id_chat_more_button).click()

   # 6、点击转账按钮

   self.poco(self.id_chat_more_container).offspring(text=self.text_chat_transfer_account_text).click()

   # 7、输入金额

   self.poco(self.id_transfer_account_input).set_text(self.money)

   # 8、点击转账按钮

   self.poco(self.id_transfer_account_container).offspring(text=self.text_chat_transfer_account_text).click()

  如果是僵尸粉,应用会弹出一个警告对话框,提示你不是收款方好友,没法完成转账的操作。

  

  通过警告对话框是否存在,就可以判断好友关系是否正常。非正常的好友关系,包含:僵尸粉、对方账号异常等。

  

  # 10.弹出警告对话框

  # 弹出好友关系不正常

  if element_transfer_account_result_button:

   # 提示内容

   ransfer_account_result_tips = self.poco(self.id_transfer_account_result_tips).get_text()

   if self.text_friend_no_tips in transfer_account_result_tips:

   print(注意!%s已经把你拉黑了!!! % weixin_name)

   self.friend_black_list.append({

   id: weixin_id,

   nickName: weixin_name

   })

   write_to_file(self.path_black_list, id:%s,nickName:%s % (weixin_id, weixin_name))

   elif self.text_friend_limit_tips in transfer_account_result_tips:

   print(%s账号收到限制!!! % weixin_name)

   write_to_file(self.path_account_limit, id:%s,nickName:%s % (weixin_id, weixin_name))

   elif self.text_friend_is_norm in transfer_account_result_tips:

   print(%s好友关系不正常!!! % weixin_name)

   write_to_file(self.path_relationship_unnormal, id:%s,nickName:%s % (weixin_id, weixin_name))

   # 点击确认按钮

   element_transfer_account_result_button.click()

   # 返回到主页面

   self.__back_to_home()

  else:

   # 包含正常好友关系和对方账号限制的情况

   print(好友关系正常)

   self.__back_to_home()

  最后,模拟点击手机的返回键,一直回退到微信主界面。

  

  def __back_to_home(self):

   """

   回退到主界面

   :return:

   """

   print(准备回退到主界面)

   home_tips = [微信, 通讯录, 发现, 我]

   while True:

   keyevent(BACK)

   is_home = False

   # 判断是否到达首页

   if self.poco(text=home_tips[0]).exists() and self.poco(text=home_tips[1]).exists() and self.poco(

   text=home_tips[2]).exists() and self.poco(text=home_tips[3]).exists():

   is_home = True

   if is_home:

   print(已经回到微信首页~)

   break

  循环上面的操作,就可以判断出哪些是僵尸粉,哪些好友的账号被限制,哪些是正常的好友关系。

  

第 3 步,删除上面获取到的僵尸粉列表。

  拿到上面的僵尸粉数据列表,就可以利用上面的方式进行一系列自动化UI 操作,删除掉这些好友。

  

  def del_friend_black(self, weixin_id):

   """

   删除黑名单好友

   :return:

   """

   # 到好友聊天界面

   self.__to_friend_chat_page(weixin_id)

   # 点击聊天界面右上角,进入到好友的详细信息界面

   self.poco(self.id_person_msg_button).click()

   # 点击好友头像

   self.poco(self.id_person_head_url).click()

   # 点击个人名片的右上角,弹出好友操作菜单

   self.poco(self.id_person_manage_menu).click()

   # 查找删除操作栏

   # 注意:对于目前主流的手机,都需要滑动到最底部才能出现【删除】这一操作栏

   self.poco.swipe([0.5, 0.9], [0.5, 0.3], duration=0.2)

   # 点击删除,弹出删除对话框

   self.poco(self.id_person_del, text=self.text_person_del).click()

   # 确定删除好友【确定删除】

   # 界面会直接回到主界面

   self.poco(self.id_person_del_sure, text=self.text_person_del).click()

  

第 4 步,结果结论

  编译 Android 项目或者直接运行 APK 就能将微信通信录的好友数据保存到项目文件目录下。

  然后运行 Python 程序会遍历通讯录好友数据,自动化去操作微信 App,接着将所有的僵尸粉写入到本地文件中,最后可以选择将这些僵尸粉全部删除掉。

  

  

结尾:

  至此,我们就完成了查找谁偷偷删了你的微信,最后大家喜欢的记得收藏

  

  到此这篇关于详解Python查找谁删了你的微信的文章就介绍到这了,更多相关Python微信好友查验内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: