Urinx / WeixinBot

网页版微信API,包含终端版微信及微信机器人

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

todo

BillBillBillBill opened this issue · comments

不知道接下来要写哪些地方呢?建议把要改进的列个todo list,大家可以一起贡献代码

———— 20160614 ————
by sbilly: 用下管理权,close 封贴。以后发帖同学还请每个需求单独开贴。

commented

好嘞,我把我想到的加到readme上,大家还有什么想到的也可以加上去或是在这里提出来。

windows下有编码问题。。

commented

微信网页版天生不支持红包啊。。哎。。。。

能不能专门收集记录别人撤回的消息呢。。。这样把程序部署到服务器上,定期去收割别人撤回的内容233333

更:

嗯,其实把这些功能改成插件的形式更好了。。。

@kH0d0r 楼上回的。。多研究研究微信红包也可以收集提醒,撤回的消息只需要监控消息是否撤回然后重读记录就可以,另外插件形式是啥,不懂,一个py搞定的还插件,麻烦。

class UnicodeStreamFilter:

    def __init__(self, target):
        self.target = target
        self.encoding = 'utf-8'
        self.errors = 'replace'
        self.encode_to = self.target.encoding

    def write(self, s):
        if type(s) == str:
            s = s.decode('utf-8')
        s = s.encode(self.encode_to, self.errors).decode(self.encode_to)
        self.target.write(s)

if sys.stdout.encoding == 'cp936':
    sys.stdout = UnicodeStreamFilter(sys.stdout)

这段代码可以解决win的编码问题。

另外win下CMD不能打印出二维码,可以用os.startfile打开

自己撤回的消息和自己发的语音都会记录,加个检查吧。。

表情消息是区别对待的?

有的是图片,有的就显示

[Received a sticker. View on phone]

这个是要在Python3中运行么。。
可以加个定时发信息的功能。我媳妇单位就要求每天几点定时发每日金句之类的功能。。看到这个仿佛看到了曙光。。我之前从别的地方看到过 微信找删好友的代码。原来源自你这。加过发信息功能。总返回错误码1。很奇怪。

commented

@Toto233 2.7下运行。呃,不是源自我 😰 ,我这个是在 微信找出删除好友 之后写的,之前我也看了那个。

这几天测试这些功能导致微信一直把我建讨论组的功能屏蔽。。

text = raw_input('输入指令:').decode(sys.stdin.encoding).encode('utf-8')
这段我电脑上这么写才能够正确 解析输入的中文。

添加一个requirements文件吧,方便安装依赖

还是各自写 issue 吧。都放在这里,做了或者没做都不好处理。

有没有可能添加发送语言或视频给朋友或群啊?从api看好像根本不支持?有什么办法搞定吗?

@yong9900 你有什么最新的办法搞定吗?我也在想怎么解决。。。。

做个web端控制的更方便,websocket开销很小正合适

@yong9900 发文件可以发语音视频?

@hongtu 有人做userscript有人做chrome扩展了

@reverland 方便来个地址吗,谢谢

@hongtu 我得问问他再回复

@hongtu 我这儿倒是有两个web端的项目可以看看。

https://github.com/stonexer/wechatBot 网页版微信机器人
https://github.com/spacelan/weixin-bot-chrome-extension Chrome插件版

@stonexer 膜orz,好厉害

自动添加好友

为什么grouplist没有被保存下来呢 似乎每一次只有在收到群消息的时候才查询一次 直接打印grouplist的每个元素都为空 但是在getGroupId里就可以

@fanly @reverland 想做到向在手机端一样发语言和视频。但查遍了web api,好像根本就不知持。
附件可以,但不直观,没有想视频一样的preview。

@ebhrz1 在 init 过程中只有加到通讯录的联系人和微信群才会被读取,遇到了没有在通讯录中的微信群,只能重新查。

有人知道 调用 webwxinit 这个 接口 时,总是 提示"BaseResponse": {
"Ret": 1101,
"ErrMsg": "" 获取不到 数据,,请问 是 什么原因呢??

我是python新手,历经千辛万苦终于在linux系统上成功运行weixin.py,我觉得要是有一个指引的doc就更好了。然后就是各平台的兼容性,win10上面无论如何使用python2.7.11都无法正确运行weixin.py。谢谢大神耐心指导。

@sbilly 但是我在getGroupName之后再查看仍然没有。python没有var_dump有点不习惯233333

@bigboy44 你倒是把错误信息贴出来啊。很可能是缺了什么库

希望建议:邀请别人加入群。

@ebhrz1 并没有缺少什么库。
error
ku

commented

一直运行不成功,是什么问题 麻烦大神帮解下 装了一个ubuntu上也运行不了 这是windows上的错误

d:>python weixin.py
[] 微信网页版 ... 开动
2016-03-23 18:28:00 DESKTOP-OTSEM80 root[9164] DEBUG [
] 寰俊缃戦〉鐗?... 寮€鍔?[0m
[] 正在获取 uuid ... 成功
2016-03-23 18:28:22 DESKTOP-OTSEM80 root[9164] DEBUG [
] 姝e湪鑾峰彇 uuid ... ... 鎴愬姛
[] 正在获取二维码 ... 成功
2016-03-23 18:28:22 DESKTOP-OTSEM80 root[9164] DEBUG [
] 寰俊缃戦〉鐗?... 寮€鍔?[0m
2016-03-23 18:28:22 DESKTOP-OTSEM80 root[9164] DEBUG Saved file: d:\saved\qrcodes\qrcode.jpg
[] 请使用微信扫描二维码以登录 ...
2016-03-23 18:28:27 DESKTOP-OTSEM80 root[9164] DEBUG https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=1&uuid=oYUma7Mqvw==&
=1458728905
2016-03-23 18:28:28 DESKTOP-OTSEM80 root[9164] DEBUG https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=0&uuid=oYUma7Mqvw==&=1458728907
[
] 正在登录 ... 2016-03-23 18:28:28 DESKTOP-OTSEM80 root[9164] DEBUG https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AdYjaOoMYlEUGEu_l6Gh5vb_@qrticket_0&uuid=oYUma7Mqvw==&lang=zh_CN&scan=1458728906&fun=new
成功
2016-03-23 18:28:28 DESKTOP-OTSEM80 root[9164] DEBUG [] 姝e湪鐧诲綍 ... ... 鎴愬姛
[
] 微信初始化 ... 成功
2016-03-23 18:28:29 DESKTOP-OTSEM80 root[9164] DEBUG [] 寰俊鍒濆鍖?... ... 鎴愬姛
[
] 开启状态通知 ... 成功
2016-03-23 18:28:30 DESKTOP-OTSEM80 root[9164] DEBUG [] 寮€鍚姸鎬侀€氱煡 ... ... 鎴愬姛
[
] 获取联系人 ... https://wx.qq.com/cgi-bin/mmwebwx-bin
成功
2016-03-23 18:28:35 DESKTOP-OTSEM80 root[9164] DEBUG [] 鑾峰彇鑱旂郴浜?... ... 鎴愬姛
[
] 应有 1115 个联系人,读取到联系人 1115 个
[] 共有 11 个群 | 593 个直接联系人 | 1 个特殊账号 | 509 公众号或服务号
[
] 获取群 ... 成功
2016-03-23 18:28:41 DESKTOP-OTSEM80 root[9164] DEBUG [] 鑾峰彇缇?... ... 鎴愬姛
2016-03-23 18:28:41 DESKTOP-OTSEM80 root[9164] DEBUG [
] 寰俊缃戦〉鐗?... 寮€鍔?[0m
2016-03-23 18:28:41 DESKTOP-OTSEM80 root[9164] DEBUG =========================
[#] Web Weixin
[#] Debug Mode: False
[#] Uuid: oYUma7Mqvw==
[#] Uin: 391924395
[#] Sid: jegR64c0LB7s8S6p
[#] Skey: @crypt_9ce4ce2c_0331b08e6dd9a763f018a23f5dbdb9ef
[#] DeviceId: e471538950487586

[#] PassTicket: XL2wtByoWa9fDL5zctl8t2Lx20gMnG%2B3pb%2BwkNDX96Xv6XZYY37W9gp2Dn9RxHAf

[] 自动回复模式 ... 关闭
2016-03-23 18:28:41 DESKTOP-OTSEM80 root[9164] DEBUG [
] 鑷姩鍥炲妯″紡 ... 鍏抽棴
Traceback (most recent call last):
File "weixin.py", line 946, in
Traceback (most recent call last):
File "", line 1, in
webwx.start()
File "D:\Python27\lib\multiprocessing\forking.py", line 381, in main
File "weixin.py", line 25, in wrapper
self = load(from_parent)
File "D:\Python27\lib\pickle.py", line 1384, in load
return fn(*args)
File "weixin.py", line 809, in start
return Unpickler(file).load()
File "D:\Python27\lib\pickle.py", line 864, in load
listenProcess.start()
File "D:\Python27\lib\multiprocessing\process.py", line 130, in start
dispatchkey
File "D:\Python27\lib\pickle.py", line 886, in load_eof
self._popen = Popen(self)
File "D:\Python27\lib\multiprocessing\forking.py", line 277, in init
raise EOFError
EOFError
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "D:\Python27\lib\multiprocessing\forking.py", line 199, in dump
ForkingPickler(file, protocol).dump(obj)
File "D:\Python27\lib\pickle.py", line 224, in dump
self.save(obj)
File "D:\Python27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "D:\Python27\lib\pickle.py", line 425, in save_reduce
save(state)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\Python27\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\multiprocessing\forking.py", line 67, in dispatcher
self.save_reduce(obj=obj, *rv)
File "D:\Python27\lib\pickle.py", line 401, in save_reduce
save(args)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\pickle.py", line 554, in save_tuple
save(element)
File "D:\Python27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "D:\Python27\lib\pickle.py", line 425, in save_reduce
save(state)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\Python27\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\pickle.py", line 731, in save_inst
save(stuff)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\Python27\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "D:\Python27\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "D:\Python27\lib\pickle.py", line 425, in save_reduce
save(state)
File "D:\Python27\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "D:\Python27\lib\pickle.py", line 655, in save_dict
self._batch_setitems(obj.iteritems())
File "D:\Python27\lib\pickle.py", line 687, in _batch_setitems
save(v)
File "D:\Python27\lib\pickle.py", line 306, in save
rv = reduce(self.proto)
TypeError: can't pickle thread.lock objects

-----------------------------------------------------------不缺什么库
d:>python -m pip list
beautifulsoup4 (4.4.1)
colorama (0.3.7)
coloredlogs (5.0)
humanfriendly (1.44.5)
logging (0.4.9.6)
lxml (3.5.0)
mysql-python (1.2.5)
pip (8.1.1)
py2exe (0.6.9)
qrcode (5.2.2)
requests (2.9.1)
requests-toolbelt (0.6.0)
setuptools (18.2)
six (1.10.0)
wheel (0.29.0)

怎么可以找出@自己的消息

问个跟协议无关的问题
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage 这个地址不加fun=new的时候会301
有什么方法能在官方网页下让他强制走fun=new呢
--- 更新
已经跳过这个步骤了。。在electron下抓包,可以从init接口以及cookie里获取到sid uin skey。不需要走这个接口了。

commented

Not work now for weixin haven't support this API。现在支持视频发送了吗?先把视频保存本地,然后本地发送出去?

群发不知道如何掌握频率,老是返回1205或者-1,谁知道如何处理?

找到了发送微信表情的方法,补充代码在这里,管理员请关注下,建议可以升级下weixin.py

使用方法:替换weixin.py文件运行,表情发送命令
e->[昵称或ID]:[文件路径]
文件可以是jpg或gif
weixin.py.zip

管理员有空整理下文档吧,求加入刚才提到的对emotion的支持。

commented

@monkeybad 好的,我会加上的 👍

commented

@Urinx 监听进程异常:urlopen error [Errno 104] Connection reset by peer???

windows 下:multiprocessing的问题pickle.PicklingError: Can't pickle <type 'thread.lock'>: it's not found as thread.lock , mac 下面测试没问题

能把思路分享下么

发送分享链接

commented

可以封装一下 暴露接口方法出来写业务代码,要不在做业务代码的时候,只能重写方法.

commented

你好,我想对这个项目做py3适配,适配的过程中运行到进行同步线路测试 ... ', self.testsynccheck这里每次都出错,想请教一下哪里的问题。 #修改的地方

下面是运行的错误:
[_] 进行同步线路测试 ... _get data=window.synccheck={retcode:"1100",selector:"0"}
synccheck data=window.synccheck={retcode:"1100",selector:"0"}
<class 'str'>
_get data=window.synccheck={retcode:"1100",selector:"0"}
synccheck data=window.synccheck={retcode:"1100",selector:"0"}
<class 'str'>
_get data=window.synccheck={retcode:"1100",selector:"0"}
synccheck data=window.synccheck={retcode:"1100",selector:"0"}
<class 'str'>
_get data=window.synccheck={retcode:"1100",selector:"0"}
synccheck data=window.synccheck={retcode:"1100",selector:"0"}
<class 'str'>
_get data=window.synccheck={retcode:"1100",selector:"0"}
synccheck data=window.synccheck={retcode:"1100",selector:"0"}
<class 'str'>
Process Process-1:
Traceback (most recent call last):
File "H:\win10\Python35\lib\multiprocessing\process.py", line 254, in _bootstrap
self.run()
File "H:\win10\Python35\lib\multiprocessing\process.py", line 93, in run
self._target(_self._args, *_self._kwargs)
File "E:\OneDrive\python\WeixinBot_py3\weixin.py", line 814, in listenMsgMode
self.run('[] 进行同步线路测试 ... ', self.testsynccheck)
File "E:\OneDrive\python\WeixinBot_py3\weixin.py", line 995, in _run
if func(_args):
File "E:\OneDrive\python\WeixinBot_py3\weixin.py", line 347, in testsynccheck
[retcode, selector] = self.synccheck()
File "E:\OneDrive\python\WeixinBot_py3\weixin.py", line 368, in synccheck
data = self._get(url)
File "E:\OneDrive\python\WeixinBot_py3\weixin.py", line 1038, in _get
response = urllib2.urlopen(request)
File "H:\win10\Python35\lib\urllib\request.py", line 162, in urlopen
return opener.open(url, data, timeout)
File "H:\win10\Python35\lib\urllib\request.py", line 465, in open
response = self._open(req, data)
File "H:\win10\Python35\lib\urllib\request.py", line 483, in _open
'_open', req)
File "H:\win10\Python35\lib\urllib\request.py", line 443, in _call_chain
result = func(_args)
File "H:\win10\Python35\lib\urllib\request.py", line 1283, in https_open
context=self._context, check_hostname=self._check_hostname)
File "H:\win10\Python35\lib\urllib\request.py", line 1240, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "H:\win10\Python35\lib\http\client.py", line 1083, in request
self._send_request(method, url, body, headers)
File "H:\win10\Python35\lib\http\client.py", line 1128, in _send_request
self.endheaders(body)
File "H:\win10\Python35\lib\http\client.py", line 1079, in endheaders
self._send_output(message_body)
File "H:\win10\Python35\lib\http\client.py", line 911, in _send_output
self.send(msg)
File "H:\win10\Python35\lib\http\client.py", line 854, in send
self.connect()
File "H:\win10\Python35\lib\http\client.py", line 1237, in connect
server_hostname=server_hostname)
File "H:\win10\Python35\lib\ssl.py", line 376, in wrap_socket
_context=self)
File "H:\win10\Python35\lib\ssl.py", line 747, in init
self.do_handshake()
File "H:\win10\Python35\lib\ssl.py", line 983, in do_handshake
self._sslobj.do_handshake()
File "H:\win10\Python35\lib\ssl.py", line 633, in do_handshake
match_hostname(self.getpeercert(), self.server_hostname)
File "H:\win10\Python35\lib\ssl.py", line 296, in match_hostname
% (hostname, ', '.join(map(repr, dnsnames))))
ssl.CertificateError: hostname 'webpush1.wechatapp.com' doesn't match either of 'webpush1.wechat.com', 'webpush.wechat.com', 'login.web.wechat.com', 'webpush.web.wechat.com', 'webpush2.wechat.com', 'webpush.web2.wechat.com', 'file.web2.wechat.com', 'web1.wechat.com', 'file.web.wechat.com', 'loginpoll.wechat.com', 'web2.wechat.com', 'login.wechat.com', 'login.web2.wechat.com', 'res.wechat.com', 'web.wechat.com'

@jimmy0017
邀请入群功能我做了一个,基本上是根据这个做的,会遇到的坑就是,加完人之后,那个群组虽然存在,但是并不会显示出来。必须要在那个群里说句话才能显示。

https://github.com/Toto233/pythonStuff/blob/master/wechatAddGroup.py

请问现在能不能做到机器人发送图片或者语音?看了好多开源项目都没有实现这一块。

@sunfanteng 可以做到,因为web微信可以上传文件。
但是web微信对图像文件的解析比较奇怪,有时候会莫名把图片处理成表情

不能发送语音吗吗吗?我们这源码

目前网页版不支持发送语音,针对语音发送这块,目前是如何考虑的。如果直接发送mp3 文件则自动在对方的消息中显示资源了

实现一个收集撤回消息的功能。大家有什么实现思路

好像读取 群消息的时候 有问题。

Process Process-1:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(_self._args, *_self._kwargs)
File "weixin.py", line 792, in listenMsgMode
[retcode, selector] = self.synccheck()
File "weixin.py", line 343, in synccheck
data = self._get(url)
File "weixin.py", line 1005, in _get
response = urllib2.urlopen(request)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [Errno 54] Connection reset by peer>

这里都几楼了,太长了…

用下管理权,close 封贴。以后发帖同学还请每个需求单独开贴。

做得非常牛X!!!

@sbilly 可以参考systemd的issue模板 https://github.com/systemd/systemd/issues/new

python 怎么写微信分享文章给朋友的接口?

请问,有什么办法可以实现向群里发小视频吗?

冰天雪地翻滚求加入 分享文章和发送名片 功能

可以实现在群里加人吗

有人进群的消息是怎么获取的?

commented

你好 请问怎么获取好友微信号 不止昵称~thx

commented

每次机器人重新扫码登录 联系人以及群的id都会换掉之前的 ,有什么办法获取到群不变的唯一id

请问有人在研究逆向工程,模拟手机App中的用户名密码登陆?二维码扫描毕竟还是需要依赖移动端…
请问有人探究可行性么?

为什么一用自动回复功能就出错,而且不再启用以后也不行??自动回复怎么样才能用??
2016-10-09 9 39 18

commented

能不能想办法支持发送分享消息啊?

@zhangtianjack 是域名问题

https://github.com/lbbniu/WebWechat PHP版本的实现需要pcntl或者pthreads扩展实现多线程或者多进程,欢迎start

能不能支持加好友的功能

commented

关于微信红包的功能,我在官方的itchat接口看到红包是一般链接,但是尝试了下发现是系统信息,如果是链接形式的话应该可以用urllib的打开函数打开了吧?另外就是撤回信息问题,如果我想显示刚撤回的信息,直接用msg['Text']好像只会显示xxx刚撤回一条信息的提醒,而没有显示撤回的信息,请问如何显示撤回了的信息呢

请问这个是什么原因啊?要怎么解决?
[] 微信网页版 ... 开动
[
] 正在获取 uuid ... 成功
[] 正在获取二维码 ... 成功
[
] 请使用微信扫描二维码以登录 ...
[] 正在登录 ... 成功
[
] 微信初始化 ... 成功
[] 开启状态通知 ... 成功
[
] 获取联系人 ... 成功
[] 应有 43 个联系人,读取到联系人 43 个
[
] 共有 1 个群 | 23 个直接联系人 | 1 个特殊账号 | 17 公众号或服务号
[] 获取群 ... 成功
[
] 自动回复模式 ... 关闭
[] 进入消息监听模式 ... 成功
[
] 进行同步线路测试 ... ERROR:root:URLError = [Errno 11004] getaddrinfo failed
失败
[*] 退出程序

现在有没有办法将自己发出或用户发送来的文件保存到本地?

我在win10下运行weixin.py会卡在微信初始化...不动,求问原因

作者你好,我是安卓程序员,现在要做一个群发消息到微信的功能,但是我没学过python,请问能给我提供点思路吗

commented

QQ群: 609776708

可以用微信号加密码登录哦~

大神,如何把这个嵌套在Django中去呀,求大神指教

能收到公众号发送的文章的消息吗

你好,请问自动加好友怎么实现呢?

语法错误??1068 def _get(self, url: object, api: object = None) -> object:

希望能加踢人的api

commented

有没有考虑建一个微信群或者 QQ 群交流?
个人维护三百多人的 Emacs 微信群等秩序井然,
有群规 没有广告
没时间的话我可以来多管理协调.

能否获取朋友圈的数据啊.特别需要这方面的


请问上面是由于什么原因造成的?