Maison >développement back-end >Tutoriel Python >Bibliothèque Python WeChat : explication détaillée de l'utilisation d'itchat

Bibliothèque Python WeChat : explication détaillée de l'utilisation d'itchat

不言
不言original
2018-04-28 14:35:1446364parcourir

Cet article présente principalement l'utilisation détaillée de la bibliothèque Python WeChat : itchat. Maintenant, je le partage avec vous et le donne comme référence. Allons jeter un oeil

Sur le forum, j'ai vu utiliser Python pour me connecter à WeChat et réaliser une connexion automatique, puis j'ai découvert une nouvelle bibliothèque Python : itchat

Le le lien vers la documentation de la bibliothèque est ici : itchat

J'ai enregistré un fichier sur mon site Web (principalement parce que je l'ouvre très lentement) pour pouvoir le lire plus tard.

0x01 Démarrer

La réponse la plus simple

Avec le code suivant, vous pouvez répondre à tous les messages texte (y compris les discussions de groupe).


import itchat
from itchat.content import TEXT

@itchat.msg_register
def simple_reply(msg):
  if msg['Type'] == TEXT:
    return 'I received: %s' % msg['Content']

itchat.auto_login()
itchat.run()


Configuration des messages courants

itchat prend en charge tous les types de messages et les discussions de groupe, l'exemple suivant simple la configuration de ces types de messages est illustrée dans .


#coding=utf8
import itchat
from itchat.content import *

@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
  itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])

# 以下四类的消息的Text键下存放了用于下载消息内容的方法,传入文件地址即可
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
  msg['Text'](msg['FileName'])
  return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName'])

# 收到好友邀请自动添加好友
@itchat.msg_register(FRIENDS)
def add_friend(msg):
  itchat.add_friend(**msg['Text']) # 该操作会自动将新好友的消息录入,不需要重载通讯录
  itchat.send_msg('Nice to meet you!', msg['RecommendInfo']['UserName'])

# 在注册时增加isGroupChat=True将判定为群聊回复
@itchat.msg_register(TEXT, isGroupChat = True)
def groupchat_reply(msg):
  if msg['isAt']:
    itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName'])

itchat.auto_login(True)
itchat.run()


Bien sûr, il n'est pas nécessaire d'expliquer pourquoi ces choses peuvent être écrites comme ça, j'ai publié un échantillon. programme ici juste pour vous donner une idée de ce à quoi pourrait ressembler le code lié au SDK.

Après avoir une compréhension générale du modèle, nous pouvons passer à la partie suivante de l'introduction.

Connexion 0x02

Dans la partie précédente, vous avez vu l'enregistrement et la connexion de base, et évidemment la connexion utilise itchat fournit la méthode auto_login, qui peut être appelée pour terminer la connexion.

De manière générale, nous nous connecterons après avoir terminé l'enregistrement du message.

Bien sûr, trois points doivent être soulignés ici, à savoir l'arrêt et la reconnexion à court terme, le code QR en ligne de commande et le contenu de connexion personnalisé. itchat fournit un stockage temporaire du statut de connexion. Vous pouvez vous connecter sans scanner le code QR dans un certain délai après la fermeture du programme. Afin de faciliter l'utilisation d'itchat sans interface graphique, le programme dispose d'un affichage intégré des codes QR en ligne de commande. * Si vous devez apporter des modifications au statut de connexion (comme modifier l'invite, envoyer un e-mail après l'apparition du code QR, etc.).

**0x01-1 Fermez le programme pendant une courte période puis reconnectez-vous**

De cette façon, même si le programme est fermé et rouvert dans un certain laps de temps, il y a pas besoin de scanner à nouveau le code.

L'utilisation la plus simple consiste à transmettre hotReload avec une valeur vraie à la méthode auto_login.

Cette méthode générera un fichier statique itchat.pkl pour stocker le statut de connexion.


import itchat
from itchat.content import TEXT

@itchat.msg_register(TEXT)
def simple_reply(msg):
  print(msg['Text'])

itchat.auto_login(hotReload=True)
itchat.run()
itchat.dump_login_status()


Les fichiers statiques peuvent être spécifiés comme d'autres valeurs en définissant statusStorageDir.

Cette option intégrée est en fait équivalente à ce programme utilisant les deux fonctions suivantes :


import itchat
from itchat.content import TEXT

if itchat.load_login_status():
  @itchat.msg_register(TEXT)
  def simple_reply(msg):
    print(msg['Text'])
  itchat.run()
  itchat.dump_login_status()
else:
  itchat.auto_login()
  itchat.dump_login_status()
  print('Config stored, so exit.')


Load_login_status et dump_login_status correspondent respectivement aux paramètres de lecture et d'exportation.

Vous pouvez définir les fichiers importés et exportés en définissant la valeur du fileDir transmis.

**0x01-2 Affichage du code QR en ligne de commande**

Vous pouvez utiliser la ligne de commande pour afficher le code QR lors de la connexion via la commande suivante :


itchat.auto_login(enableCmdQR=True)


Certains systèmes peuvent avoir des largeurs de caractères différentes, qui peuvent être ajustées en attribuant activateCmdQR à un multiple spécifique :


# 如部分的linux系统,块字符的宽度为一个字符(正常应为两字符),故赋值为2
itchat.auto_login(enableCmdQR=2)


La couleur d'arrière-plan de la console par défaut est sombre (noir). Si la couleur d'arrière-plan est claire (blanc), activateCmdQR peut se voir attribuer une valeur négative :

<.>


itchat.auto_login(enableCmdQR=-1)


**0x01-2 Processus de connexion personnalisé**

Si vous avez besoin de contrôler le processus de connexion, vous pouvez lisez le contenu suivant.

En même temps, itchat fournit également chaque étape requise pour la connexion. Le processus de connexion est en ordre : Obtenez le code QR uuid-> Obtenez le code QR-> > Obtenir les données d'initialisation -> Mettre à jour les informations relatives à WeChat (carnet d'adresses, état de connexion du téléphone mobile) -> Scanner les nouvelles informations en boucle (activer le battement de cœur)

Obtenir le code QR uuid

Récupérez l'uuid requis pour générer le code QR et renvoyez-le.

Nom de la méthode : get_QRuuid

Valeur requise : Aucune
Valeur de retour : Succès->uuid, Échec->Aucun

Obtenir le code QR

Récupérez le code QR basé sur l'uuid, ouvrez-le et indiquez s'il a réussi.

Nom de la méthode : get_QR

Valeur requise : uuid
Valeur de retour : Succès->Vrai, échec->False

Juger si elle a été Connexion réussie

Déterminez si la connexion est réussie et renvoyez le code d'état numérisé.

Nom de la méthode : check_login

Valeur requise : uuid
Valeur de retour : Connexion réussie->'200', code QR scanné->'201', code QR invalide->'408 ', aucune information obtenue ->'0'

Obtenir les données d'initialisation

Obtenir les informations utilisateur WeChat et les données requises pour le battement de cœur.

Nom de la méthode : web_init

Valeur requise : Aucune
Valeur de retour : Dictionnaire pour stocker les informations de connexion de l'utilisateur WeChat

Obtenir le carnet d'adresses WeChat

Obtenez toutes les informations sur les amis WeChat et mettez-les à jour.

Nom de la méthode : get_contract

Valeur requise : Aucune
Valeur de retour : Liste des informations sur les amis stockées

Mettre à jour le statut de connexion mobile WeChat

Afficher le statut de connexion sur le téléphone mobile.

Nom de la méthode : show_mobile_login

Valeur requise : Aucune
Valeur de retour : Aucune

Analyse en boucle pour de nouvelles informations (activer le rythme cardiaque)

Analysez en boucle les nouveaux messages et activez les paquets de battements de cœur.

方法名称: start_receiving
所需值:无
返回值:无

EG:

一个登录例子:


import itchat, time, sys

def output_info(msg):
  print(&#39;[INFO] %s&#39; % msg)

def open_QR():
  for get_count in range(10):
    output_info(&#39;Getting uuid&#39;)
    uuid = itchat.get_QRuuid()
    while uuid is None: uuid = itchat.get_QRuuid();time.sleep(1)
    output_info(&#39;Getting QR Code&#39;)
    if itchat.get_QR(uuid): break
    elif get_count >= 9:
      output_info(&#39;Failed to get QR Code, please restart the program&#39;)
      sys.exit()
  output_info(&#39;Please scan the QR Code&#39;)
  return uuid

uuid = open_QR()
waitForConfirm = False
while 1:
  status = itchat.check_login(uuid)
  if status == &#39;200&#39;:
    break
  elif status == &#39;201&#39;:
    if waitForConfirm:
      output_info(&#39;Please press confirm&#39;)
      waitForConfirm = True
  elif status == &#39;408&#39;:
    output_info(&#39;Reloading QR Code&#39;)
    uuid = open_QR()
    waitForConfirm = False
userInfo = itchat.web_init()
itchat.show_mobile_login()
itchat.get_contract()
output_info(&#39;Login successfully as %s&#39;%userInfo[&#39;NickName&#39;])
itchat.start_receiving()

# Start auto-replying
@itchat.msg_register
def simple_reply(msg):
  if msg[&#39;Type&#39;] == &#39;Text&#39;:
    return &#39;I received: %s&#39; % msg[&#39;Content&#39;]
itchat.run()


0x03 Register

注册消息方法

itchat将根据接收到的消息类型寻找对应的已经注册的方法。

如果一个消息类型没有对应的注册方法,该消息将会被舍弃。

在运行过程当中也可以动态注册方法,注册方式与结果不变。

注册

你可以通过两种方式注册消息方法


import itchat
from itchat.content import *

# 不带参数注册,所有消息类型都将调用该方法(包括群消息)
@itchat.msg_register
def simple_reply(msg):
  if msg[&#39;Type&#39;] == &#39;Text&#39;:
    return &#39;I received: %s&#39; % msg[&#39;Text&#39;]

# 带参数注册,该类消息类型将调用该方法
@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
  itchat.send(&#39;%s: %s&#39; % (msg[&#39;Type&#39;], msg[&#39;Text&#39;]), msg[&#39;FromUserName&#39;])


消息类型

向注册方法传入的msg包含微信返回的字典的所有内容。

本api增加Text、Type(也就是参数)键值,方便操作。

itchat.content中包含所有的消息类型参数,内容如下表所示:

比如你需要存储发送给你的附件:


@itchat.msg_register(ATTACHMENT)
def download_files(msg):
  msg[&#39;Text&#39;](msg[&#39;FileName&#39;])


值得注意的是,群消息增加了三个键值: isAt: 判断是否@本号 ActualNickName: 实际NickName * Content: 实际Content

可以通过本程序测试:


import itchat
from itchat.content import TEXT

@itchat.msg_register(TEXT, isGroupChat = True)
def text_reply(msg):
  print(msg[&#39;isAt&#39;])
  print(msg[&#39;ActualNickName&#39;])
  print(msg[&#39;Content&#39;])

itchat.auto_login()
itchat.run()


注册消息的优先级

优先级分别为:后注册消息先于先注册消息,带参数消息先于不带参数消息。

以下面的两个程序为例:


import itchat
from itchat.content import *

itchat.auto_login()

@itchat.msg_register(TEXT)
def text_reply(msg):
  return &#39;This is the old register&#39;

@itchat.msg_register(TEXT)
def text_reply(msg):
  return &#39;This is a new one&#39;

itchat.run()


在私聊发送文本时将会回复This is a new one。


import itchat
from itchat.content import *

itchat.auto_login()

@itchat.msg_register
def general_reply(msg):
  return &#39;I received a %s&#39; % msg[&#39;Type&#39;]

@itchat.msg_register(TEXT)
def text_reply(msg):
  return &#39;You said to me one to one: %s&#39; % msg[&#39;Text&#39;]

itchat.run()


仅在私聊发送文本时将会回复You said to me one to one,其余情况将会回复I received a ...。

动态注册消息

动态注册时可以选择将 itchat.run() 放入另一线程或使用 configured_reply() 方法处理消息。

两种方法分别是:


# 使用另一线程,但注意不要让程序运行终止
import thread

thread.start_new_thread(itchat.run, ())

# 使用configured_reply方法
while 1:
  itchat.configured_reply()
  # some other functions
  time.sleep(1)


以下给出一个动态注册的例子:


#coding=utf8
import thread

import itchat
from itchat.content import *

replyToGroupChat = True
functionStatus = False

def change_function():
  if replyToGroupChat != functionStatus:
    if replyToGroupChat:
      @itchat.msg_register(TEXT, isGroupChat = True)
      def group_text_reply(msg):
        if u&#39;关闭&#39; in msg[&#39;Text&#39;]:
          replyToGroupChat = False
          return u&#39;已关闭&#39;
        elif u&#39;开启&#39; in msg[&#39;Text&#39;]:
          return u&#39;已经在运行&#39;
        return u&#39;输入"关闭"或者"开启"测试功能&#39;
    else:
      @itchat.msg_register(TEXT, isGroupChat = True)
      def group_text_reply(msg):
        if u&#39;开启&#39; in msg[&#39;Text&#39;]:
          replyToGroupChat = True
          return u&#39;重新开启成功&#39;
    functionStatus = replyToGroupChat

thread.start_new_thread(itchat.run, ())

while 1:
  change_function()
  time.sleep(.1)


0x04 Reply

回复

itchat提供五种回复方法,建议直接使用send方法。

send方法

方法:


send(msg=&#39;Text Message&#39;, toUserName=None)


所需值:

1.msg:消息内容

2.'@fil@文件地址'将会被识别为传送文件,'@img@图片地址'将会被识别为传送图片,'@vid@视频地址'将会被识别为小视频

3.toUserName:发送对象,如果留空将会发送给自己

返回值:发送成功->True, 失败->False


#coding=utf8
import itchat

itchat.auto_login()
itchat.send(&#39;Hello world!&#39;)
# 请确保该程序目录下存在:gz.gif以及xlsx.xlsx
itchat.send(&#39;@img@%s&#39; % &#39;gz.gif&#39;)
itchat.send(&#39;@fil@%s&#39; % &#39;xlsx.xlsx&#39;)
itchat.send(&#39;@vid@%s&#39; % &#39;demo.mp4&#39;)


send_msg方法

方法:


send_msg(msg=&#39;Text Message&#39;, toUserName=None)


所需值:

msg:消息内容
 toUserName:发送对象,如果留空将会发送给自己
返回值:发送成功->True, 失败->False

程序示例:


import itchat

itchat.auto_login()

itchat.send_msg(&#39;Hello world&#39;)


send_file方法

方法:


send_file(fileDir, toUserName=None)


所需值:

fileDir:文件路径(不存在该文件时将打印无此文件的提醒)
 toUserName:发送对象,如果留空将会发送给自己
返回值:发送成功->True, 失败->False


#coding=utf8

import itchat

itchat.auto_login()

#请确保该程序目录下存在:xlsx.xlsx

itchat.send_file(&#39;xlsx.xlsx&#39;)


send_img方法

方法:


send_img(fileDir, toUserName=None)


所需值:

fileDir:文件路径(不存在该文件时将打印无此文件的提醒)
 toUserName:发送对象,如果留空将会发送给自己
返回值:发送成功->True, 失败->False


#coding=utf8
import itchat

itchat.auto_login()
# 请确保该程序目录下存在:gz.gif
itchat.send_img(&#39;gz.gif&#39;)


send_video方法

方法:


send_video(fileDir, toUserName=None)


所需值:

fileDir:文件路径(不存在该文件时将打印无此文件的提醒)
 toUserName:发送对象,如果留空将会发送给自己
返回值:发送成功->True, 失败->False

需要保证发送的视频为一个实质的mp4文件


#coding=utf8

import itchat

itchat.auto_login()

#请确保该程序目录下存在:demo.mp4

itchat.send_file(&#39;demo.mp4&#39;)


0x05 Memmber stuff

在使用个人微信的过程当中主要有三种账号需要获取,分别为: 好友 公众号 * 群聊

itchat为这三种账号都提供了整体获取方法与搜索方法。

而群聊多出获取用户列表方法以及创建群聊、增加、删除用户的方法。

这里我们分这三种分别介绍如何使用。

好友

好友的获取方法为 get_friends ,将会返回完整的好友列表。 其中每个好友为一个字典 列表的第一项为本人的账号信息 * 传入update键为True将可以更新好友列表并返回

好友的搜索方法为 search_friends ,有四种搜索方式: 1. 仅获取自己的用户信息 2. 获取特定 UserName 的用户信息 3. 获取备注、微信号、昵称中的任何一项等于 name 键值的用户 4. 获取备注、微信号、昵称分别等于相应键值的用户

其中三、四项可以一同使用,下面是示例程序:


# 获取自己的用户信息,返回自己的属性字典
itchat.search_friends()
# 获取特定UserName的用户信息
itchat.search_friends(userName=&#39;@abcdefg1234567&#39;)
# 获取任何一项等于name键值的用户
itchat.search_friends(name=&#39;littlecodersh&#39;)
# 获取分别对应相应键值的用户
itchat.search_friends(wechatAccount=&#39;littlecodersh&#39;)
# 三、四项功能可以一同使用
itchat.search_friends(name=&#39;LittleCoder机器人&#39;, wechatAccount=&#39;littlecodersh&#39;)


公众号

公众号的获取方法为 get_mps ,将会返回完整的公众号列表。 其中每个公众号为一个字典 传入update键为True将可以更新公众号列表并返回

公众号的搜索方法为 search_mps ,有两种搜索方法: 1. 获取特定 UserName 的公众号 2. 获取名字中含有特定字符的公众号

如果两项都做了特定,将会仅返回特定 UserName 的公众号,下面是示例程序:


# 获取特定UserName的公众号,返回值为一个字典
itchat.search_mps(userName=&#39;@abcdefg1234567&#39;)
# 获取名字中含有特定字符的公众号,返回值为一个字典的列表
itcaht.search_mps(name=&#39;LittleCoder&#39;)
# 以下方法相当于仅特定了UserName
itchat.search_mps(userName=&#39;@abcdefg1234567&#39;, name=&#39;LittleCoder&#39;)


群聊

群聊的获取方法为 get_chatrooms ,将会返回完整的群聊列表。 其中每个群聊为一个字典 传入update键为True将可以更新群聊列表并返回

群聊的搜索方法为 search_chatrooms ,有两种搜索方法: 1. 获取特定UserName的群聊 2. 获取名字中含有特定字符的群聊

如果两项都做了特定,将会仅返回特定UserName的群聊,下面是示例程序:


# 获取特定UserName的群聊,返回值为一个字典
itchat.search_chatrooms(userName=&#39;@abcdefg1234567&#39;)
# 获取名字中含有特定字符的群聊,返回值为一个字典的列表
itcaht.search_chatrooms(name=&#39;LittleCoder&#39;)
# 以下方法相当于仅特定了UserName
itchat.search_chatrooms(userName=&#39;@abcdefg1234567&#39;, name=&#39;LittleCoder&#39;)


群聊用户列表的获取方法为 update_chatroom 。 群聊在首次获取中不会获取群聊的用户列表,所以需要调用该命令才能获取群聊的成员 该方法需要传入群聊的UserName,返回特定群聊的用户列表


memberList = itchat.update_chatroom(&#39;@abcdefg1234567&#39;)


创建群聊、增加、删除群聊用户的方法如下所示: 由于之前通过群聊检测是否被好友拉黑的程序,目前这三个方法都被严格限制了使用频率 删除群聊需要本账号为群管理员,否则会失败


memberList = itchat.get_friends()[1:]
# 创建群聊,topic键值为群聊名
chatroomUserName = itchat.create_chatroom(memberList, &#39;test chatroom&#39;)
# 删除群聊内的用户
itchat.delete_member_from_chatroom(chatroomUserName, memberList[0])
# 增加用户进入群聊
itchat.add_member_into_chatroom(chatroomUserName, memberList[0])


0x06 QAQ

Q: 为什么我在设定了itchat.auto_login()的enableCmdQR为True后还是没有办法在命令行显示二维码?

A: 这是由于没有安装可选的包 pillow ,可以使用右边的命令安装: pip install pillow

0x07 Eg


def signin():
    # 查找公众号,进行签到
    user = itchat.search_mps(name=&#39;Nulll.me&#39;)
    UserName = user[0][&#39;UserName&#39;]
    itchat.send(msg=u&#39;3&#39;, toUserName=UserName)
    itchat.dump_login_status()
    pickleDumps(&#39;flag&#39;, localDay) # 如果执行成功写入标致文件
    exit()


if __name__ == &#39;__main__&#39;:
    # 如果不是在登陆状态,就循环登陆
    while not itchat.load_login_status():
        sendMail()
        itchat.auto_login(hotReload=True)
        itchat.dump_login_status()
        signin() # 签到
        time.sleep(3600)
    signin() # 签到

相关推荐:

python微信库itchat如何实现微信自动回复功能的代码实例

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn