• PyPI网址 https://pypi.org/project/itchat/
  • GitHub网址 https://itchat.readthedocs.io/zh/latest/tutorial/tutorial0/
  • 本文整理自PyPI以及GitHub

    文章目录

    • 0.安装
    • 1.首先了解注册方法
      • 1.1两种方法注册消息
      • 1.2消息类型
      • 1.3注册消息的优先级
      • 1.4动态注册消息
    • 2.简单用法
    • 3.高级用法
      • 3.1信息字典的特殊用途
      • 3.2各种信息类型的注册
      • 3.3二维码命令语句
      • 3.4Hot reload
      • 3.5用户搜索
      • 3.6下载与发送
      • 3.7Multi instance
      • 3.8登录和注销后设置回调
    • 0. 选题背景
    • 1. 发现问题
    • 2. 提炼问题
    • 3. 解决方案
    • 4. 分析设计
      • 4.0 准备
      • 问题4.1 : 如何用程序登录自己的微信账号?
      • 问题4.2 : 如何用程序获取账号接收到的消息
      • 问题4.3 : 如何识别接收到的消息的不同类别,并作出不同的处理
      • 问题4.4 : 如何实时保存接收到的消息
      • 问题4.5 : 如何检测到其他用户的”撤回“指令
      • 问题4.6 : 如何根据“撤回”指令在保存下来的消息中找到被撤回的消息内容
      • 问题4.7 : 如何在微信中显示撤回的不同类型的内容
    • 5. 代码实现
      • 5.-1 结构
      • 5.0 库引用
      • 5.1 全局变量设置
      • 5.2 登录
      • 5.3 处理接收到的信息
      • 5.4 分类处理
      • 5.5 更新存储变量的字典
      • 5.6 监测是否有消息撤回若有,找回消息
      • 5.7 分类处理 && 5.8 显示消息
      • 5.9 弹出该消息并run
    • 6. 完整代码

0.安装

  • cmd:pip install itchat
  • 检验是否安装成功:cmd:python -c ”import itchat“

1.首先了解注册方法

1.1两种方法注册消息

import itchat
from itchat.content import *# 不带具体对象注册,将注册为普通消息的回复方法
@itchat.msg_register(TEXT)
def simple_reply(msg):return 'I received: %s' % msg['Text']# 带对象参数注册,对应消息对象将调用该方法
@itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat=True)
def text_reply(msg):msg.user.send('%s: %s' % (msg.type, msg.text))

1.2消息类型

参数 类型 Text键值
TEXT 文本 文本内容
MAP 地图 位置文本
CARD 名片 推荐人字典
NOTE 通知 通知文本
SHARING 分享 分享名称
PICTURE 图片/表情 下载方法
RECORDING 语音 下载方法
ATTACHMENT 附件 下载方法
VIDEO 小视频 下载方法
FRIENDS 好友邀请 添加好友所需参数
SYSTEM 系统消息 更新内容的用户或群聊的UserName组成的列表
  • 例:存储发送给你的邮件
@itchat.msg_register(ATTACHMENT)
def download_files(msg):msg['Text'](msg['FileName'])
  • 群消息增加了三个键值
键值 作用
isAt 判断是否@本号
ActualNickName 实际NickName
Content 实际Content
import itchat
from itchat.content import TEXT@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):print(msg.isAt)print(msg.actualNickName)print(msg.text)itchat.auto_login()
itchat.run()

1.3注册消息的优先级

  • 规则:后注册消息先于先注册消息,带参数消息先于不带参数消息
import itchat
from itchat.content import *itchat.auto_login()@itchat.msg_register(TEXT)
def text_reply(msg):return 'This is the old register'@itchat.msg_register(TEXT)
def text_reply(msg):return 'This is a new one'itchat.run()
#在私聊发送文本时将会回复This is a new one
import itchat
from itchat.content import *itchat.auto_login()@itchat.msg_register
def general_reply(msg):return 'I received a %s' % msg.type@itchat.msg_register(TEXT)
def text_reply(msg):return 'You said to me one to one: %s' % msg.textitchat.run()
#仅在私聊发送文本时将会回复You said to me one to one,其余情况将会回复I received a ...

1.4动态注册消息

  • 动态注册时可以选择将itchat.run()放入另一线程或使用configured_reply()方法处理消息。
# 使用另一线程,但注意不要让程序运行终止
import threadthread.start_new_thread(itchat.run, ())# 使用configured_reply方法
while 1:itchat.configured_reply()# some other functionstime.sleep(1)
  • 例子:
#coding=utf8
import threadimport itchat
from itchat.content import *replyToGroupChat = True
functionStatus = Falsedef change_function():if replyToGroupChat != functionStatus:if replyToGroupChat:@itchat.msg_register(TEXT, isGroupChat=True)def group_text_reply(msg):if u'关闭' in msg['Text']:replyToGroupChat = Falsereturn u'已关闭'elif u'开启' in msg['Text']:return u'已经在运行'return u'输入"关闭"或者"开启"测试功能'else:@itchat.msg_register(TEXT, isGroupChat=True)def group_text_reply(msg):if u'开启' in msg['Text']:replyToGroupChat = Truereturn u'重新开启成功'functionStatus = replyToGroupChatthread.start_new_thread(itchat.run, ())while 1:change_function()time.sleep(.1)

2.简单用法

  • 向文件助手发送消息
import itchat
itchat.auto_login()
itchat.send('Hello, filehelper', toUserName='filehelper')
  • 回应他人文字消息
import itchat@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):return msg.textitchat.auto_login()
itchat.run()

3.高级用法

3.1信息字典的特殊用途

  • 通过将它们打印到屏幕上,您可能会发现它的所有用户和消息都是字典。
  • 但实际上它们是itchat创建的有用类。它们有有用的键和有用的接口。
@itchat.msg_register(TEXT)
def _(msg):# equals to print(msg['FromUserName'])print(msg.fromUserName)
author = itchat.search_friends(nickName='LittleCoder')[0]
author.send('greeting, littlecoder!')

3.2各种信息类型的注册

import itchat, time
from itchat.content import *@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):msg.user.send('%s: %s' % (msg.type, msg.text))@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):msg.download(msg.fileName)typeSymbol = {PICTURE: 'img',VIDEO: 'vid', }.get(msg.type, 'fil')return '@%s@%s' % (typeSymbol, msg.fileName)@itchat.msg_register(FRIENDS)
def add_friend(msg):msg.user.verify()msg.user.send('Nice to meet you!')@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):if msg.isAt:msg.user.send(u'@%s\u2005I received: %s' % (msg.actualNickName, msg.text))itchat.auto_login(True)
itchat.run(True)

3.3二维码命令语句

itchat.auto_login(enableCmdQR=True)# for some linux system, width of block character is one instead of two, so enableCmdQR should be 2
itchat.auto_login(enableCmdQR=2)#change background color
itchat.auto_login(enableCmdQR=-1)

3.4Hot reload

#By using the following command, you may reload the program without re-scan QRCode in some time.itchat.auto_login(hotReload=True)

3.5用户搜索

  1. 获得自身用户信息
  2. 通过用户名获得用户信息
  3. 获取备注名称或微信帐号或昵称与功能名称密钥匹配的用户信息
  4. 获取其备注名称,微信帐号和昵称与给予该功能的用户信息相匹配的用户信息
# get your own user information
itchat.search_friends()
# get user information of specific username
itchat.search_friends(userName='@abcdefg1234567')
# get user information of function 3
itchat.search_friends(name='littlecodersh')
# get user information of function 4
itchat.search_friends(wechatAccount='littlecodersh')
# combination of way 3, 4
itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')

3.6下载与发送

  • itchat的附件下载功能在msg的Text键中
  • 文件名(图片的默认名称)位于msg的FileName键中
  • 下载功能接受一个位置值(包括文件名)并相应地存储附件。
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):msg.download(msg.fileName)itchat.send('@%s@%s' % ('img' if msg['Type'] == 'Picture' else 'fil', msg['FileName']),msg['FromUserName'])return '%s received' % msg['Type']#If you don’t want a local copy of the picture, you may pass nothing to the function to get a binary string.
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):with open(msg.fileName, 'wb') as f:f.write(msg.download())

3.7Multi instance

  • You may use the following commands to open multi instance.
import itchatnewInstance = itchat.new_instance()
newInstance.auto_login(hotReload=True, statusStorageDir='newInstance.pkl')@newInstance.msg_register(itchat.content.TEXT)
def reply(msg):return msg['Text']newInstance.run()

3.8登录和注销后设置回调

  • 通过loginCallback和exitCallback设置登录和注销的回调。
import timeimport itchatdef lc():print('finish login')
def ec():print('exit')itchat.auto_login(loginCallback=lc, exitCallback=ec)
time.sleep(3)
itchat.logout()
  • 如果未设置loginCallback,将删除qr图片并清除cmd。

  • 如果您通过手机退出,也会调用exitCallback。

itchat学习笔记请见另一文章

文章目录

  • 0.安装
  • 1.首先了解注册方法
    • 1.1两种方法注册消息
    • 1.2消息类型
    • 1.3注册消息的优先级
    • 1.4动态注册消息
  • 2.简单用法
  • 3.高级用法
    • 3.1信息字典的特殊用途
    • 3.2各种信息类型的注册
    • 3.3二维码命令语句
    • 3.4Hot reload
    • 3.5用户搜索
    • 3.6下载与发送
    • 3.7Multi instance
    • 3.8登录和注销后设置回调
  • 0. 选题背景
  • 1. 发现问题
  • 2. 提炼问题
  • 3. 解决方案
  • 4. 分析设计
    • 4.0 准备
    • 问题4.1 : 如何用程序登录自己的微信账号?
    • 问题4.2 : 如何用程序获取账号接收到的消息
    • 问题4.3 : 如何识别接收到的消息的不同类别,并作出不同的处理
    • 问题4.4 : 如何实时保存接收到的消息
    • 问题4.5 : 如何检测到其他用户的”撤回“指令
    • 问题4.6 : 如何根据“撤回”指令在保存下来的消息中找到被撤回的消息内容
    • 问题4.7 : 如何在微信中显示撤回的不同类型的内容
  • 5. 代码实现
    • 5.-1 结构
    • 5.0 库引用
    • 5.1 全局变量设置
    • 5.2 登录
    • 5.3 处理接收到的信息
    • 5.4 分类处理
    • 5.5 更新存储变量的字典
    • 5.6 监测是否有消息撤回若有,找回消息
    • 5.7 分类处理 && 5.8 显示消息
    • 5.9 弹出该消息并run
  • 6. 完整代码

0. 选题背景

  • 随着聊天软件的逐渐进步,不知什么时候开始,微信以及QQ都已经提供了消息撤回的功能,提供撤回功能的目的呢,无非就是以下几点:打错字了;发完消息后悔了;调皮了一下却不想让更多的人(或某个人)看到(更多的出现在群组里)。

1. 发现问题

  • 但是人类的好奇心是无法满足的,越是撤回的消息,就越是想要看到,尤其是以下情况:你的朋友(说不定是心上人哦~)撤回了发来的消息,然而你错过了、你的群组里有人撤回了消息,后面是一群人的惊呼,然而你错过了。
  • 怎么可以这样!!!这时候,你(我)就需要一款能够查看撤回消息的神兵利器了!怎么办?当然是求助python了!

2. 提炼问题

  • 要解决WeChat防撤回的功能,主要有以下几个问题有待解决。
  1. 如何用程序登录自己的微信账号
  2. 如何用程序获取账号接收到的消息
  3. 如何识别接收到的消息的不同类别,并作出不同的处理
  4. 如何实时保存接收到的消息
  5. 如何检测到其他用户的“撤回”指令
  6. 如何根据“撤回”指令在保存下来的消息中检索到被撤回的消息内容
  7. 如何在微信中显示撤回的不同类型的内容

3. 解决方案

  • 通过查询了解到,python有一个名为itchat的第三方库,专门为WeChat所写
  • ++itchat is an open source api for WeChat, a commonly-used Chinese social networking app.
    Accessing your personal wechat account through itchat in python has never been easier.
    ++
    ++itchat是微信的开源API,微信是一种常用的中文社交网络应用程序。通过python中的itchat访问您的个人微信帐户变得前所未有的如此简单。++
  • 上面的一段话是PyPI对itchat库的介绍,而我们微信防撤回系统的实现也是基于itchat库的。
  • 方法:通过itchat库实现个人微信的登录、消息获取以及分类处理、撤回消息指令的识别以及撤回消息的寻找、撤回内容在wechat上的显示。

4. 分析设计

4.0 准备

  • 本部分是对各个问题关键点进行的分析设计,主要是各个问题需要用什么样的知识点、什么样的函数来完成,具体步骤以及完整代码请见下面“5. 代码实现”部分
  • 在对WeChat开始“骚”操作之前,首先我们要有一定的知识储备,我首先对itchat库进行了初步的学习,学习笔记参见附件。

问题4.1 : 如何用程序登录自己的微信账号?

#通过此函数实现账号登录itchat.login()

问题4.2 : 如何用程序获取账号接收到的消息

问题4.3 : 如何识别接收到的消息的不同类别,并作出不同的处理

# 对消息进行注册使用下面的语句@itchat.msg_register([a,b,c])# 以下实现了对不同类别a,b,c的分类以及处理处理def handleRMsg(msg):# balabala

问题4.4 : 如何实时保存接收到的消息

# 创建一个全局变量字典,用来保存消息相关信息
msg_info = {}# 在对消息处理之后将信息储存到msg_info中
msg_info.update({msg_id: {"":"":"":"":}})

问题4.5 : 如何检测到其他用户的”撤回“指令

if '撤回了一条消息' in msg['Content']:

问题4.6 : 如何根据“撤回”指令在保存下来的消息中找到被撤回的消息内容

# 用正则表达式查找message id
recall_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)
# 在存储的信息中根据message id查找消息
recall_msg = msg_info.get(recall_msg_id)

问题4.7 : 如何在微信中显示撤回的不同类型的内容

# 将消息发送到文件传输助手以便查看
itchat.send_msg(msg_prime, toUserName='filehelper')

5. 代码实现

5.-1 结构

  • 我们首先清晰一下程序的大致结构
  1. 库引用
  2. 全局变量设置
  3. 登录
  4. 处理接收到的信息
  5. 分类处理
  6. 更新存储变量的字典
  7. 监测是否有消息撤回若有,找回消息
  8. 分类处理
  9. 显示消息
  10. 弹出该消息并run

5.0 库引用

  • 本次将会用到以下几个函数库,其中,itchat.content以此方式引用更利于代码的美观以及简洁。
import re
import time
import itchat
import platform
from itchat.content import *

5.1 全局变量设置

  • emmmmm说是全局变量设置,但事实上用到的全局变量就只有一个存储消息相关信息的字典~(@^_^@)~
# 用来存储消息相关信息的字典
msg_info = {}

5.2 登录

# 调用platform库判断操作系统,以便接下来的登录操作
# 登录函数如下,该函数执行过后用户可通过扫描二维码登录网页版微信
if platform.platform()[:7] == 'Windows':itchat.login(enableCmdQR=False)
else:itchat.login(enableCmdQR=True)

5.3 处理接收到的信息

# 注册,分别对应文本,图片,好友申请,名片,地图信息,分享,语音,附件,视频
# isFriendChat对应朋友会话,isMpChat对应公众号会话,另isGroupChat对应群组会话
@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True, isMpChat=True)
def handleRMsg(msg):# 获取接收消息的时间并将时间字符串格式化msg_time_receive = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())# 获取发信人信息try:# 通过'FromUserName'寻找到一个字典并取其'NickName'赋值给msg_frommsg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']except:# 如果非正常,则是WeChat官方声明msg_from = 'WeChat Official Accounts'# 获取发信时间msg_time_send = msg['CreateTime']# 获取信息IDmsg_id = msg['MsgId']# 消息内容置空msg_content = None# link置空msg_link = None

5.4 分类处理

# 文本或者好友推荐if msg['Type'] == 'Text' or msg['Type'] == 'Friends':msg_content = msg['Text']print('[Text/Friends]: %s' % msg_content)# 附件/视频/图片/语音elif msg['Type'] == 'Attachment' or msg['Type'] == "Video" or msg['Type'] == 'Picture' or msg['Type'] == 'Recording':msg_content = msg['FileName']msg['Text'](str(msg_content))print('[Attachment/Video/Picture/Recording]: %s' % msg_content)# 推荐名片elif msg['Type'] == 'Card':msg_content = msg['RecommendInfo']['NickName'] + '的推荐名片,'if msg['RecommendInfo']['Sex'] == 1:msg_content += '性别男。'else:msg_content += '性别女。'print('[Card]: %s' % msg_content)# 位置信息elif msg['Type'] == 'Map':x, y, location = re.search("<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)if location is None:msg_content = r"纬度:" + x.__str__() + ", 经度:" + y.__str__()else:msg_content = r"" + locationprint('[Map]: %s' % msg_content)# 分享的音乐/文章elif msg['Type'] == 'Sharing':msg_content = msg['Text']msg_link = msg['Url']print('[Sharing]: %s' % msg_content)

5.5 更新存储变量的字典

# 更新msg_info.update({msg_id: {"msg_from": msg_from,"msg_time_send": msg_time_send,"msg_time_receive": msg_time_receive,"msg_type": msg["Type"],"msg_content": msg_content,"msg_link": msg_link}})

5.6 监测是否有消息撤回若有,找回消息

# 再次注册NOTE即通知类型
@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)
def monitor(msg):if '撤回了一条消息' in msg['Content']:# 此处\<msgid\>(.*?)\<\/msgid\>的原因是,如果将msg['Content']打印出来,会在其中得到含有\<msgid\> \<\/msgid\>的一段信息# 而(.*?)则是正则表达式,用于匹配其中的任意字符串# 同时,group(1)表示从第一个左括号处开始匹配recall_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)recall_msg = msg_info.get(recall_msg_id)print('[Recall]: %s' % recall_msg)

5.7 分类处理 && 5.8 显示消息

# 分类并处理msg_prime = '---' + recall_msg.get('msg_from') + '撤回了一条消息---\n' \'消息类型:' + recall_msg.get('msg_type') + '\n' \'时间:' + recall_msg.get('msg_time_receive') + '\n' \'内容:' + recall_msg.get('msg_content')if recall_msg['msg_type'] == 'Sharing':msg_prime += '\n链接:' + recall_msg.get('msg_link')# 向文件助手发送消息itchat.send_msg(msg_prime, toUserName='filehelper')if recall_msg['msg_type'] == 'Attachment' or recall_msg['msg_type'] == "Video" or recall_msg['msg_type'] == 'Picture' or recall_msg['msg_type'] == 'Recording':file = '@fil@%s' % (recall_msg['msg_content'])itchat.send(msg=file, toUserName='filehelper')

5.9 弹出该消息并run

# 弹出并runmsg_info.pop(recall_msg_id)
itchat.run()

6. 完整代码

import re
import time
import itchat
import platform
from itchat.content import *
# 用来存储消息相关信息的字典
msg_info = {}
# 调用platform库判断操作系统,以便接下来的登录操作
# 登录函数如下,该函数执行过后用户可通过扫描二维码登录网页版微信
if platform.platform()[:7] == 'Windows':itchat.login(enableCmdQR=False)
else:itchat.login(enableCmdQR=True)
# 注册,分别对应文本,图片,好友申请,名片,地图信息,分享,语音,附件,视频
# isFriendChat对应朋友会话,isMpChat对应公众号会话,另isGroupChat对应群组会话
@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True, isMpChat=True)
def handleRMsg(msg):# 获取接收消息的时间并将时间字符串格式化msg_time_receive = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())# 获取发信人信息try:# 通过'FromUserName'寻找到一个字典并取其'NickName'赋值给msg_frommsg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']except:# 如果非正常,则是WeChat官方声明msg_from = 'WeChat Official Accounts'# 获取发信时间msg_time_send = msg['CreateTime']# 获取信息IDmsg_id = msg['MsgId']# 消息内容置空msg_content = None# link置空msg_link = None
# 文本或者好友推荐if msg['Type'] == 'Text' or msg['Type'] == 'Friends':msg_content = msg['Text']print('[Text/Friends]: %s' % msg_content)# 附件/视频/图片/语音elif msg['Type'] == 'Attachment' or msg['Type'] == "Video" or msg['Type'] == 'Picture' or msg['Type'] == 'Recording':msg_content = msg['FileName']msg['Text'](str(msg_content))print('[Attachment/Video/Picture/Recording]: %s' % msg_content)# 推荐名片elif msg['Type'] == 'Card':msg_content = msg['RecommendInfo']['NickName'] + '的推荐名片,'if msg['RecommendInfo']['Sex'] == 1:msg_content += '性别男。'else:msg_content += '性别女。'print('[Card]: %s' % msg_content)# 位置信息elif msg['Type'] == 'Map':x, y, location = re.search("<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)if location is None:msg_content = r"纬度:" + x.__str__() + ", 经度:" + y.__str__()else:msg_content = r"" + locationprint('[Map]: %s' % msg_content)# 分享的音乐/文章elif msg['Type'] == 'Sharing':msg_content = msg['Text']msg_link = msg['Url']print('[Sharing]: %s' % msg_content)msg_info.update({msg_id: {"msg_from": msg_from,"msg_time_send": msg_time_send,"msg_time_receive": msg_time_receive,"msg_type": msg["Type"],"msg_content": msg_content,"msg_link": msg_link}})
# 再次注册NOTE即通知类型
@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)
def monitor(msg):if '撤回了一条消息' in msg['Content']:# 此处\<msgid\>(.*?)\<\/msgid\>的原因是,如果将msg['Content']打印出来,会在其中得到含有\<msgid\> \<\/msgid\>的一段信息# 而(.*?)则是正则表达式,用于匹配其中的任意字符串# 同时,group(1)表示从第一个左括号处开始匹配recall_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)recall_msg = msg_info.get(recall_msg_id)print('[Recall]: %s' % recall_msg)msg_prime = '---' + recall_msg.get('msg_from') + '撤回了一条消息---\n' \'消息类型:' + recall_msg.get('msg_type') + '\n' \'时间:' + recall_msg.get('msg_time_receive') + '\n' \'内容:' + recall_msg.get('msg_content')if recall_msg['msg_type'] == 'Sharing':msg_prime += '\n链接:' + recall_msg.get('msg_link')# 向文件助手发送消息itchat.send_msg(msg_prime, toUserName='filehelper')if recall_msg['msg_type'] == 'Attachment' or recall_msg['msg_type'] == "Video" or recall_msg['msg_type'] == 'Picture' or recall_msg['msg_type'] == 'Recording':file = '@fil@%s' % (recall_msg['msg_content'])itchat.send(msg=file, toUserName='filehelper')msg_info.pop(recall_msg_id)
itchat.run()

python itchat库学习笔记 + 微信防撤回实现详解(超详细)(已上传)相关推荐

  1. python微信库wxpy_python wxpy微信防撤回功能

    python使用wxpy轻松实现微信防撤回的方法 最近比较闲就随便瞎看,看到了微信防撤回就顺便跟着学着实现一下 使用的是wxpy,安装方法pip install wxpy(我使用的是python2.7 ...

  2. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

  3. Python pillow库学习笔记

    Python pillow库学习笔记 PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以 ...

  4. pythondifflib详解_用python标准库difflib比较两份文件的异同详解

    [需求背景] 有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_file,但是输出的结果读起来不是很友好.这时候使用python ...

  5. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  6. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解

    i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解 1 前言 2 FlexCAN简介 2.1 MB(邮箱)系统 2.1.1 正常模式下 2.1.2 激活了CAN FD情况下 2. ...

  7. IP地址和子网划分学习笔记之《IP地址详解》

    在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...

  8. 我的学习笔记——CSS背景渐变(Gradients)详解

    我的学习笔记--CSS背景渐变(Gradients)详解 一.线性渐变(Linear Gradients) 1.语法 background-image: linear-gradient(directi ...

  9. IP地址和子网划分学习笔记之《子网划分详解》

    一,子网划分概述 IP地址和子网划分学习笔记相关篇章: 1.IP地址和子网划分学习笔记之<预备知识:进制计数> 2.IP地址和子网划分学习笔记之<IP地址详解> 3.IP地址和 ...

  10. MIT 6.824 学习笔记(一)--- RPC 详解

    从本文开始,将记录作者学习 MIT 6.824 分布式系统的学习笔记,如果有志同道合者,欢迎一起交流. RPC 的定义和结构 RPC 全称为 Remote Procedure Call,他表示一种远程 ...

最新文章

  1. 事件冒泡之cancelBubble和stoppropagation的区别
  2. Jsp----注册登陆
  3. js向服务器发送信息,Angularjs向服务器发送请求
  4. python波峰波谷算法_波动均分算法
  5. 进程共享(读时共享写时复制)
  6. 一道Js判断对象是否相等面试题引发的故事
  7. 程序员面试金典 - 面试题 16.01. 交换数字(位运算swap)
  8. python运算符_Python运算符总结
  9. vvv在线文档导出工具_胖观察在线协作文档导出之痛?主流协作文档导出评测
  10. 阿里云智能 AIoT 首席科学家丁险峰:阿里全面进军 IoT 这一年 | 问底中国 IT 技术演进
  11. u盘装杀毒软件给计算机杀毒,安装在U盘的杀毒软件时刻护卫U盘文件安全
  12. linux下列出绝对路径的最快捷的方法lls
  13. 苹果电脑安装windows双系统
  14. lay-verify的失效情况
  15. 【PCB设计】Mac系统Autodesk EAGLE PCB使用入门教程
  16. 2020Java面试题汇总(2020年负重前行的Java码畜社招遇到的Java面试题---亲历总结)
  17. 聚焦大规模分布式机器学习,全面剖析Google TensorFlow,来看阿里、京东等在人工智能技术的进展...
  18. 【概率论与数理统计】
  19. 【超详细】开源JZVideo饺子播放器播放器配置使用以及其自定义
  20. CSP 202012-5 星际旅行(60分)

热门文章

  1. 佳能ts9020墨盒不识别_打印机 篇一:Canon 佳能 TS9120 开箱使用体验、墨水和无线网连接...
  2. matlab信号加入白噪音再分离,Matlab中给信号增加白噪声
  3. CAN总线标准及协议分析
  4. 单片机音频谱曲软件_单片机谱曲软件讲解
  5. 行为树BT设计与实现
  6. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在Segger Ozone下的使用
  7. 如何使用SiteSucker下载HTML源文件?下载html源文件的两种方法
  8. qt.qpa.plugin: Could not find the Qt platform plugin “xcb“ in ““ 详细解决办法
  9. python爬虫模拟登录之图片验证码
  10. VS2013安装SVN插件