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 greenlet实现原理和使用示例
Sep 24 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
简单实现python进度条脚本
Dec 18 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
Python数据分析入门之数据读取与存储
May 13 Python
详解Python内置模块Collections
Mar 22 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php引用传值实例详解学习
2013/11/06 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
jcrop基本参数一览
2013/07/16 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python文件和目录操作函数小结
2014/07/11 Python
python使用psutil模块获取系统状态
2016/08/27 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python实现超市商品销售管理系统
2019/11/22 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
IRO美国官网:法国服装品牌
2018/03/06 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
远程培训的心得体会
2014/09/01 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python