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 Trie树实现字典排序
Mar 28 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
Python实现读取并保存文件的类
May 11 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
python的socket编程入门
Jan 29 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
Django model select的多种用法详解
Jul 16 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
一个入门级python爬虫教程详解
Jan 27 Python
七个Python必备的GUI库
Apr 27 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定时执行任务设置详解
2015/02/06 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
银行实习生的自我评价
2013/12/09 职场文书
yy结婚证婚词
2014/01/10 职场文书
社区活动策划方案
2014/08/21 职场文书
邀请书格式范文
2015/02/02 职场文书
市场部岗位职责
2015/02/12 职场文书
员工升职自荐信
2015/03/27 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
乔迁新居祝福语
2019/11/04 职场文书
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL