이 글은 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!