>  기사  >  백엔드 개발  >  Python WeChat 라이브러리: itchat 사용법에 대한 자세한 설명

Python WeChat 라이브러리: itchat 사용법에 대한 자세한 설명

不言
不言원래의
2018-04-28 14:35:1446248검색

이 글은 주로 Python WeChat 라이브러리:itchat의 자세한 사용법을 소개합니다. 이제 공유하고 참고용으로 제공합니다. 같이 구경가세요

포럼에서 Python을 사용해 WeChat에 로그인하고 자동 로그인을 구현하는 걸 봤는데, 새로운 Python 라이브러리인 itchat에 대해 알게 됐어요

라이브러리 문서 설명 링크는 여기예요 : itchat

나중에 읽을 수 있도록 웹사이트에 파일을 저장했습니다(주로 매우 느리게 열었기 때문입니다).

0x01 시작

가장 간단한 답장

다음 코드를 사용하면 모든 문자 메시지(그룹 채팅 포함)에 답장할 수 있습니다.


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()


일반 메시지 구성

itchat은 모든 메시지 유형과 그룹 채팅을 지원합니다. 다음 예에서는 이러한 메시지 유형의 간단한 구성을 보여줍니다.


#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()


물론 왜 이렇게 작성될 수 있는지 깊이 파고들 필요는 없습니다. SDK 관련 코드가 어떻게 보이는지 알려드리기 위해 여기에 샘플 프로그램을 공개했습니다. 좋다.

모델에 대한 전반적인 이해가 끝나면 소개의 다음 부분으로 넘어갈 수 있습니다.

0x02 Login

이전 부분에서 기본적인 회원가입과 로그인을 보셨는데, 분명히 로그인은 itchat에서 제공하는 auto_login 메소드를 사용하고 있는데, 이를 호출하면 로그인이 완료됩니다.

일반적으로 메시지 등록을 완료한 후 로그인을 진행합니다.

물론 여기서 강조해야 할 세 가지 사항은 단기 종료 및 재접속, 명령줄 QR 코드 및 사용자 정의 로그인 콘텐츠입니다. itchat은 로그인 상태를 임시로 저장하는 기능을 제공하며, 프로그램 종료 후 일정 시간 동안 QR코드를 스캔하지 않고도 로그인이 가능합니다. 그래픽 인터페이스 없이 itchat을 쉽게 사용할 수 있도록 프로그램에는 명령줄 QR 코드 표시 기능이 내장되어 있습니다. * 로그인 상태를 일부 수정해야 하는 경우(예: 프롬프트 변경, QR 코드가 표시된 후 이메일 보내기 등)

**0x01-1 잠시 프로그램을 닫았다가 다시 연결하세요**

이렇게 하면 일정 시간 내에 프로그램을 닫았다가 다시 열어도 코드를 다시 스캔할 필요가 없습니다.

가장 간단한 사용법은 hotReload를 true 값으로 auto_login 메소드에 전달하는 것입니다.

이 방법은 로그인 상태를 저장하기 위해 정적 파일 itchat.pkl을 생성합니다.


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()


statusStorageDir을 설정하여 정적 파일을 다른 값으로 지정할 수 있습니다.

이 내장 옵션은 실제로 다음 두 가지 기능을 사용하는 이 프로그램과 동일합니다.


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 및 dump_login_status는 각각 설정 읽기 및 내보내기에 해당합니다.

전달된 fileDir의 값을 설정하여 가져오고 내보낸 파일을 설정할 수 있습니다.

**0x01-2 명령줄 QR 코드 표시**

다음 명령을 통해 로그인할 때 명령줄을 사용하여 QR 코드를 표시할 수 있습니다.


itchat.auto_login(enableCmdQR=True)


일부 시스템에서는 글꼴이 다를 수 있습니다. widths는 특정 배수에 활성화CmdQR을 할당하여 조정할 수 있습니다.


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


기본 콘솔 배경색은 어둡습니다(검은색). 배경색이 밝은(흰색) 경우, 활성화CmdQR에 음수 값을 할당할 수 있습니다. :


itchat.auto_login(enableCmdQR=-1)


**0x01-2 사용자 정의 로그인 프로세스**

로그인 프로세스를 제어해야 하는 경우 다음 내용을 읽을 수 있습니다.

동시에 itchat은 로그인에 필요한 각 단계도 제공합니다. 로그인 프로세스는 다음과 같습니다. QR 코드 uuid 받기 -> QR 코드 받기 -> 로그인 성공 여부 판단 -> 받기 초기화 데이터 - >WeChat 관련 정보 업데이트(주소록, 휴대폰 로그인 상태) -> 새로운 정보를 반복적으로 스캔합니다(하트비트 켜기)

QR 코드의 uuid를 가져옵니다

에 필요한 uuid를 가져옵니다. QR코드를 생성해서 돌려주세요.

메서드 이름: get_QRuuid
필수 값: 없음
반환 값: 성공 ->uuid, 실패 ->None

QR 코드 가져오기

uuid에 따라 QR 코드 가져오기 및 열기, 여부 반환 그것은 성공이다.

메소드명 : get_QR
필수값 : uuid
반환값 : Success ->True, Failure ->False

로그인 성공 여부를 판단

로그인 성공 여부를 판단하고 스캔 상태를 반환 코드.

메소드명 : check_login
필수값 : uuid
반환값 : 로그인 성공 ->'200', QR코드 스캔 ->'201', QR코드 유효하지 않음 ->'408', 획득하지 못함 정보바로가기- >'0'

초기화 데이터를 가져오기

WeChat 사용자 정보와 하트비트에 필요한 데이터를 가져옵니다.

메서드명: web_init
필수값: 없음
반환값: 로그인 위챗 사용자 정보를 저장할 사전

위챗 주소록 가져오기

위챗 친구 정보를 모두 가져와 업데이트하세요.

메서드명: get_contract
필수값: 없음
반환값: 저장된 친구정보 목록

WeChat 모바일 로그인 상태 업데이트

휴대전화에 로그인 상태를 표시합니다.

메서드 이름: show_mobile_login
필수 값: 없음
반환 값: 없음

새 정보에 대한 주기 스캔(하트비트 켜기)

새 메시지를 주기 스캔하고 하트비트 패키지를 켜세요.

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

EG:

一个登录例子:


import itchat, time, sys

def output_info(msg):
  print('[INFO] %s' % msg)

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

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

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


0x03 Register

注册消息方法

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

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

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

注册

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


import itchat
from itchat.content import *

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

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


消息类型

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

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

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

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


@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['Content'])

itchat.auto_login()
itchat.run()


注册消息的优先级

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

以下面的两个程序为例:


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['Text']

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'关闭' in msg['Text']:
          replyToGroupChat = False
          return 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 = True
          return u'重新开启成功'
    functionStatus = replyToGroupChat

thread.start_new_thread(itchat.run, ())

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


0x04 Reply

回复

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

send方法

方法:


send(msg='Text Message', toUserName=None)


所需值:

1.msg:消息内容

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

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

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


#coding=utf8
import itchat

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


send_msg方法

方法:


send_msg(msg='Text Message', toUserName=None)


所需值:

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

程序示例:


import itchat

itchat.auto_login()

itchat.send_msg('Hello world')


send_file方法

方法:


send_file(fileDir, toUserName=None)


所需值:

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


#coding=utf8

import itchat

itchat.auto_login()

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

itchat.send_file('xlsx.xlsx')


send_img方法

方法:


send_img(fileDir, toUserName=None)


所需值:

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


#coding=utf8
import itchat

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


send_video方法

方法:


send_video(fileDir, toUserName=None)


所需值:

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

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


#coding=utf8

import itchat

itchat.auto_login()

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

itchat.send_file('demo.mp4')


0x05 Memmber stuff

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

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

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

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

好友

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

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

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


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


公众号

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

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

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


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


群聊

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

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

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


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


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


memberList = itchat.update_chatroom('@abcdefg1234567')


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


memberList = itchat.get_friends()[1:]
# 创建群聊,topic键值为群聊名
chatroomUserName = itchat.create_chatroom(memberList, 'test chatroom')
# 删除群聊内的用户
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='Nulll.me')
    UserName = user[0]['UserName']
    itchat.send(msg=u'3', toUserName=UserName)
    itchat.dump_login_status()
    pickleDumps('flag', localDay) # 如果执行成功写入标致文件
    exit()


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

相关推荐:

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

위 내용은 Python WeChat 라이브러리: itchat 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.