Python自动采集微信联系人的实现示例


Posted in Python onFebruary 28, 2020

疫情终于有所好转了,感谢所有的为之奋斗的白衣天使们,你们是最棒的!赞!

白衣天使们在前线奋战,我们也总不能总在家里躺着做贡献,也要加强学习,争取开春有个好工作:)

Python自动采集微信联系人的实现示例

这周花了几天的时间,把Python的pywinauto相关的使用及一堆的库函数看了一遍,感觉这个库还是非常强大的。

pywinauto是什么?

pywinauto是一组用于自动化Windows GUI的python模块。简单地说,它允许您将鼠标和键盘操作发送到windows对话框和控件。这是官方的解释,简单说就是可以用python代码来操纵桌面程序。

安装

pip install pywinauto

使用

pywinauto的使用方式原理很简单,但是它提供了大量的对GUI界面元素操作的函数,需要慢慢去理解。

官方文档资料很齐全:https://pywinauto.readthedocs.io/

入门级的细节就不说了,看不懂官方英文,也可以去网上搜索,一大堆的介绍文档。

我们直接进入今天的主题:用Python采集微信联系人,先上程序执行效果视频:

Python自动采集微信联系人的实现示例

程序原理

(1)首先微信要打开,并登录成功。获取当前微信的进程ID:

PID=0
  for proc in psutil.process_iter():
    try:
      pinfo = proc.as_dict(attrs=['pid','name'])
    except psutil.NoSuchProcess:
      pass
    else:
      if 'WeChat.exe' == pinfo['name']:
        PID = pinfo['pid']

(2)使用pywinauto 连接到这个进程:

app = Application(backend='uia').connect(process=PID)
  win = app[u'微信']

(3)找到左边的“通讯录”按钮所在位置,点击鼠标:

addresslist = win.child_window(title=u"通讯录", control_type="Button")
  addresslist.draw_outline()
  cords = addresslist.rectangle()
  pywinauto.mouse.click(button='left', coords=(cords.left + 10, cords.top+10))
  win.draw_outline()

(4)核心代码,通过调用向下的键盘指令,逐个打开联系人详情页,根据详情页的页面结构,页面内的所有数据:呢称、备注、地区、微信号、来源。

#联系人
  con_list = win.child_window(title=u"联系人", control_type="List")
  pywinauto.mouse.click(button='left', coords=(cords.left + 100, cords.top+10))
  data = []
  while True:
    con_list.type_keys("{DOWN}")
    rect_edit = win.Edit2.rectangle()
    #找到联系人详情页
    if rect_edit.left > cords.left + 300:
      #整个面板 
      page = {u'呢称':'',u'备  注':'',u'地  区':'',u'微信号':'',u'来  源':''}
      #呢称
      win.Edit2.draw_outline()
      page[u'呢称'] = win.Edit2.get_value()
      #由于详情页面要素不固定,不能用控件序号来检索
      static_wxh = win.child_window(title=u"微信号", control_type="Text")
      Pane46 = static_wxh.parent().parent()
      for item in Pane46.children():
        item.draw_outline()
        lines = item.children()
        key = lines[0].window_text()
        value = lines[1].window_text()
        page[key] = value
      data.append(page)
      #最后一个联系人时停止
      if len(data) >2 and data[-2][u'微信号'] == data[-1][u'微信号']:
        data.remove(data[-1])
        saveTxt(data)
        break

第四步的方法前后优化过多次,这是最后优化的版本,这个版本是多种方案中速度最快,同时兼容性最好的方法,如果哪位朋友还有更好的方案,欢迎留言讨论!

下面附上完整代码:

#coding=gbk
'''
Created on 
@author: Administrator
'''
import psutil
import pywinauto
from pywinauto.application import Application
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
 
def getWinxin():
  PID=0
  for proc in psutil.process_iter():
    try:
      pinfo = proc.as_dict(attrs=['pid','name'])
    except psutil.NoSuchProcess:
      pass
    else:
      if 'WeChat.exe' == pinfo['name']:
        PID = pinfo['pid']
  app = Application(backend='uia').connect(process=PID)
  win = app[u'微信']
  addresslist = win.child_window(title=u"通讯录", control_type="Button")
  addresslist.draw_outline()
  cords = addresslist.rectangle()
  pywinauto.mouse.click(button='left', coords=(cords.left + 10, cords.top+10))
  win.draw_outline()
  
  #联系人
  con_list = win.child_window(title=u"联系人", control_type="List")
  pywinauto.mouse.click(button='left', coords=(cords.left + 100, cords.top+10))
  data = []
  while True:
    con_list.type_keys("{DOWN}")
    rect_edit = win.Edit2.rectangle()
    #找到联系人详情页
    if rect_edit.left > cords.left + 300:
      #整个面板 
      page = {u'呢称':'',u'备  注':'',u'地  区':'',u'微信号':'',u'来  源':''}
      #呢称
      win.Edit2.draw_outline()
      page[u'呢称'] = win.Edit2.get_value()
      #由于详情页面要素不固定,不能用控件序号来检索
      static_wxh = win.child_window(title=u"微信号", control_type="Text")
      Pane46 = static_wxh.parent().parent()
      for item in Pane46.children():
        item.draw_outline()
        lines = item.children()
        key = lines[0].window_text()
        value = lines[1].window_text()
        page[key] = value
      data.append(page)
      #最后一个联系人时停止
      if len(data) >2 and data[-2][u'微信号'] == data[-1][u'微信号']:
        data.remove(data[-1])
        saveTxt(data)
        break
def saveTxt(data):
  with open("data.txt",'ab') as f:
    f.write(u'微信号,备注,地区,来源,呢称\r\n')
    for item in data:
      f.write('%s,%s,%s,%s,%s\r\n' % (item[u'微信号'],item[u'备  注'],item[u'地  区'],item[u'来  源'],item[u'呢称']))
  os.system('notepad.exe data.txt')
if __name__ == '__main__':
  getWinxin()

到此这篇关于Python自动采集微信联系人的实现示例的文章就介绍到这了,更多相关Python自动采集微信联系人内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
python opencv3实现人脸识别(windows)
May 25 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
django从请求到响应的过程深入讲解
Aug 01 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
python处理document文档保留原样式
Sep 23 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
在python中修改.properties文件的操作
Apr 08 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
python代码实现TSNE降维数据可视化教程
Feb 28 #Python
Python range与enumerate函数区别解析
Feb 28 #Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 #Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 #Python
如何使用repr调试python程序
Feb 28 #Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 #Python
python对文件的操作方法汇总
Feb 28 #Python
You might like
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
Python模拟用户登录验证
2017/09/11 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
Python if语句知识点用法总结
2018/06/10 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
django富文本编辑器的实现示例
2019/04/10 Python
python与pycharm有何区别
2020/07/01 Python
python递归函数用法详解
2020/10/26 Python
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
体育教师自荐信范文
2013/12/16 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
领导工作表现评语
2015/01/04 职场文书
大雁塔导游词
2015/02/04 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
Window server中安装Redis的超详细教程
2021/11/17 Redis
vue封装数字翻牌器
2022/04/20 Vue.js