python_itchat_wxpy_入门

jefxff 153,607 2020-02-02

python 之 itchat 入门

itchat是一个开源的微信个人号接口, 是利用微信网页版登陆, 使用itchat的方法, 可以做很多事情, 最简单的比如给好友发送消息, 结合openpyxl来分析好友信息, 包括昵称, 性别, 男女总数, 签名等等, 还可以做公众号推送监控, 聊天机器人, 查看撤回消息 跨群聊天等等等等吧! ! !
今天先入门, 完成好友信息保存及给特定好友发送消息的功能(例如:爬点笑话, 天气, 鸡汤什么的发给女朋友), 后续的那么多功能学不会呀!

安装

安装很简单, 使用python的pip工具来安装

	pip install itchat

使用

1. 最简单的发送消息

itchat使用流程就是 auto_login()登陆, 获取要发送好友的 toUserName, 将msg使用send()方法发送给好友,然后使用logout()方法退出.

	# 导入库
	import itchat

	# 1. 登陆网页版, 扫描二维码登陆, 程序执行完就是退出登陆状态
	itchat.auto_login()
	# 1.1 设置hotRelod=True 之后, 程序结束之后也不会立刻退出登陆状态, 一定时间内重新开启也可以不用重新扫码, 也称为"热启动".
	itchat.auto_login(hotReload=True)
    # 1.2 默认是弹窗扫二维码, 设置enableCmdQR=True的时候,在登陆的时候会使用命令行显示二维码
	itchat.auto_login(enableCmdQR=True)


	# 2. 获取好友信息, name经我试验是你在你微信中给好友的备注名
	my_friend = itchat.search_friends(name="苏沐橙")

	# 3. 要发送的信息
	content = "你好! 苏沐橙! 我好喜欢你!"

	# 4. 发送消息
	itchat.send(content, toUserName=my_friend)

	# 5. 退出登陆
	itchat.logout()
2. 使用itchat接收文本消息
	import itchat
	# 注册消息响应事件,消息类型为itchat.content.TEXT,即文本消息
	@itchat.msg_register(itchat.content.TEXT)
	def text_reply(msg):
		# 返回同样的文本消息
	    return msg.text

	itchat.auto_login()
	# 绑定消息响应事件后,让itchat运行起来,监听消息
	itchat.run()
3. 用户搜索
	# 获取自己的用户信息,返回自己的属性字典
	itchat.search_friends()
	# 获取特定UserName的用户信息
	itchat.search_friends(userName='@abcdefg1234567')
	# 获取任何一项等于name键值的用户
	itchat.search_friends(name='苏沐橙')
	# 获取分别对应相应键值的用户
	itchat.search_friends(wechatAccount='苏沐橙')
	# 三、四项功能可以一同使用
	itchat.search_friends(name='LittleCoder机器人', wechatAccount='苏沐橙')
4. 贴一个实验楼的图灵机器人

实验楼学习地址

	#coding=utf-8
	import requests
	import itchat

	# 图灵机器人注册地址: http://www.tuling123.com/ 还要公众号,还没弄好
	KEY = '8edce3ce905a4c1dbb965e6b35c3834d'

	def get_response(msg):
	    # 构造了要发送给服务器的数据
	    apiUrl = 'http://www.tuling123.com/openapi/api'
	    data = {
	        'key'    : KEY,
	        'info'   : msg,
	        'userid' : 'wechat-robot',
	    }
	    try:
	        r = requests.post(apiUrl, data=data).json()
	        # 字典的get方法在字典没有'text'值的时候会返回None而不会抛出异常
	        return r.get('text')
	    # 为了防止服务器没有正常响应导致程序异常退出,这里用try-except捕获了异常
	    # 如果服务器没能正常交互(返回非json或无法连接),那么就会进入下面的return
	    except:
	        # 将会返回一个None
	        return

	# 这里和“2. 使用itchat接收消息”中已经用到过的同样的注册方法
	@itchat.msg_register(itchat.content.TEXT)
	def tuling_reply(msg):
	    # 为了保证在图灵Key出现问题的时候仍旧可以回复,这里设置一个默认回复
	    defaultReply = 'I received: ' + msg['Text']
	    # 如果图灵Key出现问题,那么reply将会是None
	    reply = get_response(msg['Text'])
	    # a or b的意思是,如果a有内容,那么返回a,否则返回b
	    # 有内容一般就是指非空或者非None,你可以用`if a: print('True')`来测试
	    return reply or defaultReply

	# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
	itchat.auto_login(hotReload=True)
	itchat.run()





python 之 wxpy 入门

wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.

安装

  • 从 PYPI 官方源下载安装 (比较慢或不稳定)
	pip install -U wxpy
  • 从豆瓣 PYPI 镜像源下载安装(快且稳)
	pip install -U wxpy -i "https://pypi.doubanio.com/simple/"

使用

在这里: wxpy:用 Python 玩微信 打开文档来学习

1. 导入模块及初始化机器人
	# 导入模块
	from wxpy import *

	# 初始化机器人,扫码登陆
	# Windows 环境下调用用下面这行代码
	bot = Bot()

	# linux 环境下调用下面这行代码
	bot = Bot(console_qr=2, cache_path="botoo.pkl")
2. 找到好友及群聊等
	# 搜索名称含"苏沐橙"的好友
	my_friend = bot.friends().search("苏沐橙")[0]
	# 搜索名称含有 "游否" 的男性深圳好友
	my_friend = bot.friends().search('游否', sex=MALE, city="深圳")[0]

	# 搜索名称包含 '东北一家人',且成员中包含 `sumucheng` 的群聊对象
	my_groups = bot.groups().search("东北一家人", [sumucheng])
	#遍历获取群成员
	group = bot.groups().search('东北一家人')[0]
	for member in group:
		print(menber, end=", ")
		print("本群共有:" + str(len(group)) + "人.")

	# 获取一个好友的详细信息(也可以多个)
	my_friend_details = bot.user_details("苏沐橙")


3. 发送消息
	# 发送文本给好友
	my_friend.send('Hello WeChat!')
	# 发送图片(图片和当前程序需要在同一个目录下, 或者使用绝对路径)
	my_friend.send_image('my_picture.jpg')
	# 发送视频
	my_friend.send_video('my_video.mov')
	# 发送文件
	my_friend.send_file('my_file.zip')
	# 以动态的方式发送图片
	my_friend.send('@img@my_picture.png')
4. 自动响应各类消息
	# 打印来自其他好友、群聊和公众号的消息
	@bot.register()
	def print_others(msg):
	    print(msg)

	# 回复 my_friend 的消息 (优先匹配后注册的函数!)
	@bot.register(my_friend)
	def reply_my_friend(msg):
	    return 'received: {} ({})'.format(msg.text, msg.type)

	# 自动接受新的好友请求
	@bot.register(msg_types=FRIENDS)
	def auto_accept_friends(msg):
	    # 接受好友请求
	    new_friend = msg.card.accept()
	    # 向新的好友发送消息
	    new_friend.send('哈哈,我自动接受了你的好友请求')
5. 保持登陆/运行/登出
	# 进入 Python 命令行、让程序保持运行
	embed()

	# 堵塞进程,直到结束消息监听 (例如,机器人被登出时)
	bot.join()

	# 登出当前账号
	bot.logout()

实践

使用urlopen, requests, itchat, wxpy, openpyxl, datetime等相关库来实践一下七月份学习了解到的东西...
通过简易的爬虫, 从从金山词霸api获取每日一句, 从和风天气获取深圳的天气信息, 从来福岛获取一条笑话, 将爬取到的信息整理后, 保存到log.xlsx, 并发送给指定的微信好友...
还可以升级, 即采用apscheduler自动定时框架来完成自动定时发送的功能...

1. 代码如下
	# !usr/bin/python
	# coding : utf-8

	from urllib.request import urlopen
	from wxpy import *
	import itchat
	import requests
	import json
	import re
	from datetime import datetime
	import openpyxl, pprint


	# Windows 环境下wxpy调用用下面这行代码
	bot = Bot()

	# linux 环境下wxpy调用下面这行代码
	# bot = Bot(console_qr=2, cache_path="botoo.pkl")


	def get_news():
	    """从金山词霸api获取每日一句"""
	    url = "http://open.iciba.com/dsapi/"
	    r = requests.get(url)
	    content = r.json()["content"]
	    note = r.json()["note"]
	    print("[每日一句] 爬取完成...")
	    return content, note


	def get_weather():
		"""从和风天气API获取深圳的天气信息"""
	    url = 'https://free-api.heweather.net/s6/weather/now?location=CN101280601&key='注册和风天气API获取到的KEY'
	    html = urlopen(url).read().decode("utf-8")
	    json_data = json.loads(html)
	    data = json_data['HeWeather6'][0]
	    city = data["basic"]["location"]
	    temp1 = data["now"]["fl"]
	    temp2 = data["now"]["tmp"]
	    weather = data["now"]["cond_txt"]
	    hum = data["now"]["hum"]
	    wind_dir = data["now"]["wind_dir"]
	    wind_sc = data["now"]["wind_sc"]
	    
	    weather_content = city + " " + "体感温度:" +  temp1 + "℃ " + "温度:" + temp2 + "℃ " + weather + " 湿度:" + hum + "% 风向:" + wind_dir + " 风力:" + wind_sc + "级"
	    print("[此刻天气] 爬取完成...")
	    return weather_content

	def get_joke():
	    """从来福岛api获取一条笑话"""
	    url = "http://api.laifudao.com/open/xiaohua.json"
	    r = requests.get(url)
	    joke_title = r.json()[11]["title"]
	    joke_content = re.sub("/*<br/><br/>",r"\n",r.json()[11]["content"])
	    joke_contents = joke_title + "\n" + joke_content

	    print("[今日笑话] 爬取完成...")
	    return joke_contents


	def send_news():
	    try:
	        # 运行上面定义的函数, 获取爬取的结果
	        contents = get_news()
	        weather_contents = get_weather()
	        joke_contents = get_joke()

	        # 获取要发送的好友
	        my_friend = bot.friends().search("苏沐橙")[0]
	        print("已获取好友...")

	        # 如果使用itchat库登录微信
	        # itchat.auto_login(hotReload=True)
	        # itchat获取UserName
	        # my_friend = itchat.search_friends(name="苏沐橙")
	        # my_friend = my_friend[0]["UserName"]

	        # 获取当前日期及时间
	        now_times = datetime.now()
	        now_time = now_times.strftime('%Y-%m-%d %H:%M:%S')

	        # 将要发送的话拼接成一个content
	        content1 = now_time + "\n"
	        content2 = "【天气】\n" + weather_contents + "\n" 
	        content3 = "【每日一笑】\n"+ joke_contents + "\n"
	        content4 = "【每日一句】\n" +  contents[0] + "\n" + contents[1]
	        alist_content = [now_time, weather_contents, joke_contents, contents[0], contents[1]]

	        ## 下面四句代码将爬取到的content保存为Excel格式的日志(.xlsx和.py要在同一个目录下)
	        wb = openpyxl.load_workbook('log.xlsx')
	        ws = wb.active
	        ws.append(alist_content)
	        wb.save("log.xlsx")
	        print("已保存.xlsx格式日志...")

	        content = content1 + content2 + content3 + content4

	        # 使用wxpy发送content
	        my_friend.send(content)
	        print("已发送完成...")

	        # itchat发送从get_news获取的鸡汤
	        # itchat.send(content[0], toUserName=my_friend)
	        # itchat.send(content[1], toUserName=my_friend)

	    except:
	        # 如果try发送失败, 就给自己发一条提醒消息
	        my_friend = bot.friends().search("jefxff")[0]
	        my_friend.send(u"消息发送失败!")
	        
	        # itchat 发送
	        # my_friend = itchat.search_friends(name="jefxff")
	        # itchat.send(u"消息发送失败!")

	if __name__ == "__main__":
	    send_news()

2. 接下来接着学wxpy, 嗯, 看不懂文档, 很烦!!!

# python