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使用MONGODB入门实例
May 11 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
python分割列表(list)的方法示例
May 07 Python
python爬取各类文档方法归类汇总
Mar 22 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
Python对列表的操作知识点详解
Aug 20 Python
Django框架安装方法图文详解
Nov 04 Python
Python命令行click参数用法解析
Dec 19 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
python 如何引入协程和原理分析
Nov 30 Python
Python 实现RSA加解密文本文件
Dec 30 Python
安装不同版本的tensorflow与models方法实现
Feb 20 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php实现上传图片文件代码
2015/07/19 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
[IE&FireFox兼容]JS对select操作
2007/01/07 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
python实现人民币大写转换
2018/06/20 Python
Python netmiko模块的使用
2020/02/14 Python
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
两道JAVA笔试题
2016/09/14 面试题
民主评议政风行风整改方案
2014/09/17 职场文书
质量主管工作职责
2014/09/26 职场文书
安全员岗位职责范本
2015/04/11 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
详解mysql三值逻辑与NULL
2021/05/19 MySQL
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫