1. 程式人生 > >帶你使用wxpy建立自己的聊天機器人(外加微信介面基本資料視覺化)

帶你使用wxpy建立自己的聊天機器人(外加微信介面基本資料視覺化)

往期好文:你的微信暱稱,可能正在出賣你
本文目錄

前言
本文是X先生這幾天簡單看了一下Python裡的wxpy模組後,搭配matplotlib模組撰寫的一個wxpy基本使用方法,主要利用了wxpy對微信進行一系列的自動化操作,比如利用wxpy

登入微信、給微信檔案助手傳送訊息、給單個微信好友傳送訊息、微信訊息群發(謹慎使用[/邪笑])以及微信聊天機器的搭建使用過程,你以為wxpy只能這樣?No,最後X先生利用wxpy獲取了我的微信好友的數量、性別、暱稱及個性簽名,和關注的微信公眾號暱稱、公眾號簡介資訊,搭配matplotlib進行了一系列資料的視覺化,中間參雜著X先生的一些東倒西歪的文字分析,從這些,,,我解讀出了一個真實的我(文末正解)。

一、wxpy基本介紹與安裝

1.wxpy基本介紹

wxpy基於itchat,使用了 Web 微信的通訊協議,通過大量介面優化提升了模組的易用性,並進行豐富的功能擴充套件。實現了微信登入、收發訊息、搜尋好友、資料統計、微信公眾號、微信好友、微信群基本資訊獲取等功能。
可用來實現各種微信個人號的自動化操作。

2.wxpy安裝

方法一:直接安裝

pip install wxpy

方法二:豆瓣源安裝(推薦)

pip install -i https://pypi.douban.com/simple/  wxpy

二、實踐出真知

1.給自己的檔案傳輸助手發訊息

from wxpy import *
# 初始化一個機器人物件
bot = Bot(cache_path=True)
# 向檔案傳輸助手傳送訊息
bot.file_helper.send("hello,I'm XksA!")

Bot類基本引數介紹:

cache_path –
    設定當前會話的快取路徑,並開啟快取功能;為 None (預設) 則不開啟快取功能。
    開啟快取後可在短時間內避免重複掃碼,快取失效時會重新要求登陸。
    設為 True 時,使用預設的快取路徑 ‘wxpy.pkl’。
qr_path – 儲存二維碼的路徑
console_qr – 在終端中顯示登陸二維碼

執行後彈出一個二維碼圖片,用微信掃碼登入即可,再回來看手機訊息。
微信檔案傳輸助手
特別提醒:使用的微信賬號不能為新註冊的賬號,不然會報錯KeyError: 'pass_ticket'

2.給指定朋友傳送訊息

# 初始化一個機器人物件
# cache_path快取路徑,給定值為第一次登入生成的快取檔案路徑
bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")
# 查詢朋友"極簡XksA"
my_friend = bot.friends().search('極簡XksA')[0]
# 傳送訊息
my_friend.send('hello 極簡XksA!')
'''
除此之外還有可以傳送一下內容,自己動手嘗試吧
傳送圖片
my_friend.send_image('hello.png')
傳送視訊
my_friend.send_video('hello.mp4')
傳送檔案
my_friend.send_file('hello.rar')
'''

執行結果:
好友

3.群發訊息(今早醒來突發奇想,給每人發個早安!)

import time
# 初始化一個機器人物件
# cache_path為登入狀態快取路徑,給定值為第一次登入生成的快取檔案路徑
bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")

# 群發訊息(謹慎使用,哈哈哈)
my_friends = bot.friends(update=False)
my_friends.pop(0)   # 去除列表第一個元素(自己)
for i in range(120):
    friend = my_friends[i]
    friend.send('Good morning,the early bird catches the worm!(早上好,早起的鳥兒有蟲吃!)')
    time.sleep(2)
    friend.send('不用回覆,生活中一起加油!')

執行效果:
群發訊息效果圖

4.獲取自己的微信好友數、活躍微信群數、關注微信公眾號數

# 獲取所有好友[返回列表包含Chats物件(你的所有好友,包括自己)]
t0 = bot.friends(update=False)
# 檢視自己好友數(除開自己)
print("我的好友數:"+str(len(t0)-1))

# 獲取所有微信群[返回列表包含Groups物件]
t1 = bot.groups(update=False)
# 檢視微信群數(活躍的)
print("我的微信群聊數:"+str(len(t1)))

# 獲取所有關注的微信公眾號[返回列表包含Chats物件]
t2 = bot.mps(update=False)
# 檢視關注的微信公眾號數
print("我關注的微信公眾號數:"+str(len(t2)))

執行結果:

# 注:如果直接把t0、t1、t2打印出就是對應得名稱(不同型別,自己可以試一下)
我的好友數:242
我的微信群聊數:6
我關注的微信公眾號數:125

5.個人聊天機器人搭建(基於自己的)

(1)自己的聊天機器人
# 查詢聊天物件
my_friend = bot.friends().search('極簡XksA')[0]
my_friend.send('hello 極簡XksA!')

# 自動回覆
# 如果想對所有好友實現機器人回覆把引數 my_friend 改成 chats = [Friend]
@bot.register(my_friend)
def my_friednd_message(msg):
    print('[接收]' + str(msg))
    if msg.type != 'Text':   # 除文字外其他訊息回覆內容
        ret = '你給我看了什麼![拜託]'
    elif "你來自哪裡" in str(msg):   # 特定問題回答
        ret = "我來自極簡XksA"
    else:         # 文字訊息自動回答
        ret = '我愛你'
    print('[傳送]' + str(ret))
    return ret
# 進入互動式的 Python 命令列介面,並堵塞當前執行緒
embed()
(2)聊天效果圖

基於自己的聊天機器人

6.個人聊天機器人搭建(基於圖靈機器人的)

(1)事前準備

點選這裡註冊圖靈機器人賬號,然後建立一個機器人,即可獲得屬於你的圖靈機器人api。
圖靈機器人api

(2) 建立屬於自己的聊天機器人
  • 方法一:使用Tuling類,簡單實現
# 登入快取路徑,第一次設定為True
# 生成快取檔案wxpy.pkl後,為該檔案路徑
bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")  
tuling = Tuling(api_key='你的圖靈介面api')
print('極簡機器人已經啟動')
# 我的小號,測試需謹慎
my_friednd = bot.friends().search('極簡XksA')[0]
# 如果想對所有好友實現機器人回覆把引數my_friend改成chats = [Friend]
# 使用圖靈機器人自動與指定好友聊天
@bot.register(my_friend)
def reply_my_friend(msg):
    tuling.do_reply(msg)
# 進入互動式的 Python 命令列介面,並堵塞當前執行緒
embed()
  • 方法二:自己手動傳送post請求,有點麻煩哈哈哈~
def auto_ai(text):
    url = "http://www.tuling123.com/openapi/api"
    api_key = "你的圖靈介面api"
    payload = {
        "key": api_key,
        "info": text,
        "userid": "老表"
    }
    r = requests.post(url, data=json.dumps(payload))
    result = json.loads(r.content)
    return "[極簡機器人]  " + result["text"]

bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")  
print('極簡機器人已經啟動')
# 我的小號,測試需謹慎
my_friednd = bot.friends().search('極簡XksA')[0]
# 如果想對所有好友實現機器人回覆把引數my_friend改成chats = [Friend]
@bot.register(my_friednd)
def my_friednd_message(msg):
    print('[接收]' + str(msg))
    if msg.type != 'Text':
        ret = '你給我看了什麼![拜託]'
    else:
        ret = auto_ai(msg.text)
    print('[傳送]' + str(ret))
    return ret
# 進入互動式的 Python 命令列介面,並堵塞當前執行緒
embed()
(3)聊天效果圖

基本測試,圖靈機器人可以實現查詢天氣、車票、翻譯、基本聊天等功能,比我們自己寫的,強,,,哈哈哈。
個人聊天效果圖

7.來點有趣的

(1)獲取微信好友性別、位置分佈資料
'''
author : 極簡XksA
data : 2018.8.26
goal : 獲取微信好友性別、分佈、微信暱稱,視覺化分析
'''

from wxpy import *

# 初始化一個機器人物件
# cache_path快取路徑,給定值為第一次登入生成的快取檔案路徑
bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")
#獲取好友列表(包括自己)
my_friends = bot.friends(update=False)
'''
stats_text 函式:幫助我們簡單統計微信好友基本資訊
簡單的統計結果的文字
    :param total: 總體數量
    :param sex: 性別分佈
    :param top_provinces: 省份分佈
    :param top_cities: 城市分佈
    :return: 統計結果文字
'''
print(my_friends.stats_text())

執行結果:

老表 共有 245 位微信好友

男性: 140 (57.1%)
女性: 79 (32.2%)

TOP 10 省份
湖北: 88 (35.92%)
廣東: 16 (6.53%)
北京: 12 (4.90%)
湖南: 5 (2.04%)
上海: 5 (2.04%)
浙江: 4 (1.63%)
河南: 4 (1.63%)
安徽: 3 (1.22%)
山東: 3 (1.22%)
福建: 3 (1.22%)

TOP 10 城市
荊州: 25 (10.20%)
武漢: 22 (8.98%)
黃石: 21 (8.57%)
海淀: 5 (2.04%)
廣州: 5 (2.04%)
深圳: 4 (1.63%)
黃岡: 4 (1.63%)
杭州: 3 (1.22%)
長沙: 3 (1.22%)
昌平: 3 (1.22%)
(2)利用Matplotlib進行資料視覺化
1)性別佔比餅圖
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 上面兩行程式碼解決matplotlib繪圖不能顯示中文問題
import matplotlib.pyplot as plt

labels = ['男性', '女性', '其他']
sizes = [57.1, 32.2, 10.7]
explode = (0, 0.1, 0)

fig1, ax1 = plt.subplots()
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
        shadow=True, startangle=90)
# 縱橫相等,畫成一個圓
ax1.axis('equal')
plt.legend()
plt.show()

效果圖:
性別佔比餅圖

我的天啊(自繪),我的微信好友居然是男性居多,嘿嘿,也正常,筆者從不沾花惹草,當然女生也不是特別少嘿,包含了家人朋友還有一些社會人嘿。

2)城市分佈條形圖
import numpy as np
import matplotlib.pyplot as plt

n_groups = 10
# 城市分佈數量權值
city_weight = (10.2,8.98,8.57,2.04,2.04,1.63,1.63,1.22,1.22,1.22)
fig, ax = plt.subplots()
index = np.arange(n_groups)
bar_width = 0.35
opacity = 0.4
error_config = {'ecolor': '0.3'}
rects1 = ax.bar(index, city_weight, bar_width,alpha=opacity, color='b', error_kw=error_config,label='城市')
ax.set_xlabel('城市名稱')
ax.set_ylabel('資料佔比(%)')
ax.set_title('好友城市Top10')
ax.set_xticks(index + bar_width / 2)
ax.set_xticklabels(('荊州', '武漢', '黃石', '海淀', '廣州','深圳', '黃岡', '杭州', '長沙', '昌平'))
ax.legend()
fig.tight_layout()
plt.show()

效果圖:
城市釋出圖

從圖中容易看出X先生好友多在荊州,那猜猜X先生是哪裡的人?沒錯,就是荊州人嘿,你的好友裡是不是也是家鄉人最多呢?(突然的想家!)

3)好友省份分佈圖
from pyecharts import Map
# matplotlib的方法比較麻煩,顯示起來還沒pyecharts 好,就用了pyecharts 
value = [359.2, 65.3, 49.0, 20.4, 20.4, 16.3, 16.3, 12.2, 12.2,12.2]
attr = [
    "湖北", "廣東", "北京", "湖南", "上海", "浙江", "河南", "安徽", "山東","福建"
    ]
map = Map("好友分佈省份Top10", width=600, height=400)
map.add(
    "",
    attr,
    value,
    maptype="china",
    is_visualmap=True,
    visual_text_color="#000",
)
map.render()

效果圖:
好友省份分佈圖

是不是很直接明瞭,我的好友基本在我國中南部,你知道你的好友分佈嗎?我在長江中下游,這裡有水有山,有花有草,有樂園。

4)獲取好友微信暱稱和個性簽名,詞雲分析
bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")
#獲取好友列表(包括自己)
my_friends = bot.friends(update=False)
# 微信暱稱
nick_name = ''
# 微信個性簽名
wx_signature = ''
for friend in my_friends:
    # 微信暱稱:NickName
    nick_name = nick_name + friend.raw['NickName']
    # 個性簽名:Signature
    wx_signature = wx_signature + friend.raw['Signature']

nick_name = jiebaclearText(nick_name)
wx_signature = jiebaclearText(wx_signature)
make_wordcloud(nick_name,1)
make_wordcloud(wx_signature,2)

效果圖:
微信暱稱

我的微信好友暱稱,有點複雜,搞淘寶的,浩浩,石頭,還有創業,當然最醒目的是老師,都說老師是園丁,謝謝您養育了我們(突發其感)。

個性簽名

我發現他們可以練成一段話:我們所有的人生,就是平凡的自己最偉大,遇見一個美好的自己,一生不止生活,加油。。。

5)獲取關注微信公眾號名稱和基本簡介,詞雲分析
# 獲取微信公眾號名稱
wx_public_name = ''
# 公眾號簡介
wx_pn_signature = ''
# 獲取微信公眾號列表
my_wx_pn = bot.mps(update=False)
for wx_pn in my_wx_pn:
    wx_public_name = wx_public_name + wx_pn.raw['NickName']
    wx_pn_signature = wx_pn_signature + wx_pn.raw['Signature']

wx_public_name = jiebaclearText(wx_public_name)
make_wordcloud(wx_public_name,3)
wx_pn_signature = jiebaclearText(wx_pn_signature)
make_wordcloud(wx_pn_signature,4)

效果圖:
關注微信公眾號暱稱詞雲圖

看出什麼蹊蹺沒?你問我愛你有多深,你看看Python就知道了哈哈!

公眾號簡介詞雲圖

基本可以看出我關注的都是積極向上的嘿,真優秀,搞技術的人應該有的公眾號(極簡XksA[偷笑]),嘿嘿,Java,Python,英語,資料,爬蟲…

三、後言

總結
從上面的資料視覺化結果,我推測出這樣的我:X先生,微信暱稱老表,性別男,座標地址湖北荊州,好友中男性居多,說明事業心重,女性也不少,說明女人緣也不錯,微信好友個性簽名基本積極向上,有生活,有奮鬥,有喜歡,所關注微信公眾號大多數技術相關的,專注於Python,也有時候三心二意玩Java,應該是一名大學生,還關注有大學官方公眾號。。。哈哈哈(以上純屬X先生自賣自誇,好像還蠻有道理的嘿!)

撰寫本文純是筆者興趣,嘿嘿,歡迎交流學習!
X先生主要研究Python資料分析及視覺化,個人公眾號:極簡XksA,長期分享學習筆記和學習資源,先在新建了一個學習交流群,歡迎進群學習交流。
本文參考文件:
1.wxpy官方介紹文件
2.matplotlib官方介紹文件
本文所有原始碼已經上傳到碼雲上:wxpy_matplotlib_learning
極簡學Python


歡迎大家關注微信公眾號:極簡XksA,獲取Python/Java/前端等學習資源!
極簡XksA