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中使用 Selenium 实现网页截图实例
Jul 18 Python
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
Python命令行解析模块详解
Feb 01 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 Python
使用python实现学生信息管理系统
Feb 25 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
python中%格式表达式实例用法
Jun 18 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读取文件内容的几种方法详解
2013/06/26 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
vue实现键盘输入支付密码功能
2018/08/18 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
js实现二级联动简单实例
2020/01/11 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
python图像处理之镜像实现方法
2015/05/30 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
详解Django中间件执行顺序
2018/07/16 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python 阶乘累加和的实例
2019/02/01 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
舞蹈教育学专业自荐信
2014/06/15 职场文书
应届大专生求职信
2014/06/26 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
学生会个人总结范文
2015/02/15 职场文书
民事起诉书范本
2015/05/19 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers