基于itchat的自动调查机器人

最近需要做一个项目里的一个自动问答机器人的部分,需要对访谈对象做自动的访谈。需要按时进行提问,并且把采访到的数据以文本的形式进行记录。图片需要下载下来,语音也需要下载后进行识别,识别部分套用的讯飞的语音识别的接口。网上大多数的代码不能实现同时对多个用户进行提问回复,本项目建立了Client类,在问答的开始时需要输入需要调查的人数,以及昵称,便可以开始自动的问答。

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 27 10:26:17 2019@author:Leaf
"""
import threading
import urllibimport requestslfasr_host = 'http://raasr.xfyun.cn/api'# 请求的接口名
api_prepare = '/prepare'
api_upload = '/upload'
api_merge = '/merge'
api_get_progress = '/getProgress'
api_get_result = '/getResult'
# 文件分片大小10M
file_piece_sice = 10485760
# 转写类型
lfasr_type = 0
# 是否开启分词
has_participle = 'false'
has_seperate = 'true'
# 多候选词个数
max_alternatives = 0
# 子用户标识
suid = ''import base64
import hashlib
import hmac
import json
import os
import _thread
import itchat
import datetime
import time
from itchat.content import *
from threading import Timerclass Client:clientCount = 0def __init__(self, clientname, no, count, flag):self.clientname = clientnameself.no = noself.count = countself.flag = flagClient.clientCount += 1def displayClient(self):print("total is%d" % Client.clientCount)class SliceIdGenerator:"""slice id生成器"""def __init__(self):self.__ch = 'aaaaaaaaa`'def getNextSliceId(self):ch = self.__chj = len(ch) - 1while j >= 0:cj = ch[j]if cj != 'z':ch = ch[:j] + chr(ord(cj) + 1) + ch[j + 1:]breakelse:ch = ch[:j] + 'a' + ch[j + 1:]j = j - 1self.__ch = chreturn self.__chtext = " "class RequestApi(object):def __init__(self, appid, secret_key, upload_file_path):self.appid = appidself.secret_key = secret_keyself.upload_file_path = upload_file_path# 根据不同的apiname生成不同的参数,本示例中未使用全部参数您可在官网(https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.html)查看后选择适合业务场景的进行更换def gene_params(self, apiname, taskid=None, slice_id=None):appid = self.appidsecret_key = self.secret_keyupload_file_path = self.upload_file_pathts = str(int(time.time()))m2 = hashlib.md5()m2.update((appid + ts).encode('utf-8'))md5 = m2.hexdigest()md5 = bytes(md5, encoding='utf-8')# 以secret_key为key, 上面的md5为msg, 使用hashlib.sha1加密结果为signasigna = hmac.new(secret_key.encode('utf-8'), md5, hashlib.sha1).digest()signa = base64.b64encode(signa)signa = str(signa, 'utf-8')file_len = os.path.getsize(upload_file_path)file_name = os.path.basename(upload_file_path)param_dict = {}if apiname == api_prepare:# slice_num是指分片数量,如果您使用的音频都是较短音频也可以不分片,直接将slice_num指定为1即可slice_num = int(file_len / file_piece_sice) + (0 if (file_len % file_piece_sice == 0) else 1)param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['file_len'] = str(file_len)param_dict['file_name'] = file_nameparam_dict['slice_num'] = str(slice_num)elif apiname == api_upload:param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['task_id'] = taskidparam_dict['slice_id'] = slice_idelif apiname == api_merge:param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['task_id'] = taskidparam_dict['file_name'] = file_nameelif apiname == api_get_progress or apiname == api_get_result:param_dict['app_id'] = appidparam_dict['signa'] = signaparam_dict['ts'] = tsparam_dict['task_id'] = taskidreturn param_dict# 请求和结果解析,结果中各个字段的含义可参考:https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E8%BD%AC%E5%86%99.htmldef gene_request(self, apiname, data, files=None, headers=None):global textresponse = requests.post(lfasr_host + apiname, data=data, files=files, headers=headers)result = json.loads(response.text)if result["ok"] == 0:print("{} success:".format(apiname) + str(result))# write_txt(str(result['data']))text = str(result['data'])return resultelse:print("{} error:".format(apiname) + str(result))exit(0)return result# 预处理def prepare_request(self):return self.gene_request(apiname=api_prepare,data=self.gene_params(api_prepare))# 上传def upload_request(self, taskid, upload_file_path):file_object = open(upload_file_path, 'rb')try:index = 1sig = SliceIdGenerator()while True:content = file_object.read(file_piece_sice)if not content or len(content) == 0:breakfiles = {"filename": self.gene_params(api_upload).get("slice_id"),"content": content}response = self.gene_request(api_upload,data=self.gene_params(api_upload, taskid=taskid,slice_id=sig.getNextSliceId()),files=files)if response.get('ok') != 0:# 上传分片失败print('upload slice fail, response: ' + str(response))return Falseprint('upload slice ' + str(index) + ' success')index += 1finally:'file index:' + str(file_object.tell())file_object.close()return True# 合并def merge_request(self, taskid):return self.gene_request(api_merge, data=self.gene_params(api_merge, taskid=taskid))# 获取进度def get_progress_request(self, taskid):return self.gene_request(api_get_progress, data=self.gene_params(api_get_progress, taskid=taskid))# 获取结果def get_result_request(self, taskid):return self.gene_request(api_get_result, data=self.gene_params(api_get_result, taskid=taskid))def all_api_request(self):# 1. 预处理pre_result = self.prepare_request()taskid = pre_result["data"]# 2 . 分片上传self.upload_request(taskid=taskid, upload_file_path=self.upload_file_path)# 3 . 文件合并self.merge_request(taskid=taskid)# 4 . 获取任务进度while True:# 每隔20秒获取一次任务进度progress = self.get_progress_request(taskid)progress_dic = progressif progress_dic['err_no'] != 0 and progress_dic['err_no'] != 26605:print('task error: ' + progress_dic['failed'])returnelse:data = progress_dic['data']task_status = json.loads(data)if task_status['status'] == 9:print('task ' + taskid + ' finished')breakprint('The task ' + taskid + ' is in processing, task status: ' + str(data))# 每次获取进度间隔20Stime.sleep(20)# 5 . 获取结果self.get_result_request(taskid=taskid)question = ['默默是一个神奇的智能助手,当您在和小孩子相处中需要帮助时都可以告诉他,它将会主动询问您一些问题,请一次性回答完毕哦。当您准备好时,进行请发送“开始”。?','您好,我是默默,以后将是您的贴心小助手,请问最近一次您需要帮助时,孩子在做什么呢?还有其他参与者吗?(回答举例:孩子在起床穿衣服,我在旁边督促他)','孩子在做这件事上持续了大概多久','孩子是在哪里做这件事的呢?','请问身边有相关参与者么?(如果有,请列举,比如爸爸妈妈、老师、朋友等)','孩子用到了什么产品呢?有使用App吗?','孩子在做这件事时,情绪是怎么样呢?(比如不开心,不愿意起床,故意耍赖不穿衣服;很高兴,玩得特别开心等)','如果从消极到积极可以打-5到5分,您觉得孩子在做这件事时的状态可以打几分?','孩子说了什么特别的话,有什么特别的行为?(比如孩子说:妈妈,要是衣服会自动穿到我身上就好了,然后孩子就指着衣服说,“自动,穿衣”)','您希望孩子做这件事的目标是什么?','您希望孩子在做这件事的过程中,培养她/他的什么能力?','孩子在这件事中遇到了什么困难?','相关参与者在这个过程中,遇到了什么困难?','相关参与者在这个过程中的的心情是怎样的?(如果有多个参与者,请在一句话中分别描述每个人的心情,比如爸爸无奈,妈妈生气)','如果从消极到积极可以打-5到5分,参与者在这件事时的状态可以打几分?(请在一句话中,分别描述每个参与者,比如爸爸-1,妈妈-3))','您觉得孩子在刚才的活动中有可以用到语音助手的地方吗?(如果有,请描述,比如语音助手可以告诉孩子穿衣步骤,鼓励孩子,如果没有,请回答“无”)?','孩子在这件事之前在做什么呀?','孩子从做上一件事到现在这一件事的过程中,有遇到什么困难么?','上述困难解决了么,是怎么解决的?','孩子接下来要做什么事?','好滴,之后再见']ok = True
ok = 1
person = 0@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True,isGroupChat=True, isMpChat=True)
def handle_receive_msg(msg):global face_bugglobal flagglobal iglobal okglobal testmsg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  # 接受消息的时间msg_from = itchat.search_friends(userName=msg['FromUserName'])['RemarkName']  # 在好友列表中查询发送信息的好友昵称msg_time = msg['CreateTime']  # 信息发送的时间msg_id = msg['MsgId']  # 每条信息的idmsg_content = None  # 储存信息的内容msg_share_url = None  # 储存分享的链接,比如分享的文章和音乐if msg['Type'] == 'Text':  # 如果发送的消息是文本msg_content = msg['Text']print(msg_content)write_txt(" " + msg_content + " " + str(msg_time) + "\n", msg_from)# 如果发送的消息是附件、视屏、图片、语音。elif msg['Type'] == "Attachment" or msg['Type'] == "Video" \or msg['Type'] == 'Picture':msg_content = msg['FileName']  # 内容就是他们的文件名msg['Text'](str(msg_content))  # 下载文件msg.download(msg.fileName)write_txt(" " + str(msg_content) + " " + str(msg_time) + "\n", msg_from)elif msg['Type'] == "Recording":msg_content = msg['FileName']  # 内容就是他们的文件名msg['Text'](str(msg_content))  # 下载文件msg.download(msg.fileName)print(msg.fileName)api = RequestApi(appid="", secret_key=" ",upload_file_path=msg_content) #输入自己的科大讯飞的id和keyapi.all_api_request()write_txt(" " + str(msg_content) + " " + str(msg_time) + "\n", msg_from)write_txt(text + "\n", msg_from)for i in range(1, person + 1):if globals()['client_' + str(i)].flag:if msg_from == globals()['client_' + str(i)].clientname:# print("aaa")# send_message(question[3], msg_from)globals()['client_' + str(i)].count += 1if globals()['client_' + str(i)].count == len(question):globals()['client_' + str(i)].count = 1globals()['client_' + str(i)].flag = Falseelse:send_message(question[int(globals()['client_' + str(i)].count)], msg_from)write_txt(question[int(globals()['client_' + str(i)].count)], msg_from)# else:# print("else")"""if flag:# print(msg_from)if i >= len(question):flag = Falseok = 2elif msg_from == n:i = i + 1if i < len(question):send_message(question[i], msg_from)write_txt(question[i], n)else:i = 0print(ok)"""def write_txt(str, name):with open(name + ".txt", "a") as f:f.write(str)f.close()def public_research():for e in range(1, person + 1):send_message(question[0], globals()['client_' + str(e)].clientname)write_txt(question[0], globals()['client_' + str(e)].clientname)globals()['client_' + str(e)].count = 0globals()['client_' + str(i)].flag = True# print('hello timer')global timer  # 定义变量timer = threading.Timer(600, public_research)timer.start()def send_message(str, Name):users = itchat.search_friends(name=Name)  # 修改发送者名字# print(users)userName = users[0]['UserName']itchat.send(str, userName)"""
def timer():now = datetime.datetime.now()now_str = now.strftime('%Y/%m/%d %H:%M:%S')[11:]if (str(now_str) > str('21:00:00') and str(now_str) < str('21:55:10')):public_research()if __name__ == '__main__':itchat.auto_login(hotReload=True)print("请输入本次需要调研的人数")person = int(input())for i in range(1, person + 1):name = input("输入本次需要调研的微信名")locals()['client_' + str(i)] = Client(name, i, 0)#print(locals()['client_' + str(i)].clientname)send_message('嗨,感谢您参加我们的语音交互场景调研。首先请填写一个问卷。链接https://www.wjx.cn/jq/43360902.aspx', name)public_research(name)# print(client_1.clientname)# print(client_1.count)# time.sleep(10)test()itchat.run()
"""
itchat.auto_login(hotReload=True)
print("请输入本次需要调研的人数")
person = int(input())
for i in range(1, person + 1):name = input("输入本次需要调研的微信名")locals()['client_' + str(i)] = Client(name, i, 0, True)# print(locals()['client_' + str(i)].clientname)send_message('为了对您有初步的了解,请先填写这个问卷(填写完成请告诉我~):https://www.wjx.cn/jq/48642421.aspx', name)timer = threading.Timer(600, public_research)
timer.start()
itchat.run()

基于itchat的自动调查机器人相关推荐

  1. 物联网毕业设计 - 基于单片机的自动写字机器人

    ⭐️基于STM32+AB32VG1单片机的写字机运动控制系统⭐️ STM32F4单片机 AB32VG1单片机 RT-Thread物联网操作系统 SD卡文件读取与发送 速度前馈.折角优化.加速处理等算法 ...

  2. 2.转发。基于itchat的微信消息同步机器人

    原文:https://www.jianshu.com/p/7aeadca0c9bd# 看到了该网址有基于itchat的微信消息同步机器人,转过来继续研究.以下是转过来的: 最近 全栈数据工程师养成攻略 ...

  3. 自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车

    目的:一种廉价的跟随方案,让大家都能够参与进来,技术难度不大,一些人也能够DIY一些属于自己的"跟随"机器人!并不是要做工业应用什么的.只是做出来玩玩~ / 1 / 介绍 先看视频 ...

  4. 流水线自动分拣机器人仿真,vrep与matlab联合仿真,基于机器视觉技术进行自动分拣,采用scara型机械臂

    流水线自动分拣机器人仿真,vrep与matlab联合仿真,基于机器视觉技术进行自动分拣,采用scara型机械臂,按照不同的颜色与形状分拣,放入不同的盒子并统计数量. 仅供学习使用 基础太差的勿. ID ...

  5. 从零开始基于nonebot2搭建Q群机器人自动获取各大平台热搜

    从零开始基于nonebot2搭建Q群机器人自动获取各大平台热搜 目录 从零开始基于nonebot2搭建Q群机器人自动获取各大平台热搜 安装步骤 使用方法 退出方法 启用方法 参考链接 安装步骤 安装步 ...

  6. 基于android平台的语音机器人服务娱乐系统

    分 类 号:TP311 学校代码:11460 学 号:10130920 本科生毕业论文 基于android平台的语音机器人服务娱乐系统 Robot Entertainment Service Syst ...

  7. [531]微信之wxpy库(基于itchat库)

    微信机器人 / 可能是最优雅的微信个人号 API wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展 注意 强烈建议仅使用小号运行机器人! 从近期 (17年 ...

  8. 搭建属于自己的基于ChatGPT的微信聊天机器人(方法)

    文章目录 1. GitHub开源项目 2. 前期准备 (1) 获取openAI API key 3. 准备部署环境 (1) 配置代理 (2) 配置python环境 4. 部署 (1) 修改配置文件 ( ...

  9. itchat实现微信聊天机器人,定时发送微信消息,消息防撤回,消息监控,自定义回复消息

    一.前言 由于在抖音上刷到微信机器人自动陪聊,心血来潮,自己利用itchat和图灵机器人实现了微信自动回复,监听消息,消息防撤回等.周末心情不好搞了一个微信陪聊机器人陪我聊天. 注意: 1.图灵机器人 ...

最新文章

  1. 清华团队综述全面解读图神经网络理论方法与应用
  2. 使用NetBeans6开发OSGi应用(3)——整合Knopflerfish![88250原创]
  3. Linux基础优化之SElinux和iptables项
  4. 网站数据库服务器怎么启动,启动数据库服务器
  5. JavaWeb三大组件之Servlet
  6. 个税10% 人群_人群管理如何使我们的搜索质量提高27%
  7. python 压力测试小 demo
  8. php转化IP为整形
  9. 浅谈 js 数字格式类型
  10. python图像压缩主成分分析实例_python机器学习API介绍13: 数据降维及主成分分析...
  11. C++学习笔记 之 循环
  12. oracle中trim,ltrim,rtrim函数用法
  13. Vivado2018.3手把手详细下载
  14. RxBus的使用及解析
  15. 谈谈培训机构的“骗局“给新人一些建议
  16. Win10怎么开启超级管理员administrator帐户
  17. 电脑操作系统(Androidx86、Windows、Linux)说明
  18. 西安电大计算机文化基础中考,计算机文化基础试题3.pdf
  19. APIC Timer
  20. ur机器人计算机模拟仿真,UR机器人科研应用案例

热门文章

  1. 致远互联:以数智化指引破局之道
  2. 通过新浪天气api查询天气
  3. JavaScript+css实现的喜庆活动邀请函多页面html源码
  4. layer扩展打开/关闭动画
  5. 嵌入层(Embedding Layer)与词向量(Word Embedding)详解
  6. 学习国家颁布的三部信息安全领域法律,理解当前工作中的信息安全合规要求
  7. 一整套自助点餐软件,包含微信端,电视机,后台管理程序,个人开发,全套源码
  8. linux服务器IP伪造,Linux服务器间同网段IP伪装端口映射
  9. 点击化学(Click chemistry) 叠氮-PEG4-NHS/Biotin-PEG-N3/Azid/DBCO-EPG-NHS/DBCO-NH2
  10. 从0到1搭建大数据平台之数据计算