Urinx / WeixinBot

网页版微信API,包含终端版微信及微信机器人
Apache License 2.0
7.23k stars 1.98k forks source link

关于发送视频会失败的一个解决方法 #202

Open fangfsz opened 7 years ago

fangfsz commented 7 years ago

监控Web微信数据发送,发现: 当发现消息是一个视频文件时,Both会提示类型可能为XXX。也就是说未能成功检测到消息类型,那就也谈不上保存了。不知道是不是作者当时的情况是这样所导致如此。

现根据所测数据,给出一个解决方法。 注意:

粗体是改动部分,请仔细比对和注意缩进。

  1. 原文第1110行附近。 补充几个协议头,对于Web请求来说,通常我们发送的视频是mp4格式,也够了。所以这里加上好些。 def _get(self, url: object, api: object = None, timeout: object = None) -> object: request = urllib.request.Request(url=url) request.add_header('Referer', 'https://wx.qq.com/') if api == 'webwxgetvoice': request.add_header('Range', 'bytes=0-') if api == 'webwxgetvideo': request.add_header('Range', 'bytes=0-') request.add_header('Accept', 'video/webm,video/ogg,video/;q=0.9,application/ogg;q=0.7,audio/;q=0.6,/;q=0.5') if api == 'webwxgetmsgimg': request.add_header('Accept', 'image/png,image/;q=0.8,/*;q=0.5') try: response = urllib.request.urlopen(request, timeout=timeout) if timeout else urllib.request.urlopen(request) if api == 'webwxgetvoice' or api == 'webwxgetvideo' or api =='webwxgetmsgimg' : data = response.read() else: data = response.read().decode('utf-8') logging.debug(url) return data except urllib.error.HTTPError as e: logging.error('HTTPError = ' + str(e.code)) except urllib.error.URLError as e: logging.error('URLError = ' + str(e.reason)) except http.client.HTTPException as e: logging.error('HTTPException') except timeout_error as e: pass except ssl.CertificateError as e: pass except Exception: import traceback logging.error('generic exception: ' + traceback.format_exc()) return ''
  2. 修改消息类型,原文第860行附近。 修改视频消息类型为 43. 这是目前Web抓包分析所得。 elif msgType == 43: video = self.webwxgetvideo(msgid) raw_msg = {'raw_msg': msg, 'message': '%s 发了一段小视频: %s' % (name, video)} self._showMsg(raw_msg) self._safe_open(video)