微信自动回复,所有好友头像合成。。。

all_friend.gif

基于itchat 的python微信个人项目 https://github.com/zhangyake/python-itchat
目前实现功能

  • 图灵机器人自动回复文本信息 msg
  • 随机回复图片信息 随机图片放在gif目录中
  • 获取所有好友头像 合成为一张大图
  • 获取所有好友基本信息比如昵称 备注 性别 个性签名等 存放在数据库表中
  • 下载用户发送的图片 附件 录音 视频文件 (itchat 存在问题,存在下载失败的情况)

步骤

项目主要文件是 gif 文件夹 和 weixin.py 下载这两个到本地电脑

  1. 安装pyhton3最新版 安装时请加入到系统环境变量

  2. 安装一个第三方库——Python Imaging Library

pip install Pillow

  1. 安装一个pymysql

    pip install pymysql

  2. 安装 itchat

    pip install itchat

  3. 修改 weixin.py 113行key 请自行到图灵机器人官网申请key

    网址 http://www.tuling123.com

  4. 修改数据库配置 weixin.py 167行 改为自己的 执行建表语句


 CREATE TABLE `friends` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `NickName` varchar(255) DEFAULT NULL COMMENT '昵称',
   `PYInitial` varchar(255) DEFAULT NULL,
   `PYQuanPin` varchar(255) DEFAULT NULL,
   `RemarkName` varchar(255) DEFAULT NULL COMMENT '备注',
   `RemarkPYInitial` varchar(255) DEFAULT NULL,
   `RemarkPYQuanPin` varchar(255) DEFAULT NULL,
   `Sex` varchar(255) DEFAULT NULL COMMENT '性别 1 男 2 女',
   `Province` varchar(255) DEFAULT NULL COMMENT '省',
   `City` varchar(255) DEFAULT NULL COMMENT '城市',
   `Signature` varchar(255) DEFAULT NULL COMMENT '个人签名',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

7 . 到当前目录命令行执行
python weixin.py
手机微信扫描登录

获取到的用户信息展示

![9A~XW9$_S@IV]N}WM}WXK8X.png](http://upload-images.jianshu.io/upload_images/337803-7bb831c26dab391d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

自动回复信息展示

image.png

直接上代码,写的不好 随意喷

import os
import time
import requests
import logging
import random
import math
from PIL import Image
import itchat
from itchat.content import *
import pymysql

# 设置自动回复的人字典 valus为 True 为自动回复,False 则不自动回复 ,未添加进来的 也不会自动回复
# key值为好友的昵称的 汉语拼音,如果用户昵称中有其他字符 请登录后 在数据库中查看
autoDict = {'Caroline': True,  'tiankongzhicheng': True}
autoUserNames = {}


# 通过下面的方式进行简单配置输出方式与日志级别
logging.basicConfig(filename='logger.log', level=logging.INFO)

# 注册地图 名片 通知 分享信息 回复方法 
@itchat.msg_register([MAP, CARD, NOTE, SHARING])
def text_reply(msg):
    # print(msg) 这里没有自动回复 对信息进行了日志记录
    if autoUserNames.get(msg['FromUserName']):
        info = time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime()) + \
            autoUserNames[msg['FromUserName']] + " : " + \
            str(msg['Text']) + msg.get('Url', '') + "\n"
        with open('msg.info', 'a', encoding='utf-8') as f:
            f.write(info)
        # logging.info(info) 


# 注册文本信息 回复方法
@itchat.msg_register(TEXT)
def text_reply(msg):
    if autoUserNames.get(msg['FromUserName']):
        info = time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime()) + \
            autoUserNames[msg['FromUserName']] + " : " + \
            str(msg['Text']) + msg.get('Url', '') + "\n"
        #对信息进行了日志记录 写入了文本
        with open('msg.info', 'a', encoding='utf-8') as f:
            f.write(info)
        text = request_robot(info=msg['Text'], userid=msg['FromUserName'])
        itchat.send(text, msg['FromUserName'])


# 在注册时增加isGroupChat=True将判定为群聊回复
@itchat.msg_register(TEXT, isGroupChat=True)
def groupchat_reply(msg):
    if not msg['IsAt'] :
        # 请求图灵机器人 获取要回复的内容
        text = request_robot(info=msg['Text'], userid=msg['FromUserName'])
        # 发送到群里
        itchat.send(text, msg['FromUserName'])


# 在注册 图片 附件 语音 视频 信息 下载方法
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
    msg['Text'](msg['FileName']) #下载文件
    if autoUserNames.get(msg['FromUserName']):
        fileName = os.path.join('gif', '{}.gif'.format(random.randint(1, 25)))
        file = '@{}@{}'.format({'Picture': 'img', 'Video': 'vid'}.get(
            msg['Type'], 'fil'), fileName)
        if msg['Type'] == 'Picture':
            itchat.send(file, msg['FromUserName'])


# 拼接合成好友头像
def make_all_friends_img(image_list, width=120, height=120, save_name='all_friend.jpg'):
    images_count = len(image_list)
    n = int(math.ceil(pow(images_count, 0.5)))
    toImage = Image.new('RGBA', (width * n, height * n), (255, 255, 255))
    for y in range(0, n):
        for x in range(0, n):
            print(x * width, y * height)
            try:
                fromImage = Image.open(image_list.pop())
                fromImage = fromImage.resize((width, height), Image.ANTIALIAS)
                toImage.paste(fromImage, (x * width, y * height))
            except Exception as e:
                print('某头像图片有误')
            if len(image_list) == 0:
                toImage.save(save_name)
                print('合成图像success')
                return


# 获取所以好友头像
def get_all_friends_img(picDir='friends'):
    images = []
    if not os.path.isdir(picDir):
        os.makedirs(picDir)
    for i, friend in enumerate(itchat.get_friends()):
        itchat.get_head_img(userName=friend['UserName'], picDir=os.path.join(picDir, str(i)+'.png'))
        images.append(os.path.join(picDir, str(i)+'.png'))
    return images 

codes_map = {
    100000: True,  # '文本类'
    200000: True,  # '链接类'
    302000: True,  # '新闻类'
    308000: True,  # '菜谱类'
    40001: True,  # '参数 key 错误'
    40002: True,  # '请求内容 info 为空'
    40004: True,  # '当天请求次数已使用完'
    40007: True,  # '数据格式异常'
}


# 向图灵机器人发送请求 获取结果
def request_robot(info='hello', userid='123456', url='http://www.tuling123.com/openapi/api', key='d0ee53f65c46a4206a5b049f1eda674c8'):
    res = requests.post(url, json={'key': key, 'userid': userid, 'info': info})
    if res.status_code == 200:
        data = res.json()
        return response_handle(**data)
    else:
        return '抱歉,稍等。。。'


# 处理机器人返回的数据
def response_handle(**kw):
    code = kw.get('code', 40004)
    res_str = ''
    if code == 100000 or code == 200000:
        res_str = kw.get('text', '') + kw.get('url', '')
    elif code == 302000:
        news = kw.get('list')
        if isinstance(news, Iterable):
            for nw in news:
                res_str += (nw.get('article', '') + '\n' +
                            nw.get('detailurl', '') + '\n')
    elif code == 308000:
        news = kw.get('list')
        if isinstance(news, Iterable):
            for nw in news:
                res_str += (nw.get('name', '') + '\n' +
                            nw.get('detailurl', '') + '\n')
    else:
        res_str = kw.get('text', '')

    return res_str


def get_rooms_info():
    for i, friend in enumerate(itchat.get_chatrooms()):
        logging.info(str(friend))

# 添加用户到数据库 这里(host='192.168.10.10',user='homestead',password='secret',db='test',charset='utf8mb4') 请更改为自己的数据库账户密码
# 建表语句
#  CREATE TABLE `friends` (
#   `id` int(11) NOT NULL AUTO_INCREMENT,
#   `NickName` varchar(255) DEFAULT NULL COMMENT '昵称',
#   `PYInitial` varchar(255) DEFAULT NULL,
#   `PYQuanPin` varchar(255) DEFAULT NULL,
#   `RemarkName` varchar(255) DEFAULT NULL COMMENT '备注',
#   `RemarkPYInitial` varchar(255) DEFAULT NULL,
#   `RemarkPYQuanPin` varchar(255) DEFAULT NULL,
#   `Sex` varchar(255) DEFAULT NULL COMMENT '性别 1 男 2 女',
#   `Province` varchar(255) DEFAULT NULL COMMENT '省',
#   `City` varchar(255) DEFAULT NULL COMMENT '城市',
#   `Signature` varchar(255) DEFAULT NULL COMMENT '个人签名',
#   PRIMARY KEY (`id`)
# ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
def add_to_db(**kw):
    connection = pymysql.connect(host='192.168.10.10',user='homestead',password='secret',db='test',charset='utf8mb4')
    try:
        with connection.cursor() as cursor:
            sql = "INSERT INTO `friends` ( `NickName`, `PYInitial`, `PYQuanPin`, `RemarkName`, `RemarkPYInitial`, `RemarkPYQuanPin` , `Sex`, `Province`, `City`, `Signature`) VALUES (%s, %s, %s, %s, %s,%s, %s, %s, %s, %s)"
            cursor.execute(sql,(kw.get('NickName'),kw.get('PYInitial'),kw.get('PYQuanPin'),kw.get('RemarkName','无'),kw.get('RemarkPYInitial'),kw.get('RemarkPYQuanPin'),kw.get('Sex'),kw.get('Province'),kw.get('City'),kw.get('Signature')))
            connection.commit()
    except Exception as e:
        print(e)
    finally:
        connection.close()

def get_auto_friends_username():
    for i, friend in enumerate(itchat.get_friends()):
        if autoDict.get(friend['PYQuanPin']):
            autoUserNames[friend['UserName']] = friend['NickName']
        else:
            pass
            # with open('friends_base.info', 'a', encoding='utf-8') as f:
            #     f.write('昵称:' + friend['NickName'] +  '  备注: ' + (friend['RemarkName'] == '' ? '无': friend['RemarkName']) + ' 性别:' + str(friend['Sex']) + ' 区域: '+ friend['Province'] + friend['City'] + ' 签名:' +friend['Signature'] +  '\n')
        add_to_db(**friend) # 添加用户信息到MySQL数据库friends表中
    print('如下的用户发送text消息,系统将自动回复:')
    for user in autoUserNames.values():
        print('---------------------------------------------')
        print('--------------{}'.format(user))
    images = get_all_friends_img()
    # images.reverse()
    make_all_friends_img(images)
    itchat.send('@img@{}'.format('all_friend.jpg'))#登录时将会把所有好友头像合照发送给登录账户


itchat.auto_login(loginCallback=get_auto_friends_username, enableCmdQR=False)
itchat.run()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容