파이썬 (사용자 인터페이스)와 마이크로 채널 그룹 채팅 로봇을 만들

머리말

내가 따에 마이크로 채널 그룹 채팅 로봇의 유연한 구성을 할 수 있다면 내 작은 친구 중 하나가 물었다 요즘, 전 이해 itchat라이브러리의 사용을, 나는 쉽게 동의, 그리고 마지막으로 프로토 타입을 만들어 밤을 보냈다.

다음과 같이 프로그램을 실행하는 컴퓨터 :

그림 삽입 설명 여기

전화에 대한 정보는 다음과 같이 :

그림 삽입 설명 여기

사실에 근거하여 itchat이미 썩은 거리 마이크로 채널 로봇 있지만, 대부분은 비교적 말하기도 간단,이 프로그램은 다음과 같은 몇 가지 독특한 특징을 가지고 있습니다 :

1, 열기 / 닫기 자동 응답 지정된 그룹 채팅에 대한 지원은 단순히 열 메모장을 사용하여 group.csv패자 때마다 그룹 채팅 이름이 자동으로 열 그룹 채팅 이름에 대한 응답을 작성하려면, 파일을, 당신은 포장해야합니다.

2, 사용자 정의 설정 키워드 응답에 대한 지원, 그냥 열려면 메모장을 사용하여 keyword.csv키워드에 따라 파일을 {***, ***} 코드의 변경을하지 않고도 형식을 추가 할 수 있습니다 회신 할 수 있습니다. 패자 입력 쉼표가 키 - 값 쌍도 필요 랩, 참고.

3, 벌크 메시지를 지원하고, 시간의 타이밍은, 메시지는 프로그램의 실행시에 동적으로 변경 될 수있다.

도 4는, 바람직가 GUI, 인터페이스, 상기 마이크로 채널의 간단한 디자인 기준 색.

DIY 플레이

1, 기업을위한

유지 보수 그룹이 같은 요구를 할 수 있습니다 상인으로서, 시간이 메시지를 보낼 수 있습니다. 예를 들어 回复 xxx 可获得 yyy는에있는 동안 keyword.csv미리 작성된 문서입니다. 또한 동시에 여러 그룹을 처리 할 수 있습니다, 이러한 방법으로, 당신은 그들이 필요한 그룹 구성원을 만들 수 있습니다, 당신은 입력 할 필요가 없습니다, 복사 및 붙여 넣기, 마음의 평화도 효율적이다.

2, 일반 개인을위한

타이밍, 남성과 여성의 친구 좋은 밤 메시지에 축복을 보내 부모.

3, 알리 배포 서버로 이동

자동으로 그룹하여 전송 메시지되었습니다 버그를 가지고 싶다면, 컴퓨터가 열려 있어야합니다,하지만 클라우드 서버에 배포가이 문제를 해결할 수 있습니다. 우선 구매 포털을 제공하면서 배포 과정은 내 이전 기사, 알리 클라우드 서버를 참조 할 수 있습니다.

코드의 상세 설계

1, 코드 아키텍처

도입 이후 GUI, GUI코드 블록 및 대량 메시지에 대한 책임을 코드 블록,이를 위해 절차는있는 멀티 스레딩 메커니즘을 도입해야 폐쇄성 있습니다 GUI인터페이스는, 스레드가 메인 쓰레드가 자식 스레드에서 대량 메시지에 대한 책임 코드 블록을 실행입니다 나는 사이의 통신을 사용하는 wxPython내장 wx.lib.pubsub모듈의 채택에 해당하는 작업을 수행 할 수있는 아이 thread 한 번 wx.CallAfter(pub.sendMessage)통보 메시지를 보내도록 인터페이스를 GUI보장하기 때문에 같은 스레드를 GUICaton 간주하지 않습니다 적시 새로 고침.

그림 삽입 설명 여기

2 코드 플로우

첫째, 그룹이 자동 개방 회신을 채팅을 결정 회신 키워드 정보 적절한 구성 파일을로드합니다. 프로그램을 실행하는 동안,이 정보를 동적으로 변경할 수없는 이유 때문이다.

상기 로딩 keyword코드를 다음과 같이 구성되어있다 :

def load_keyword(self):
	global keywords
	with open('keyword.csv', 'r', encoding='utf-8', newline='') as f:
		reader = csv.reader(f)
		for i, line in enumerate(reader):
			if i == 0:
				continue
			keywords[line[0]] = line[1]

keywords을 피 호출 매개 변수 전달에 쉽게 검색을 위해 글로벌 변수의 설정, 결정 i == 0제거 csv파일 헤더 정보의 첫 번째 줄을.

더 명확 책임, 코드 주석 다음 코드 블록의 주요 대부분은 반복되지 않을 것이다

@itchat.msg_register(TEXT, isGroupChat=True)
def group_text(msg):
	global keywords
	groups = itchat.get_chatrooms(update=True)
	for group in groups:
		# 群的 NickName 是群名称,UserName 是群id(以两个@开始)
		# Python/Java 学习交流群
		if group['NickName'] in group_names:  # 从群中找到指定的群聊
			group_id = msg['FromUserName']
			# 防止其他群消息的的干扰
			if not group_id == group['UserName']:
				break
			# 准备回复的消息
			keys = keywords.keys()
			key = ''
			for i in keys:
				if i in msg['Text']:
					key = i
					break
			if key == '':
				return
			message = keywords.get(key)
			# 在消息中找到 发送人的id
			sender_id = msg['ActualUserName']
			# 有时 group['MemberList'] 为空,改变思路由群 id 获取群聊成员
			# group_info = itchat.update_chatroom(msg['ToUserName'], detailedMember=True)
			# if len(group_info) == 0:
			# toUserName 是自己在群聊发消息时,群 id 在消息里的 key
			# FromUserName 是别人在群里发时,群 id 在消息里的 key
			group_info = itchat.update_chatroom(group_id, detailedMember=True)
			memberlist = group_info['MemberList']
			for member in memberlist:
				# 找到消息的发送者
				if member['UserName'] == sender_id:
					# 如果有备注名,群聊显示的是备注名
					to_user = member['RemarkName']
					if len(to_user) == 0:
						# 否则显示成员自己修改的在群里的昵称
						to_user = member['DisplayName']
					if len(to_user) == 0:
						# 否则显示他微信号的昵称
						to_user = member['NickName']
					itchat.send_msg('@{}\n{}'.format(to_user, message), group['UserName'])
					wx.CallAfter(pub.sendMessage, "update", msg="回复群聊[{}]成员[{}]成功:[{}]".format(group['NickName'],to_user,message))

자식 스레드가 시작하면서 타이밍과 독립적 위의 코드를 코드에 대한 책임 질량은 대량의 실행 논리의 타이밍을 시작

def run(self):
    global t
    t = threading.Timer(minutes * 60, self.auto_timer)
    t.start()
    self.load_keyword()
    self.load_group()
    itchat.auto_login(hotReload=True)
    itchat.run()

주요 기능 중 하나는 threading.Timer(minutes * 60, self.auto_timer)그 의미 스레드의 대부분의 구현을 실시하고, 스레드 간격을 실을 열고 무엇을, minutes * 60초 콜백 함수를 실행 한 후 self.auto_timer, 그러나, 솔루션에이 유일한 방법은 폴링 없었다, 한 번 트리거 될 수 있습니다 콜백 함수 내에서 이동이 수행하는 threading.Timer(minutes * 60, self.auto_timer),이 재귀 호출에 조금 유사하고, 재귀 호출 다른 어떤 종료 조건은 없지만, 타이머의 시간이 와서 트리거 콜백 함수 때문에 메모리 오버 플로우를 생성하지 않습니다 프로그램의 기간은, 활성 스레드 단지 한 자리의 수를 실행되도록 생활 스레드는 여기서 끝 :

def auto_timer(self):
    global auto_message
    groups = itchat.get_chatrooms(update=True)
    for group in groups:
        if group['NickName'] in group_names:
            itchat.send_msg('{}'.format(auto_message), group['UserName'])
            wx.CallAfter(pub.sendMessage, "update",
                         msg="群聊[{}]定时消息:[{}]发送成功".format(group['NickName'], auto_message))

    global t  # 把 t 设置为全局变量
    t = threading.Timer(minutes * 60, self.auto_timer)
    t.start()

GUI 때문에 코드의 공간 제약 부분에 돌출하지 않습니다.

경험하는 방법

공공 우려 번호 개월 긴 작은 물 배경 응답 마이크로 채널 그룹 로봇 을 얻을 수있다

게시 84 개 원래 기사 · 원 찬양 (250) ·은 15 만 + 조회수

추천

출처blog.csdn.net/ygdxt/article/details/89134003