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 urlopen 使用小示例
Sep 06 Python
《Python之禅》中对于Python编程过程中的一些建议
Apr 03 Python
Python计算三维矢量幅度的方法
Jun 15 Python
Django与遗留的数据库整合的方法指南
Jul 24 Python
深入理解Python装饰器
Jul 27 Python
matplotlib设置legend图例代码示例
Dec 19 Python
python的内存管理和垃圾回收机制详解
May 18 Python
使用python制作一个解压缩软件
Nov 13 Python
解决Python二维数组赋值问题
Nov 28 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
Python使用pyyaml模块处理yaml数据
Apr 14 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 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
php whois查询API制作方法
2011/06/23 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
为数据添加append,remove功能
2006/10/03 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
几个SQL的面试题
2014/03/08 面试题
冬季安全检查方案
2014/05/23 职场文书
员工工作能力评语
2014/12/31 职场文书
工作自我评价范文
2015/03/05 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript