• Python创建微信机器人

    2019-10-11 16:48:34
    微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地,今天我们要将便是如何用Python来生成一个微信机器人,突然想起鲁迅先生曾经说过的一句话: 因为是微信机器人系列的第一篇...

    微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地,今天我们要将便是如何用Python来生成一个微信机器人,突然想起鲁迅先生曾经说过的一句话:
    在鲁迅
    因为是微信机器人系列的第一篇文章,所以猪哥会特别详细的讲解每一地方,尽量使每一位想学习的同学都能顺顺利利的开始,下面就让我们一起来做些有趣的事吧!
    聊天截图

    如何监听别人的消息?如何实现放撤回?扫描下方二维码关注微信公众号「 裸睡的猪 」回复:微信机器人 即可获取教程!

    在这里插入图片描述

    一、项目介绍

    1.微信库选择

    python关于开发微信的库主要有itchatwxpy,而wxpy底层是调用的itchat,所以如果你只是要使用的话建议使用wxpy库,它比其他的库都要优雅,更面向对象,而且深度整合了图灵机器人小i机器人;而itchat扩展性更好,如果你想自己开发一个自己的微信库那建议选itchat

    2.实现原理

    我相信有不少同学使用过微信的网页版,而wxpy(底层使用itchat)库就是模拟登录网页端,然后调用微信的api实现操作的,我们可以查看itchat源码发现。
    用户代理信息
    将代理信息放在请求头中
    总之大家记住,目前wxpyitchat都是模拟网页版微信来操作的

    3.图灵机器人

    既然可以模拟网页微信了,那又如何做到自动回复呢?这里我们就使用到了图灵机器人,大家可以在他们的官网(http://www.tuling123.com)免费注册账号,然后申请一个免费的机器人,每个人最多免费申请五个机器人。
    图灵机器人
    我会在项目代码中给一个默认的apikey,让大家不用下载就可以尝试,但是还是建议自己去申请,因为这个默认的apikey有调用次数限制,况且这算是一笔免费的财富呢!

    4.整体流程

    为了方便大家理解,猪哥给大家画了一个时序图
    机器人工作原理时序图

    二、项目代码

    先来张项目结构图压压惊:
    项目结构

    1.下载项目

    猪哥已经把项目放在了GitHub上,群里有小伙伴反馈不会使用github,这里我就详细讲一下如何从github上下载项目。

    注意:github与git不是同一个东西,github是全球最大的同性恋交友论坛,在这里我们不比颜值与财富,只比谁的项目star多,star越多也就说明你越吸引同性的喜欢与爱慕,甚至连你的同事也会爱上你!而git是项目管理工具,github上的项目就是用git来管理,项目管理工具另一派系是svn。

    交个朋友吧
    首先找到你需要下载的项目,然后点击Clone or download,然后点击右侧的复制按钮,猪哥这个项目的地址是:https://github.com/pig6/wxrobot
    复制github项目链接
    然后打开你的pycharm,选择CSV->Checkout from version control->git,然后粘贴刚才复制的项目链接。
    git下载项目
    克隆项目
    最后pycharm可能会提示你使用 新窗口打开 还是用 当前窗口 打开,猪哥一般习惯使用 新窗口(New Window) 打开,这样可以避免多个项目开发时造成混乱。

    2.下载wxpy库

    项目下载下来之后,因为没有安装必须的库wxpy,pycharm可能会有如下提示,这时我们点一下install就可以。
    缺少库提示
    如果没有出现安装库提示的话,我们可以在Setting->Project->Project Interpreter里面添加wxpy库。
    下载库
    或者使用以下命令下载wxpy库,如果你是pip3则替换下面的pip。

    pip install -U wxpy -i “https://pypi.doubanio.com/simple/”

    3.运行项目

    你可以按右上角的绿色三角形按钮,也可以右键项目然后点击run
    run
    运行之后弹出登录二维码,手机微信扫一扫点击确定登录即可和好友聊天。
    登录二维码

    三、总结

    首先感谢大家的耐心阅读,考虑到有很多零基础的同学所以文章有点长。

    猪哥来总结下这几天使用wxpy库开发微信机器人的一些感受吧!

    1. 猪哥用自己的大号测试了一周,也没有出现被封的迹象,只要不发送大量的相同信息就没问题
    2. 即使出现被封也只是会限制你微信登录网页版,手机端不影响使用,正常使用大概一两周就自动解封
    3. 最好用小号测试,一年以内注册的微信号不可以登微信网页版,也就是说不能用测试
    4. 微信网页版有些功能位阉割了,比如:添加好友,拉人入群等,因为怕微商使用机器人到处作恶所以才阉割
    5. 目前只开发了一个功能,先让大家入门,后面的功能会慢慢丰富起来
    6. 目前wxpy基于微信网页登录,很多功能无法实现,后期考虑跟换成iPad登录
    7. 图灵机器人智商有待提高
    8. 最后感谢武亚飞同学提供的微信小号

    wxpy官方文档:https://wxpy.readthedocs.io/zh/latest

    获取源码:vx扫描下方二维码,关注vx公号「裸睡的猪」,回复:微信机器人 即可获取!
    在这里插入图片描述

    展开全文
  • Python微信好友分析Demo

    2020-04-02 13:29:40
    Python微信好友分析DemoPython微信好友分析Demo【实验内容】【实验原理】【实验环境】【实验步骤】 Python微信好友分析Demo 【实验内容】 练习使用Python模块,调取微信好友接口,获取好友相关信息进行统计并可视化...

    Python微信好友分析Demo

    【实验内容】

    练习使用Python模块,调取微信好友接口,获取好友相关信息进行统计并可视化展示。

    【实验原理】

    Python:Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。

    itchat:itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。

    使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。

    pyecharts:pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。

    pandas:python的一个数据分析包,纳入了大量库和一些标准的数据模型,数据结构包含有一维数组Series、二维的表格型数据结构DataFrame、三维的数组Panel 。

    【实验环境】

    Python 3.6
    PyCharm
    anaconda3 安装见我的博客

    【实验步骤】

    1. 在终端:使用pip命令安装实验用到的Python第三方模块
    pip install itchat -i http://pypi.douban.com/simple --trusted-host pypi.douban.com   
    pip install echarts-countries-pypkg -i http://pypi.douban.com/simple --trusted-host pypi.douban.com   
    pip install echarts-china-provinces-pypkg -i http://pypi.douban.com/simple --trusted-host pypi.douban.com   
    pip install pyecharts -i http://pypi.douban.com/simple --trusted-host pypi.douban.com   
    pip install pyecharts_snapshot -i http://pypi.douban.com/simple --trusted-host pypi.douban.com  
    
    1. 开启Pycharm,选择Create New Project。在编译环境Interpreter处选择:anaconda3相应的编译环境,点击Create。
    2. 在此项目下创建Python文件
    # -*- coding: utf-8 -*-?
    import pandas as pd
    import itchat
    from pyecharts import Pie, Map, Style, Page, Bar
    # from pyecharts import configure
    # configure(global_theme='dark')
    
    # 获取联系人信息
    def get_attr(friends, key):#get_attr()函数,根据键值获取好友列表的方法:
        return list(map(lambda user: user.get(key), friends))
    
    
    # 获取联系人信息
    def get_friends():#编写get_friends()函数,使用itchat模块的get_friends()方法获取微信好友信息:
        # 连接微信登陆的入口,hotReload记住登陆状态
        itchat.auto_login(hotReload=True)
        # 获取微信好友列表
        friends = itchat.get_friends()
        # 获取好友信息
        users = dict(province=get_attr(friends, "Province"),  # 省份
                     # city=get_attr(friends, "City"),  # 城市
                     nickname=get_attr(friends, "NickName"),  # 昵称
                     sex=get_attr(friends, "Sex"),  # 性别
                     signature=get_attr(friends, "Signature"),  # 签名
                     remarkname=get_attr(friends, "RemarkName"),  # 备注名称
                     pyquanpin=get_attr(friends, "PYQuanPin"),  # 全拼
                     displayname=get_attr(friends, "DisplayName"),  # 显示名称
                     isowner=get_attr(friends, "IsOwner"))  # 所有者
        return users
    
    
    # 获取联系人性别
    def sex_stats(users):#编写sex_stats()函数和prov_stats()函数,从读取到的好友信息中提取并统计好友性别及所在省份:
        # 将数据格式化
        df = pd.DataFrame(users)
        # 将性别信息提取出来
        sex_arr = df.groupby(['sex'], as_index=True)['sex'].count()
        # 将提取出来的性别信息转化为我们需要的格式
        data = dict(zip(list(sex_arr.index), list(sex_arr)))
        # 因为微信接口性别给的是:0、1、2,所以需要我们自己将其转化
        data['None'] = data.pop(0)
        data['Male'] = data.pop(1)
        data['Female'] = data.pop(2)
        return data.keys(), data.values()
    
    
    # 获取联系人省份
    def prov_stats(users):
        # 将数据格式化
        prv = pd.DataFrame(users)
        # 将省份信息提取出来
        prv_cnt = prv.groupby('province', as_index=True)['province'].count().sort_values()
        # 将提取出来的省份信息转化为我们需要的格式
        attr = list(map(lambda x: x if x != '' else 'None', list(prv_cnt.index)))
        return attr, list(prv_cnt)
        # 将数据格式化
        df = pd.DataFrame(users)
        # 将城市信息提取出来
        data = df.query('province == "Beijing"')
        res = data.groupby('city', as_index=True)['city'].count().sort_values()
        # 将提取出来的城市信息转化为我们需要的格式
        attr = list(map(lambda x: '%sDistrict' % x if x != '' else 'None', list(res.index)))
        return attr, list(res)
    
    
    # 生成图表
    def create_charts():#得到我们需要的信息后,现在开始创建图表,编写create_charts()函数,根据统计数据分别绘制“微信好友性别比例饼状图”、“好友分布-中国地图”和“好友分布-柱状图”
        users = get_friends()
        page = Page()
        style = Style(width=1100, height=600)
        style_middle = Style(width=900, height=500)
        #############################
        data = sex_stats(users)
        attr, value = data
        chart = Pie('Sex Ratio of WeChat Friends-Pie Chart')  # title_pos='center'
        # chart.use_theme('chalk')
        # 添加数据
        chart.add('', attr, value, center=[50, 50],
                  radius=[30, 70], is_label_show=True, legend_orient='horizontal', legend_pos='center',
                  legend_top='bottom', is_area_show=True)
        # 生成图片
        page.add(chart)
        #############################
        data = prov_stats(users)
        attr, value = data
        chart = Map('Friends Distribution-Map of China', **style.init_style)
        # chart.use_theme('chalk')
        chart.add('', attr, value, is_label_show=True, is_visualmap=True, visual_text_color='#001')
        page.add(chart)
        chart = Bar('Friends Distribution-Bar Chart', **style_middle.init_style)
        # chart.use_theme('chalk')
    
        chart.add('', attr, value, is_stack=True, label_pos='top', is_datazoom_show=True, is_label_show=True)
        # 生成图片
        page.add(chart)
        page.render()
    
    
    if __name__ == '__main__':
        create_charts()
        users = get_friends()
    
    
    
    1. 右键运行WeiXinFX.py,会弹出一个二维码的网页,使用微信“扫一扫”功能,登录微信网页版后,关闭该二维码网页。等待程序运行完成,我们可以看到在文件夹下生成了render.html。找到render.html文件,双击打开。
    展开全文
  • python编写的微信僵尸好友检测工具
  • 这是一个基于pyqt的微信PC客户端,通过itchat微信接口登录微信,获取联系人和讨论组,收发消息
  • python实现微信聊天机器人 具备基础:会编程就ok 电脑环境:已经安装过python,在命令行输入python能成功就行 在准备工作做完之后,就可以进入正式开发了,其实这个程序主要是使用了图灵机器人的接口,你...

    python实现微信聊天机器人

    具备基础:会编程就ok

    电脑环境:已经安装过python,在命令行输入python能成功就行

    [外链图片转存失败(img-CuiDMIDq-1564199551669)(https://i.imgur.com/QKI2P0I.jpg)]


    在准备工作做完之后,就可以进入正式开发了,其实这个程序主要是使用了图灵机器人的接口,你所有的回复内容是通过图灵机器人进行的,而我们所做的就是使用python调用相应函数就行了。

    1. 安装wxpy

    安装wxpy就相当于java中的安装一个jar一样,你从网上下载下来安装也可以,或者直接使用pip安装也行,这里推荐用pip安装,你也可以自行百度,反正能够安装上wxpy就行了,使用pip安装,则在命令行输入

    pip install wxpy
    

    2.申请图灵机器人

    自行进入http://www.tuling123.com/这个网站进行注册,然后得到找到一个apikey:xxxxxxxxxx,这个号码以后再程序中需要使用。
    ###3. 程序书写
    有了上面的两步,则基本的内容已经有了,现在只需要写代码,然后使用图灵机器人就行了。其中wxpy的作用就是进行微信的操作,比如微信的登录,以及与微信朋友的聊天等,而图灵机器人的作用主要是根据根据你的聊天内容输入(wxpy获得),然后产生一个聊天内容的输出。

    3.1 使用wxpy登陆微信

    这个需要用到wxpy这个库,所以需要from wxpy import * ,然后使用bot = Bot(cache_path=True),就可以进行登陆了(会弹出来一个二维码),那个参数用来设置可以缓存,这样不用每次登陆都扫码了。
    登录之后,你就可以通过bot来找到好友

    found = bot.friends().search('xx')
    

    其中xx代表好友备注。

    3.2 绑定聊天

    在登录并且找到好友后就可以进行聊天了,这里用到了@bot.register(),这个就是把下面的函数绑定,然后如果微信好友发消息的话,就会调用该函数,所以你可以在该函数里面写相关的聊天代码。

    @bot.register(found)
    def message(msg): 
        ret = “你好”  
        return ret
    

    这个里面的found就是你上面查找到的好友,这里就是把他们绑定在一起了,之后就可以自动帮你回复了,ret就是回复的内容,而msg中就存储的是好友发送的内容。

    notice:因为这个程序需要等待别人发送消息来,所以需要在后面加上embed(),相当于程序阻塞在那里,要不然程序一下就运行完了,就不能持续接发消息了。

    3.3 使用图灵机器人回复消息

    上面虽然能回复消息了,但是回复的内容很单一,所以这里就需要使用图灵机器人进行内容处理了。在这里定义一个函数专门根据对方的msg来返回消息。

    def reply(text):  
        url = "http://www.tuling123.com/openapi/api"  
        api_key="xxxxxxxx"  
        payload={  
            "key":api_key,  
            "info":text,  
            "userid":"666"  
            }  
        r = requests.post(url,data=json.dumps(payload))  
        result = json.loads(r.content)  
        if ('url' in result.keys()):  
            return result["text"]+result["url"]  
        else:  
            return result["text"]  
    

    该函数用到了json和requests所以记得import,功能就是用json进行数据传输,把你接收到的msg转换成一个回复。
    有了这个函数,你上面的聊天代码就可以修改为

    ret = reply(msg.text)
    

    这样的话,他的回复内容就是图灵机器人所做的了,你就不需要关心了。

    4. 代码

    	'''
    	Created on 2018年5月18日
    	@author: Administrator
    	'''
    	"#codeing=utf-8"
    	import json  
    	import requests  
    	from wxpy import *  
    	
    	def reply(text):  
    	    url = "http://www.tuling123.com/openapi/api"  
    	    api_key="xx"  
    	    payload={  
    	        "key":api_key,  
    	        "info":text,  
    	        "userid":"666"  
    	        }  
    	    r = requests.post(url,data=json.dumps(payload))  
    	    result = json.loads(r.content)  
    	    if ('url' in result.keys()):  
    	        return ""+result["text"]+result["url"]  
    	    else:  
    	        return ""+result["text"]  
    	
    	
    	bot = Bot(cache_path=True) #登录缓存  
    	print('小新上线')  
    	found = bot.friends().search('xx')
    	print(found)
    
    	@bot.register(found)
    	def message(msg): 
    	    ret = reply(msg.text)  
    	    return ret
    
    	@bot.register(found)
    	def forward_message(msg):  
    	    ret = reply(msg.text)  
    	    return ret 
    	embed()
    
    

    欢迎大家关注我的微信公众号,未来上面会推送python 机器学习 算法学习 深度学习 论文阅读 以及偶尔的小鸡汤等内容。ようこそいらっしゃい!

    搜索 coderwangson 关注

    image

    展开全文
  • 先贴出完整源代码。 代码中:使用二维码登录网页...来实现:强制获取微信好友列表信息开发(一)提取微信好友数据 import os import requests import re import time import xml.dom.minidom import json import...

    先贴出完整源代码。

    代码中:使用二维码登录网页版微信,并下载好友头像,并将好友资料数据存入csv文件,待进一步处理。

    笔者使用的环境为python3.5。来实现:强制获取微信好友列表信息开发(一)提取微信好友数据

    import os
    import requests
    import re
    import time
    import xml.dom.minidom
    import json
    import csv
    import codecs
    import sys
    import math
    import subprocess
    import ssl
    import threading
    import urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse
     
    DEBUG = False  # 测试时候 可以改为True,输出测试的json数据
     
    MAX_GROUP_NUM = 2  # 每组人数
    INTERFACE_CALLING_INTERVAL = 5  # 接口调用时间间隔, 间隔太短容易出现"操作太频繁", 会被限制操作半小时左右
    MAX_PROGRESS_LEN = 50
     
    QRImagePath = os.path.join(os.getcwd(), 'qrcode.jpg')  # 存放登录二维码的位置,不需要改
     
    tip = 0
    uuid = ''
     
    base_uri = ''
    redirect_uri = ''
    push_uri = ''
     
    skey = ''
    wxsid = ''
    wxuin = ''
    pass_ticket = ''
    deviceId = 'e000000000000000'
     
    BaseRequest = {}
     
    ContactList = []
    My = []
    SyncKey = []
     
    try:
        xrange
        range = xrange
    except:
        # python 3
        pass
     
     
    def responseState(func, BaseResponse):
        ErrMsg = BaseResponse['ErrMsg']
        Ret = BaseResponse['Ret']
        if DEBUG or Ret != 0:
            print('func: %s, Ret: %d, ErrMsg: %s' % (func, Ret, ErrMsg))
     
        if Ret != 0:
            return False
     
        return True
     
     
    def getUUID():
        global uuid
     
        url = 'https://login.weixin.qq.com/jslogin'
        params = {
            'appid': 'wx782c26e4c19acffb',
            'fun': 'new',
            'lang': 'zh_CN',
            '_': int(time.time()),
        }
     
        r = myRequests.get(url=url, params=params)
        r.encoding = 'utf-8'
        data = r.text
     
        # print(data)
     
        # window.QRLogin.code = 200; window.QRLogin.uuid = "oZwt_bFfRg==";
        regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"'
        pm = re.search(regx, data)
     
        code = pm.group(1)
        uuid = pm.group(2)
     
        if code == '200':
            return True
     
        return False
     
     
    def showQRImage():
        global tip
     
        url = 'https://login.weixin.qq.com/qrcode/' + uuid
        params = {
            't': 'webwx',
            '_': int(time.time()),
        }
     
        r = myRequests.get(url=url, params=params)
     
        tip = 1
     
        f = open(QRImagePath, 'wb')
        f.write(r.content)
        f.close()
        time.sleep(1)
     
        if sys.platform.find('darwin') >= 0:  # 'darwin'
            subprocess.call(['open', QRImagePath])
        elif sys.platform.find('linux') >= 0:
            subprocess.call(['xdg-open', QRImagePath])
        else:
            os.startfile(QRImagePath)
     
        print('请使用微信扫描二维码以登录')
     
     
    def waitForLogin():
        global tip, base_uri, redirect_uri, push_uri
     
        url = 'https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=%s&uuid=%s&_=%s' % (
            tip, uuid, int(time.time()))
     
        r = myRequests.get(url=url)
        r.encoding = 'utf-8'
        data = r.text
     
        # print(data)
     
        # window.code=500;
        regx = r'window.code=(\d+);'
        pm = re.search(regx, data)
     
        code = pm.group(1)
     
        if code == '201':  # 已扫描
            print('成功扫描,请在手机上点击确认以登录')
            tip = 0
        elif code == '200':  # 已登录
            print('正在登录...')
            regx = r'window.redirect_uri="(\S+?)";'
            pm = re.search(regx, data)
            redirect_uri = pm.group(1) + '&fun=new'
            base_uri = redirect_uri[:redirect_uri.rfind('/')]
     
            # push_uri与base_uri对应关系(排名分先后)(就是这么奇葩..)
            services = [
                ('wx2.qq.com', 'webpush2.weixin.qq.com'),
                ('qq.com', 'webpush.weixin.qq.com'),
                ('web1.wechat.com', 'webpush1.wechat.com'),
                ('web2.wechat.com', 'webpush2.wechat.com'),
                ('wechat.com', 'webpush.wechat.com'),
                ('web1.wechatapp.com', 'webpush1.wechatapp.com'),
            ]
            push_uri = base_uri
            for (searchUrl, pushUrl) in services:
                if base_uri.find(searchUrl) >= 0:
                    push_uri = 'https://%s/cgi-bin/mmwebwx-bin' % pushUrl
                    break
     
            # closeQRImage
            if sys.platform.find('darwin') >= 0:  # for OSX with Preview
                os.system("osascript -e 'quit app \"Preview\"'")
        elif code == '408':  # 超时
            pass
        # elif code == '400' or code == '500':
     
        return code
     
     
    def login():
        global skey, wxsid, wxuin, pass_ticket, BaseRequest
     
        r = myRequests.get(url=redirect_uri)
        r.encoding = 'utf-8'
        data = r.text
     
        # print(data)
     
        doc = xml.dom.minidom.parseString(data)
        root = doc.documentElement
     
        for node in root.childNodes:
            if node.nodeName == 'skey':
                skey = node.childNodes[0].data
            elif node.nodeName == 'wxsid':
                wxsid = node.childNodes[0].data
            elif node.nodeName == 'wxuin':
                wxuin = node.childNodes[0].data
            elif node.nodeName == 'pass_ticket':
                pass_ticket = node.childNodes[0].data
     
        # print('skey: %s, wxsid: %s, wxuin: %s, pass_ticket: %s' % (skey, wxsid,
        # wxuin, pass_ticket))
     
        if not all((skey, wxsid, wxuin, pass_ticket)):
            return False
     
        BaseRequest = {
            'Uin': int(wxuin),
            'Sid': wxsid,
            'Skey': skey,
            'DeviceID': deviceId,
        }
     
        return True
     
     
    def webwxinit():
        url = (base_uri +
               '/webwxinit?pass_ticket=%s&skey=%s&r=%s' % (
                   pass_ticket, skey, int(time.time())))
        params = {'BaseRequest': BaseRequest}
        headers = {'content-type': 'application/json; charset=UTF-8'}
     
        r = myRequests.post(url=url, data=json.dumps(params), headers=headers)
        r.encoding = 'utf-8'
        data = r.json()
     
        if DEBUG:
            f = open(os.path.join(os.getcwd(), 'webwxinit.json'), 'wb')
            f.write(r.content)
            f.close()
     
        # print(data)
     
        global ContactList, My, SyncKey
        dic = data
        ContactList = dic['ContactList']
        My = dic['User']
        SyncKey = dic['SyncKey']
     
        state = responseState('webwxinit', dic['BaseResponse'])
        return state
     
     
    def webwxgetcontact():
        url = (base_uri +
               '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (
                   pass_ticket, skey, int(time.time())))
        headers = {'content-type': 'application/json; charset=UTF-8'}
     
        r = myRequests.post(url=url, headers=headers)
        r.encoding = 'utf-8'
        data = r.json()
     
        if DEBUG:
            f = open(os.path.join(os.getcwd(), 'webwxgetcontact.json'), 'wb')
            f.write(r.content)
            f.close()
     
        dic = data
        MemberList = dic['MemberList']
     
        # 倒序遍历,不然删除的时候出问题..
        SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync",
                        "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp",
                        "masssendapp",
                        "meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder",
                        "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil",
                        "userexperience_alarm"]
        for i in range(len(MemberList) - 1, -1, -1):
            Member = MemberList[i]
            if Member['VerifyFlag'] & 8 != 0:  # 公众号/服务号
                MemberList.remove(Member)
            elif Member['UserName'] in SpecialUsers:  # 特殊账号
                MemberList.remove(Member)
            elif Member['UserName'].find('@@') != -1:  # 群聊
                MemberList.remove(Member)
            elif Member['UserName'] == My['UserName']:  # 自己
                MemberList.remove(Member)
     
        return MemberList
     
     
    def syncKey():
        SyncKeyItems = ['%s_%s' % (item['Key'], item['Val'])
                        for item in SyncKey['List']]
        SyncKeyStr = '|'.join(SyncKeyItems)
        return SyncKeyStr
     
     
    def syncCheck():
        url = push_uri + '/synccheck?'
        params = {
            'skey': BaseRequest['Skey'],
            'sid': BaseRequest['Sid'],
            'uin': BaseRequest['Uin'],
            'deviceId': BaseRequest['DeviceID'],
            'synckey': syncKey(),
            'r': int(time.time()),
        }
     
        r = myRequests.get(url=url, params=params)
        r.encoding = 'utf-8'
        data = r.text
     
        # print(data)
     
        # window.synccheck={retcode:"0",selector:"2"}
        regx = r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}'
        pm = re.search(regx, data)
     
        retcode = pm.group(1)
        selector = pm.group(2)
     
        return selector
     
     
    def webwxsync():
        global SyncKey
     
        url = base_uri + '/webwxsync?lang=zh_CN&skey=%s&sid=%s&pass_ticket=%s' % (
            BaseRequest['Skey'], BaseRequest['Sid'], urllib.parse.quote_plus(pass_ticket))
        params = {
            'BaseRequest': BaseRequest,
            'SyncKey': SyncKey,
            'rr': ~int(time.time()),
        }
        headers = {'content-type': 'application/json; charset=UTF-8'}
     
        r = myRequests.post(url=url, data=json.dumps(params))
        r.encoding = 'utf-8'
        data = r.json()
     
        # print(data)
     
        dic = data
        SyncKey = dic['SyncKey']
     
        state = responseState('webwxsync', dic['BaseResponse'])
        return state
     
     
    def heartBeatLoop():
        while True:
            selector = syncCheck()
            if selector != '0':
                webwxsync()
            time.sleep(1)
     
     
    def main():
        global myRequests
     
        if hasattr(ssl, '_create_unverified_context'):
            ssl._create_default_https_context = ssl._create_unverified_context
     
        headers = {
            'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36'}
        myRequests = requests.Session()
        myRequests.headers.update(headers)
     
        if not getUUID():
            print('获取uuid失败')
            return
     
        print('正在获取二维码图片...')
        showQRImage()
     
        while waitForLogin() != '200':
            pass
     
        os.remove(QRImagePath)
     
        if not login():
            print('登录失败')
            return
     
        if not webwxinit():
            print('初始化失败')
            return
     
        MemberList = webwxgetcontact()
     
        threading.Thread(target=heartBeatLoop)
     
        MemberCount = len(MemberList)
        print('通讯录共%s位好友' % MemberCount)
        print(MemberList)
     
        d = {}
        imageIndex = 0
        # 写入csv
        csvfile = open('friend2.csv', 'w', newline='') 
        # csvfile.write(codecs.BOM_UTF8)
        writer = csv.writer(csvfile)
        writer.writerow(['name', 'city', 'male', 'star', 'signature', 'remark', 'alias', 'nick'])
        for Member in MemberList:
            global writer
            imageIndex = imageIndex + 1
            name = 'D:\\Python\\Demo\\image\\image' + str(imageIndex) + '.jpg'
            imageUrl = 'https://wx.qq.com' + Member['HeadImgUrl']
            r = myRequests.get(url=imageUrl, headers=headers)
            imageContent = (r.content)
            fileImage = open(name, 'wb')
            fileImage.write(imageContent)
            fileImage.close()
            print('正在下载第:' + str(imageIndex) + '位好友头像')
            d[Member['UserName']] = (Member['NickName'], Member['RemarkName'])
            city = Member['City']
            city = 'nocity' if city == '' else  city
            name = Member['NickName']
            name = 'noname' if name == '' else  name
            sign = Member['Signature']
            sign = 'nosign' if sign == '' else  sign
            remark = Member['RemarkName']
            remark = 'noremark' if remark == '' else remark
            alias = Member['Alias']
            alias = 'noalias' if alias == '' else alias
            nick = Member['NickName']
            nick = 'nonick' if nick == '' else nick
            print(name, '  ^+*+^  ', city, '  ^+*+^  ', Member['Sex'], ' ^+*+^ ', Member['StarFriend'], ' ^+*+^ ', sign,
                  ' ^+*+^ ', remark, ' ^+*+^ ', alias, ' ^+*+^ ', nick)
            # 写入csv
            writer.writerow([name.encode('gbk', 'ignore').decode('gbk'), city.encode('gbk', 'ignore').decode('gbk'),
                             Member['Sex'],
                             Member['StarFriend'], sign.encode('gbk', 'ignore').decode('gbk'),
                             remark.encode('gbk', 'ignore').decode('gbk'),
                             alias.encode('gbk', 'ignore').decode('gbk'),
                             nick.encode('gbk', 'ignore').decode('gbk')])
        csvfile.close()
     
    if __name__ == '__main__':
        main()
        print('程序已安全退出...')

    简单讲几点:

    一、写入csv文件编码问题

          在上一篇文章中以及解释了。

    二、登录出现问题

          没有找到系统,在120行左右:

        if sys.platform.find('darwin') >= 0:  # 'darwin'
            subprocess.call(['open', QRImagePath])
        elif sys.platform.find('linux') >= 0:
            subprocess.call(['xdg-open', QRImagePath])
        else:
            os.startfile(QRImagePath)

    最后的else分句不可少。

    若有在提取微信好友数据中遇到其他问题欢迎留言。笔者也开发过qq好友列表获取类。

     

     

    展开全文
  • python版本微信助手

    2020-06-18 19:09:11
    利用python写的一个多功能小程序,可以进行微信聊天指定好友自动回复,给好友发送天气预报,或发送心灵鸡汤,利用程序生成艺术签名并保存图片,获取豆瓣电影top250,并发送到微信文件传输助手! 里面含有说明文档
  • 随着微信社交的兴起,我们加入的群也越来越多,一个不经意就被拉入好几个群,群是大家协同交流的平台,但是微信群却越来越泛滥,不知道大家有没有统计过自己浪费在毫无营养的群中的时间? Python学习交流...

    随着微信社交的兴起,我们加入的群也越来越多,一个不经意就被拉入好几个群,群是大家协同交流的平台,但是微信群却越来越泛滥,不知道大家有没有统计过自己浪费在毫无营养的群中的时间?

     

     

     

     

    Python学习交流群:1004391443

    因为群质量太低或者群太吵的原因我们往往会将群设置为勿扰模式,而这样又有可能会错过一些自己比较关注的人发的消息,比如女神、老板、和产品狗。。。

    为了解决这个痛点,今天带大家一起来看看如何用Python开发一个可以监听微信群聊的机器人

    一、需求分析

    1.女神在聊什么

    你可能暗恋公司的某个妹子已久,她的人缘很好常常会在公司群里和大家聊天,所以你一直关注着希望能投其所好,或者产生共鸣,但是作为程序员的你却每天忙成狗,该怎么办?

    2.老板有什么指示

    在公司大群里,也许老板今天心情买了一些水果犒劳大家,然后在群里说:前台有水果,结果等你看到群消息时,前台只剩下妹子了。为什么吃零食总没有你的份?

    3.又要改需求

    你好不容易实现了一个功能,结果产品验收不通过,产品经理说已经在项目群里和你说了并且@了你,但是你沉醉于实现功能忘了看。看来今晚又得加班改需求了,心好累怎么办?

     

     

     

     

     

    二、功能设计

    鉴于上面的需求分析,我们来设计一下功能:我们希望在某些群中监听某些人的讲话,如果他说话了不管发了什么,都会被记录下来,最好是能发到微信上这样更方便查看。

    三、功能实现

    上期为大家详细介绍了用Python创建微信机器人,今天我们会用wxpy库来一些群聊相关的功能!

    1.接收群消息

    上次我们实现使用机器人与好友聊天只是实现了接收好友消息,那如何接收群消息呢?请看下图

     

     

     

     

    这样我们就接收到群消息了,也可以将机器人引入到群中,让大家调戏。

    2.过滤有用群消息

    能接收到群消息之后,我们如何过滤我们需要的消息呢?这里我们可以在接收到群消息后比较下这个群是不是我们需要监听的群,然后再比较当前消息发送者在不在我们要监听的对象中,如果两者都满足便实现了消息过滤。

    在配置文件中指定需要监听人的名称(最好是备注名,防止微信昵称重名)和需要监听的群。

     

     

     

     

    根据配置需要监听的群和人去过滤群消息。

     

     

     

     

    3.转发有用群消息

    在我们拿到有用群消息后,我们如何保存这些信息呢?有很多种保存信息的方式,你可以存文件,存数据库,也可以选择转发。这里就选择将信息转发,这样有几个优点:简单、实时、永久保存。

    那转发给谁?你可以转发到指定好友或者文件助手都行,在本文代码中是转发到机器人管理员那里,如果你没有设置管理员那么就转发到文件助手中。

     

     

     

     

    管理员设置技巧:如果你用小号登录机器人,那么你可以设置你的大号为管理员;如果你没有小号用自己的大号登录,那这个你就空着默认就设置文件助手为管理员,相关信息发送至你的文件助手中。

    四、功能演示

     

     

     

     

     

    五、总结

    目前微信机器人第二阶段开发完成,本次不仅仅新增监听模式,还新增了以下以下一些功能:

    1. 机器人群聊:让机器人加入群聊,让更多的人来撩~
    2. 转发模式:可将老板重要指示转发至其他群
    3. 监控模式:监控群中别人发的分享,这样就可以第一时间发现是否有人在群中发广告
    4. 管理员:指定管理员后可以远程控制机器人的各个开关

    代码下载后可以直接运行,不需要修改,最后再送大家一张wxpy速查表!

     

     

     

     

     

    展开全文
  • 用了微信几年了,微信号有也不少了,但是真正了解自己的好友吗?好友最多的城市是哪个?好友男女比例是多少?好友签名都是什么?今天我们来充分了解自己的微信好友。 运行平台: Windows Python版本: Python3.6 ...
  • 本文我将给大家讲解微信机器人的制作,首先要跟大家说的就是:机器人不管是 QQ 机器人还是微信机器人,相对而言是比较灰色地带,本文中提供的几种方式,经过本人亲自测试,是很好用的!如果有需要,赶紧看看,这种...
  • # -*- coding:utf-8 -*- __author__='yangxin_ryan' import requests import json import urllib3 import importlib import sys urllib3.disable_warnings() class WeChat(object): ... def get_token(self, cor...
  • 原创 使用python 定时发送微信信息给喜欢的人 ...
  • 好友加微信后,每次都要手动备注。 这些使用客户端工具都无法解决,因为客户端工具的一个特点就是native,需要你直接操作电脑,不方便。 所以就想着自己写一个干脆,经过一周漫长的开发(主要...
  • python检测微信好友被删/被拉黑 import itchat import time itchat.auto_login(hotReload=True) # 热加载 print('检测结果可能会引起不适。') print('检测结果请在手机上查看,此处仅显示检测信息。') print('...
  • 我们的好友都来自五湖四海,我们可以利用python的强大的数据库来实现对好友地域的统计 工具:wxpy库,wordcloud库,matplotlib库,openpyxl库,pandas库,numpy库。 1、首先实现对微信的登陆与获取好友数据操作 ...
  • python+appium+mobile phone爬取微信运动数据,顺便数据分析一波好友们的运动情况 前言 微信运动只能看到前30天的数据,超过的会过期而拿不到,我也是现在才知道的。本来还想拿多一点数据的哈哈。 ...
  • 下面这个小文章适合初学Python的童鞋哦~~~ 一个很好用的微信库:itchat 拿使用图灵机器人设置自动回复,让机器人跟微信好友傻傻的聊天,机器人比小编还会聊天,无论是对美眉还是汉纸,上来就是爱!爱!爱!简直太...
  • 通过微信识别不了的代码发送消息,检测是否删除被好友删除
  • 1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发。如果你想对wxpy有更深的了解请查看:wxpy: 用 Python微信 # -*- coding: utf-8 -*- """ 微信...
1 2 3 4 5 ... 20
收藏数 3,536
精华内容 1,414