GithubHelp home page GithubHelp logo

dongweiming / wechat-admin Goto Github PK

View Code? Open in Web Editor NEW
1.7K 106.0 421.0 11.75 MB

Wechat Management System

Home Page: https://dongweiming.github.io/wechat-admin/

License: GNU General Public License v3.0

Python 35.04% JavaScript 20.68% HTML 0.41% Vue 43.85% CSS 0.03%
wechat vue wxpy itchat wechat-admin flask celery sse walrus mkdocs

wechat-admin's Introduction

wechat-admin

微信管理系统

pyversions vueversions es2015 celery element ui travis ver License: GPL v3 contributions welcome

Preview

效果图

Web效果

欢迎扫码体验:

扫码加群

特性

  • 支持显示好友列表,可过滤
  • 支持显示群聊列表,可过滤
  • 可以同时给多个用户/群聊成员发送消息,支持发送文件,emoji表情。可预览
  • 如果为群聊创建者,可以删除(多个)成员
  • 可以选择好友/群聊成员创建新群
  • 对自动建群、加群关键词、邀请文本等可配置
  • 永久保存消息,可以通过消息列表页面查看和过滤。接收消息进程停止自动重启
  • 支持消息提醒
  • 支持发送加群聊成员好友请求
  • 自动添加联系人,拉对方入群,群满之后自动创建新群
  • 支持插件系统,内置图灵机器人、ChatterBot、Simsimi等插件
  • 可以指定公众号,当公众号发布文章后自动转发到指定的群聊里
  • 群成员可发起投票踢人,可以灵活的设置投票规则

...

使用的技术和库

前端

  • Vue
  • Axios
  • Element-ui
  • Vue-cli

后端

  • Flask
  • Celery
  • SSE
  • Walrus
  • Gunicorn
  • Flask-Migrate
  • Flask-SQLAlchemy
  • ItChat
  • Wxpy
  • PyMySQL

使用方法

通用方案

安装MySQL、Redis,然后创建库(默认是test):

❯ mysql -u root -p
mysql> drop database test;
Query OK, 9 rows affected (0.32 sec)

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> ^DBye

下载源码并安装依赖:

❯ git clone https://github.com/dongweiming/wechat-admin
❯ cd wechat-admin
❯ virtualenv venv  # 只支持Python 3source venv/bin/activate  # 推荐使用autoenv
❯ venv/bin/pip install -r requirements.txt  # 如果已经激活虚拟环境,`venv/bin/`这样的前缀可不加,下同

设置说明:自定义配置应该存放在local_settings.py(需创建)中,可重载config.py中的设置

安装插件(可选):

❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
# 如果有额外插件配置,需要修改PLUGIN_PATHS和PLUGINS

插件开发请移步:Plugins Page

初始化数据库:

export FLASK_APP=manager.pyvenv/bin/flask initdb

启动服务:

❯ venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0

PS: 如果是本地运行,可以不使用gunicorn,直接使用Flask的多线程调试模式:

❯ python app.py

访问 WEB页面 http://localhost:8100 使用微信扫码登录

登录成功后,启动Celery Beat和Worker:

❯ venv/bin/celery -A wechat worker -l info -B

注意:第一次会拉取全部的联系人和各群聊成员列表,需要一点时间。观察终端输出了解初始化任务的完成情况。

使用Docker

假设已经安装了Docker,执行如下命令即可。

❯ pip install docker-compose
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
❯ venv/bin/docker-compose build
❯ venv/bin/docker-compose run init  # 只有在第一次才需要执行这步
❯ venv/bin/docker-compose run --service-ports -d web  # 启动Web,地址也是 http://localhost:8100
❯ venv/bin/docker-compose run -d celery  # 同样是在扫码登录之后再启动

本地开发

配置前端开发环境

安装cnpm提高包下载速度:

❯ npm install -g cnpm --registry=https://registry.npm.taobao.org

安装需要的包:

❯ cnpm i 

启动调试环境:

❯ npm run dev

启动成功默认会打开 http://localhost:8080 ,后端API依然使用的是 http://localhost:8100/j

本地开发完毕通过如下方式构建:

❯ npm run build

刷新 http://localhost:8100 就可以看到最新的效果了。

后端开发

要注意修改表结构,每次都要:

❯ venv/bin/flask db migrate
❯ venv/bin/flask db upgrade

必看: 常见问题 FAQ

为什么在使用一段时间后偶尔会出现puid not found这种错误呢?

由于微信的设计,不提供一种唯一且稳定的uid之类的数据,所以wxpy设计了一套登录用户和其相关联系人、群聊、公众号的映射关系,另外我修改了wxpy的实现,可以更多的获得caption (昵称, 性别, 省份, 城市)相关的内容,让对象中的puid更稳定。

由于其中某些人/群的设置的改变,它的puid可能改变,在每次扫码登录之后都会触发一个更新这个映射关系的任务,让这个映射关系更新成最新的。你遇到这种错误说明你需要重新登录,或者,手动触发一下这个任务:

from wechat.tasks import retrieve_data
retrieve_data.delay()

为什么用着用着有时候感觉卡住了,接口不返回了?

Issue: #9

感谢 @zgjhust 的意见

这是一个小型项目,我没有添加Nginx支持,直接使用了Gunicorn。在用Gunicorn的时候使用了-t 0也就是不超时。

这样用的原因是项目中的sse需要一个长连接,而且从用户打开登录页面到扫码完成这个时间不好控制,就索性不超时了,但是也造成了未响应的请求不能及时释放。事实上应该把/stream拿出来特殊处理,其他的路由需要有超时时间设置的(这块,我会择机重构一下)。

现在的解决办法是指定更多的Worker数量,以及经常的重启gunicorn(使用supervisor管理会更方便):

gunicorn app:app --bind 0.0.0.0:8100 -w 10 -t 0

或者不用gunicorn, 直接使用Flask的threaded参数启动:

❯ cat app.py
...
if __name__ == '__main__':
     app.run(host='0.0.0.0', port=8100, debug=app.debug, threaded=True)
     
❯ python app.py

为什么有时候发现这个管理系统已经不工作了,如果让这个系统能尽量长的工作呢?

不工作了通常有2个原因:

  1. 由于微信的设计,我这个系统、Mac微信、网页微信这三者不能同时在线,否则就会被踢下线。
  2. 这个系统事实上还是使用网页微信,一段时间后(我还没有总结出来这个时间阈值)会自动登出,需要你重新扫码登录。

尽管我在celery上设计的重启任务的功能,但是由于下线后重新重新扫码登录,这一步无法自动化,造成系统不工作了。

如果希望这个系统尽量长的工作,我的建议是:

  1. 应该专门购买一张手机卡注册微信使用本系统,这样不会影响个人使用的微信不能登录微信客户端了。
  2. 把程序不要运行在个人电脑上,可以放在vps或者其他服务器上,这样可保持正常情况下的一直在线。
  3. 我给wxpy、ItChat都加了信号(Signals)系统,你可以仿造我的项目代码中的例子,加一个订阅者,能够在它有问题的时候用短信、Slack、邮件等方式第一时间通知你,让你及时处理,举个例子:
from celery.task import periodic_task
from celery.task.control import revoke

def restart_listener(sender, **kw):
    task_id = r.get(LISTENER_TASK_KEY)
    if task_id:
        revoke(str(task_id, 'utf-8'))
    task_id = app.send_task('wechat.tasks.listener')
    r.set(LISTENER_TASK_KEY, task_id)

stopped.connect(restart_listener)

要注意订阅操作应该发生在import wxpy/itchat之前。

为什么这个系统功能有限?我看手机微信能做的事情要多得多嘛

是的,这是一个封装wxpy/itchat的项目,说到底还是使用网页微信(wx.qq.com),所以它的API的功能决定了本系统的能力。

解密手机微信API,把这些未开放的API的集成进来不太好,还可能引起法律方面的问题。

如何解决「当前登录环境异常。为了你的帐号安全,暂时不能登录web微信...」的问题?

问题可以看这个issue,有不少人遇到了,在被封之后没有办法解决。但是可以注意让它尽量不被封。经过这几天的研究,我找到三条经验:

  1. 不要只使用Itchat中的USER_AGENT,可以在几个之间切换(注意要不同浏览器的UA),但是不要每次的UA不一样。
  2. 注意在群内的操作不要太频繁,机器人以及自动欢迎之类的慎用,尽量减少你的回应频率。
  3. 如果发现登录后突然弹出验证码,这是一个前兆,要暂停机器人功能,可以停止进程或者选择像用户那样登录网页微信或者Mac微信客户端一段时间。

感谢

wechat-admin's People

Contributors

dongweiming avatar lanceli avatar lau-jay avatar zgjhust avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechat-admin's Issues

微信好友昵称为emoji表情符号时,无法写入数据库。

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\xF0\x9F\x8C\xBF' for column 'nick_name' at row 1") [SQL: 'INSERT INTO users (create_at, id, sex, nick_name, signature, province, city) VALUES (%(create_at)s, %(id)s, %(sex)s, %(nick_name)s, %(signature)s, %(province)s, %(city)s)'] [parameters: {'signature': '做自己想做的事!!!……', 'city': '佛山', 'sex': 2, 'nick_name': '🌿',

Plugin的patterns匹配规则

Plugin的patterns匹配不是正则表达式吗?
拿help插件测试,发现 只要与help有相同(h,l,e,p,)部分就会调这个插件。

[2017-08-25 06:09:23,291: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:09:23,300: WARNING/ForkPoolWorker-2] 小西 : help (Text)
[2017-08-25 06:09:23,303: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:09:32,650: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:09:32,652: WARNING/ForkPoolWorker-2] 小西 : 1help (Text)
[2017-08-25 06:09:32,657: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:09:39,539: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:09:39,543: WARNING/ForkPoolWorker-2] 小西 : ls (Text)
[2017-08-25 06:09:39,553: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:09:44,179: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:09:44,183: WARNING/ForkPoolWorker-2] 小西 : lp (Text)
[2017-08-25 06:09:44,190: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:10:00,391: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:10:00,393: WARNING/ForkPoolWorker-2] 小西 : e (Text)
[2017-08-25 06:10:00,401: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:10:00,936: INFO/ForkPoolWorker-2] <Bot: issenn>: started
[2017-08-25 06:10:00,937: WARNING/ForkPoolWorker-2] 44
[2017-08-25 06:10:00,939: WARNING/ForkPoolWorker-2] 小西 : e (Text)
[2017-08-25 06:10:01,696: WARNING/ForkPoolWorker-2] 1
[2017-08-25 06:10:01,697: WARNING/ForkPoolWorker-2] {'id': '31501613', 'result': 100, 'msg': 'OK.', 'response': 'hh'}
[2017-08-25 06:10:01,698: WARNING/ForkPoolWorker-2] 2
[2017-08-25 06:10:01,699: WARNING/ForkPoolWorker-2] hh
[2017-08-25 06:10:01,701: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:
hh
[2017-08-25 06:10:03,156: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:10:03,158: WARNING/ForkPoolWorker-2] 小西 : l (Text)
[2017-08-25 06:10:03,170: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:10:05,496: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:10:05,499: WARNING/ForkPoolWorker-2] 小西 : p (Text)
[2017-08-25 06:10:05,504: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:12:33,796: WARNING/ForkPoolWorker-2] 33
[2017-08-25 06:12:33,799: WARNING/ForkPoolWorker-2] 小西 : issenn (Text)
[2017-08-25 06:12:33,802: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

目前支持如下插件:
SimSimi:
  色色的小黄鸡。触发条件:所有未触发其他插件的内容。
Help:
  帮助信息,触发条件: "help"

[2017-08-25 06:12:34,374: INFO/ForkPoolWorker-2] <Bot: issenn>: started
[2017-08-25 06:12:34,383: WARNING/ForkPoolWorker-2] 44
[2017-08-25 06:12:34,387: WARNING/ForkPoolWorker-2] 小西 : issenn (Text)
[2017-08-25 06:12:34,912: WARNING/ForkPoolWorker-2] 1
[2017-08-25 06:12:34,913: WARNING/ForkPoolWorker-2] {'result': 404, 'msg': 'Not found.'}
[2017-08-25 06:12:34,914: WARNING/ForkPoolWorker-2] =======================================
[2017-08-25 06:12:34,914: WARNING/ForkPoolWorker-2] 'response'
[2017-08-25 06:12:35,407: WARNING/ForkPoolWorker-2] 11
[2017-08-25 06:12:35,408: WARNING/ForkPoolWorker-2] =======================================
[2017-08-25 06:12:35,409: WARNING/ForkPoolWorker-2] string indices must be integers
[2017-08-25 06:12:35,410: INFO/ForkPoolWorker-2] sending msg to <Friend: 小西>:

启动服务后后台报错

您好,更新了你的库之后,重新执行了:

npm run build

没有出现编译错误了,同时,把devprod两个文件里的API_URL改为了我虚拟机的地址。再执行:

venv/bin/gunicorn app:app --bind 192.168.33.10:8100 -w 4 -t 0

解决了地址问题。但是,依旧出现不了二维码,后台报:

[2017-07-18 10:11:01 +0800] [27177] [INFO] Listening at: http://192.168.33.10:8100 (27177)
[2017-07-18 10:11:01 +0800] [27177] [INFO] Using worker: sync
[2017-07-18 10:11:01 +0800] [27180] [INFO] Booting worker with pid: 27180
[2017-07-18 10:11:01 +0800] [27181] [INFO] Booting worker with pid: 27181
[2017-07-18 10:11:01 +0800] [27182] [INFO] Booting worker with pid: 27182
[2017-07-18 10:11:01 +0800] [27183] [INFO] Booting worker with pid: 27183
Getting uuid of QR code.
Downloading QR code.
[2017-07-18 10:11:10 +0800] [27180] [ERROR] Socket error processing request.
Traceback (most recent call last):
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 191, in handle_request
    six.reraise(*sys.exc_info())
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/gunicorn/six.py", line 625, in reraise
    raise value
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 176, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/werkzeug/wsgi.py", line 600, in __call__
    return self.app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/werkzeug/wsgi.py", line 660, in __call__
    return app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/vagrant/wechat-admin/views/api.py", line 83, in login
    user = get_logged_in_user(current_bot)
  File "/vagrant/wechat-admin/libs/wx.py", line 57, in get_logged_in_user
    user_ = bot.self
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/vagrant/wechat-admin/libs/globals.py", line 8, in _find_bot
    top = get_bot()
  File "/vagrant/wechat-admin/libs/wx.py", line 36, in get_bot
    here, '../static/img/qr_code.png'))
  File "/vagrant/wechat-admin/venv/src/wxpy/wxpy/api/bot.py", line 85, in __init__
    loginCallback=login_callback, exitCallback=logout_callback
  File "/vagrant/wechat-admin/venv/src/itchat/itchat/components/register.py", line 31, in auto_login
    loginCallback=loginCallback, exitCallback=exitCallback)
  File "/vagrant/wechat-admin/venv/src/itchat/itchat/components/login.py", line 46, in login
    picDir=picDir, qrCallback=qrCallback)
  File "/vagrant/wechat-admin/venv/src/itchat/itchat/components/login.py", line 122, in get_QR
    utils.print_qr(picDir)
  File "/vagrant/wechat-admin/venv/src/itchat/itchat/utils.py", line 83, in print_qr
    subprocess.call(['xdg-open', fileDir])
  File "/usr/python3.6.2/lib/python3.6/subprocess.py", line 267, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/python3.6.2/lib/python3.6/subprocess.py", line 707, in __init__
    restore_signals, start_new_session)
  File "/usr/python3.6.2/lib/python3.6/subprocess.py", line 1333, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'xdg-open'

不能获取联系人 windows10

(python35) C:\Users..\wechat-admin-master>celery -A wechat worker

-------------- celery@DESKTOP-5CCO4GK v4.1.0 (latentcall)
---- **** -----
--- * *** * -- Windows-10-10.0.15063-SP0 2017-12-06 00:54:50
-- * - **** ---

  • ** ---------- [config]
  • ** ---------- .> app: wechat:0x2c9c4ca2278
  • ** ---------- .> transport: redis://localhost:6379//
  • ** ---------- .> results: redis://localhost:6379/
  • *** --- * --- .> concurrency: 4 (prefork)
    -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
    --- ***** -----
    -------------- [queues]
    .> celery exchange=celery(direct) key=celery

[2017-12-06 00:55:04,582: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',)
Traceback (most recent call last):
File "c:\users\yang\appdata\local\conda\conda\envs\python35\lib\site-packages\billiard\pool.py", line 358, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\users\yang\appdata\local\conda\conda\envs\python35\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)

====================================wechat_admin app

127.0.0.1 - - [06/Dec/2017 00:45:37] "GET /static/fonts/fontawesome-webfont.woff2 HTTP/1.1" 200 -
C:\Users\yang\AppData\Local\conda\conda\envs\python35\lib\site-packages\pymysql\cursors.py:166: Warning: (1681, "'@@SESSION.GTID_EXECUTED' is deprecated and will be removed in a future release.")
result = self._query(query)
C:\Users\yang\AppData\Local\conda\conda\envs\python35\lib\site-packages\pymysql\cursors.py:166: Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE' at row 474")
result = self._query(query)
127.0.0.1 - - [06/Dec/2017 00:55:24] "GET /j/users?gid=&page=1&q=&type=contact HTTP/1.1" 200 -

重启之后报错,着实不知哪出的问题

10.100.100.15 - - [30/Aug/2017 09:43:51] "POST /j/login HTTP/1.1" 500 -
Traceback (most recent call last):
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1997, in call
return self.wsgi_app(environ, start_response)
File "/usr/local/python35/lib/python3.5/site-packages/werkzeug/wsgi.py", line 600, in call
return self.app(environ, start_response)
File "/usr/local/python35/lib/python3.5/site-packages/werkzeug/wsgi.py", line 660, in call
return app(environ, start_response)
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1997, in call
return self.wsgi_app(environ, start_response)
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/python35/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/python35/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/python35/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functionsrule.endpoint
File "/root/wechat-admin/views/api.py", line 88, in login
from wechat.tasks import retrieve_data
File "/root/wechat-admin/wechat/tasks.py", line 32, in
bot = get_bot()
File "/root/wechat-admin/libs/wx.py", line 33, in get_bot
here, '../static/img/qr_code.png'), console_qr=None)
File "/root/wechat-admin/src/wxpy/wxpy/api/bot.py", line 87, in init
loginCallback=login_callback, exitCallback=logout_callback
File "/root/wechat-admin/src/itchat/itchat/components/register.py", line 32, in auto_login
loginCallback=loginCallback, exitCallback=exitCallback)
File "/root/wechat-admin/src/itchat/itchat/components/login.py", line 42, in login
uuid = push_login(self)
File "/root/wechat-admin/src/itchat/itchat/components/login.py", line 96, in push_login
r = core.s.get(url, headers=headers).json()
File "/usr/local/python35/lib/python3.5/site-packages/requests/models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/local/python35/lib/python3.5/json/init.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/local/python35/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/python35/lib/python3.5/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

安装 ItChat 时缺少依赖

在虚拟环境中安装项目依赖: pip install -r requirements.txt 出现以下依赖错误:

Updating /Users/fakeuser/.pyenv/versions/3.5.0/envs/wechat-admin/src/itchat clone (to signals)
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/Users/fakeuser/.pyenv/versions/3.5.0/envs/wechat-admin/src/itchat/setup.py", line 9, in <module>
        import itchat
      File "/Users/fakeuser/.pyenv/versions/3.5.0/envs/wechat-admin/src/itchat/itchat/__init__.py", line 2, in <module>
        from .core import Core
      File "/Users/fakeuser/.pyenv/versions/3.5.0/envs/wechat-admin/src/itchat/itchat/core.py", line 3, in <module>
        import requests
    ImportError: No module named 'requests'

在 requirements.txt 应该还需要添加 ItChat 的一些依赖:requests, pyqrcode, blinker

很长时间拉不下微信用户数据

在更新微信群组是报错:
[2017-08-29 16:23:27,812: INFO/ForkPoolWorker-2] <Bot: 布道>: updating groups
[2017-08-29 16:23:32,250: ERROR/ForkPoolWorker-2] Task wechat.tasks.update_group[7b964b48-9ee4-4757-aac1-4c309db96921] raised unexpected: TypeError("object of type 'NoneType' has no len()",)
Traceback (most recent call last):
File "/usr/local/python35/lib/python3.5/site-packages/celery/app/trace.py", line 367, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/python35/lib/python3.5/site-packages/celery/app/trace.py", line 622, in protected_call
return self.run(*args, **kwargs)
File "/root/wechat-admin/wechat/tasks.py", line 169, in update_group
_update_group(bot, update=update)
File "/root/wechat-admin/wechat/tasks.py", line 75, in _update_group
for field in USER_FIELD})
File "/root/wechat-admin/models/mixin.py", line 9, in create
obj = session.query(cls).get(kw['id'])
File "/usr/local/python35/lib/python3.5/site-packages/sqlalchemy/orm/query.py", line 864, in get
return self._get_impl(ident, loading.load_on_ident)
File "/usr/local/python35/lib/python3.5/site-packages/sqlalchemy/orm/query.py", line 875, in _get_impl
if len(ident) != len(mapper.primary_key):
TypeError: object of type 'NoneType' has no len()

TCP连接CLOSE_WAIT

web客户端主动关闭后,TCP连接进入CLOSE_WAIT状态,服务端未对其关闭。导致资源未回收,web客户端访问阻塞。

tcp        0      0 0.0.0.0:8100            0.0.0.0:*               LISTEN      5199/python3.4  
tcp        1      0 192.168.0.100:8100      192.168.0.199:35142     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:35540     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34602     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:35138     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35139     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:35541     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34977     CLOSE_WAIT  -               
tcp      454      0 192.168.0.100:8100      192.168.0.199:34544     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35314     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34978     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:35313     CLOSE_WAIT  -               
tcp      413      0 192.168.0.100:8100      192.168.0.199:34496     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35140     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35143     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35517     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34601     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34976     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34337     CLOSE_WAIT  5206/python3.4  
tcp        1      0 192.168.0.100:8100      192.168.0.199:35290     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35315     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:17982     CLOSE_WAIT  5202/python3.4  
tcp        1      0 192.168.0.100:8100      192.168.0.199:35316     CLOSE_WAIT  -               
tcp      359      0 192.168.0.100:8100      192.168.0.199:34522     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35288     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34600     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35141     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:34597     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34979     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:34974     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34313     CLOSE_WAIT  5203/python3.4  
tcp      387      0 192.168.0.100:8100      192.168.0.199:35516     CLOSE_WAIT  -               
tcp      387      0 192.168.0.100:8100      192.168.0.199:35287     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:35289     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34975     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34599     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34598     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34405     CLOSE_WAIT  5204/python3.4  
tcp        1      0 192.168.0.100:8100      192.168.0.199:34479     CLOSE_WAIT  5207/python3.4  
tcp      358      0 192.168.0.100:8100      192.168.0.199:34556     CLOSE_WAIT  -               
tcp        1      0 192.168.0.100:8100      192.168.0.199:34420     CLOSE_WAIT  5205/python3.4

Bug还是挺多的噢,不过感谢开源,再接再厉

再贴一条异常~

[2017-07-18 13:01:06 +0800] [28586] [ERROR] Error handling request /j/login
Traceback (most recent call last):
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 176, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/werkzeug/wsgi.py", line 600, in __call__
    return self.app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/werkzeug/wsgi.py", line 660, in __call__
    return app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/vagrant/wechat-admin/views/api.py", line 83, in login
    user = get_logged_in_user(current_bot)
  File "/vagrant/wechat-admin/libs/wx.py", line 61, in get_logged_in_user
    bot.core.get_head_img(picDir=path)
  File "/vagrant/wechat-admin/venv/src/itchat/itchat/components/contact.py", line 393, in get_head_img
    infoDict = self.storageClass.search_friends(userName=userName)
  File "/vagrant/wechat-admin/venv/src/itchat/itchat/storage/__init__.py", line 66, in search_friends
    return copy.deepcopy(self.memberList[0]) # my own account
IndexError: list index out of range

build 失败日志

0 info it worked if it ends with ok
1 verbose cli [ '/opt/node/bin/node', '/opt/node/bin/npm', 'run', 'build' ]
2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'prebuild', 'build', 'postbuild' ]
5 info lifecycle [email protected]prebuild: [email protected]
6 info lifecycle [email protected]
build: [email protected]
7 verbose lifecycle [email protected]build: unsafe-perm in lifecycle true
8 verbose lifecycle [email protected]
build: PATH: /opt/node/lib/node_modules/npm/bin/node-gyp-bin:/root/wechat-admin/node_modules/.bin:/opt/node/bin:/usr/local/php/sbin:/usr/local/php/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
9 verbose lifecycle [email protected]build: CWD: /root/wechat-admin
10 silly lifecycle [email protected]
build: Args: [ '-c', 'node build/build.js' ]
11 silly lifecycle [email protected]build: Returned: code: 1 signal: null
12 info lifecycle [email protected]
build: Failed to exec build script
13 verbose stack Error: [email protected] build: node build/build.js
13 verbose stack Exit status 1
13 verbose stack at EventEmitter. (/opt/node/lib/node_modules/npm/lib/utils/lifecycle.js:289:16)
13 verbose stack at emitTwo (events.js:125:13)
13 verbose stack at EventEmitter.emit (events.js:213:7)
13 verbose stack at ChildProcess. (/opt/node/lib/node_modules/npm/lib/utils/spawn.js:40:14)
13 verbose stack at emitTwo (events.js:125:13)
13 verbose stack at ChildProcess.emit (events.js:213:7)
13 verbose stack at maybeClose (internal/child_process.js:921:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
14 verbose pkgid [email protected]
15 verbose cwd /root/wechat-admin
16 verbose Linux 2.6.32-431.23.3.el6.x86_64
17 verbose argv "/opt/node/bin/node" "/opt/node/bin/npm" "run" "build"
18 verbose node v8.2.1
19 verbose npm v5.3.0
20 error code ELIFECYCLE
21 error errno 1
22 error [email protected] build: node build/build.js
22 error Exit status 1
23 error Failed at the [email protected] build script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 1, true ]

获取两三次二维码后,服务访问不上去了

持续出现二维码扫描报查找失败(4,-1)的错误,并且,刷新登录页以重新获取二维码,刷新两到三次后,服务器就连接不上了。关闭服务并重新执行:

 venv/bin/gunicorn app:app --bind 192.168.33.10:8100 -w 4 -t 0

才能继续访问登录页。同样,直接刷新页面两到三次后,继续访问不了了。

刷新页面两三次后,页面就一直处于连接状态中

Not supported in Chinese

sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE5\\x91\\xA8\\xE5\\xB8\\x85' for column 'nick_name' at row 1") [SQL: 'INSERT INTO users (create_at, id, sex, nick_name, signature, province, city) VALUES (%(create_at)s, %(id)s, %(sex)s, %(nick_name)s, %(signature)s, %(province)s, %(city)s)'] [parameters: {'create_at': datetime.datetime(2017, 7, 30, 10, 37, 52, 971788), 'id': 'a2a450bf', 'sex': 1, 'nick_name': '周帅', 'signature': '萌即是正义', 'province': '', 'city': ''}]

npm run build报错

[root@localhost wechat-admin]# npm run build

> [email protected] build /vagrant/wechat-admin
> node build/build.js

⠼ building for production...
Starting to optimize CSS...
Processing static/css/app.css...
Processed static/css/app.css, before: 310154, after: 307856, ratio: 99.26%
Hash: ed2cc32e226f95fff7f6
Version: webpack 2.7.0
Time: 67553ms
                                 Asset       Size  Chunks                    Chunk Names
                      static/js/app.js     109 kB       1  [emitted]         app
    static/img/fontawesome-webfont.svg     444 kB          [emitted]  [big]  
  static/fonts/fontawesome-webfont.ttf     166 kB          [emitted]         
static/fonts/fontawesome-webfont.woff2    77.2 kB          [emitted]         
 static/fonts/fontawesome-webfont.woff      98 kB          [emitted]         
        static/fonts/element-icons.ttf    13.2 kB          [emitted]         
                   static/js/vendor.js     681 kB       0  [emitted]  [big]  vendor
  static/fonts/fontawesome-webfont.eot     166 kB          [emitted]         
                 static/js/manifest.js    1.43 kB       2  [emitted]         manifest
                    static/css/app.css     308 kB       1  [emitted]  [big]  app
               static/js/vendor.js.map    4.37 MB       0  [emitted]         vendor
                  static/js/app.js.map     187 kB       1  [emitted]         app
                static/css/app.css.map     343 kB       1  [emitted]         app
             static/js/manifest.js.map    14.3 kB       2  [emitted]         manifest
                  templates/index.html  349 bytes          [emitted]         

ERROR in ./src/plugins/emoji/src/api/emoji.js
Module build failed: SyntaxError: Unexpected token (4:16)

  2 | let emojiData = {}
  3 | Object.values(data).forEach(item => {
> 4 |   emojiData = { ...emojiData, ...item }
    |                 ^
  5 | })
  6 | 
  7 | /**

 @ ./src/main.js 14:0-57

ERROR in static/js/app.js from UglifyJs
Unexpected token operator «=», expected punc «,» [./src/plugins/wechat.js:3,26][static/js/app.js:63,34]

  Build complete.

  Tip: built files are meant to be served over an HTTP server.
  Opening index.html over file:// won't work.

这是不是跟nodejs的版本有关呢?小白,望README写的更清楚些。目前想运行起来看效果。

使用docker-compose build出错

COPY models libs static templates uploads wechat-plugins views wechat *.py requirements.txt local_settings.py.tmpl /web/

代码缺少uploads 和 wechat-plugins 这两个目录,自己创建就好了
建议加上

README.md 使用Docker 中的一行代码错误

❯ git clone --recursive https://github.com/dongweiming/wechat-plugins

应该为

❯ git clone  https://github.com/dongweiming/wechat-admin.git
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins

关于Dockerfile

COPY models libs static templates views wechat *.py requirements.txt local_settings.py.tmpl /web/
经测试,COPY 只会把文件内容(不copy文件夹)copy到/web 目录下。
运行celery的时候应该会出现,找不到wechat模块吧。

群信息更新报错

首先非常感谢您的分享!很棒的项目!

我这边有一个比较奇怪的问题。就是获取群信息更新的时候,会报

wxpy.exceptions.ResponseError: err_code: -1001; err_msg: 无法找到对应的成员

但是不是每次在同一个地方报错。第一次可能同步1个群后就报错,第二次可能能到5-10个群,第三次更多,大约更新到50个群的时候报错。

而且只要报错中断,数据库就没有任何数据更新,所以必须不断尝试更新。

在itchat里也没找到合适的解释,可能是我的群比较多的原因……

群聊设置,输入关键字不能自动推送群连接。

运行一段时间,添加好友后自动通过,后台设置关键字推送群连接,一段时间后不好用。报错如下:
Traceback (most recent call last):
File "/root/wechat-admin/src/itchat/itchat/components/login.py", line 275, in maintain_loop
chatroomMsg = update_local_chatrooms(self, chatroomList)
File "/root/wechat-admin/src/itchat/itchat/storage/init.py", line 12, in _contact_change
return fn(core, *args, **kwargs)
File "/root/wechat-admin/src/itchat/itchat/components/contact.py", line 152, in update_local_chatrooms
'UserName', oldChatroom['ChatRoomOwner']).get('Uin', 0)
AttributeError: 'NoneType' object has no attribute 'get'

启动服务后,访问web,服务报SSLError

[2017-08-03 10:46:51 +0800] [30997] [INFO] Using worker: sync
[2017-08-03 10:46:51 +0800] [31000] [INFO] Booting worker with pid: 31000
[2017-08-03 10:46:51 +0800] [31001] [INFO] Booting worker with pid: 31001
[2017-08-03 10:46:51 +0800] [31002] [INFO] Booting worker with pid: 31002
[2017-08-03 10:46:51 +0800] [31003] [INFO] Booting worker with pid: 31003
[2017-08-03 10:46:51 +0800] [31004] [INFO] Booting worker with pid: 31004
[2017-08-03 10:46:51 +0800] [31005] [INFO] Booting worker with pid: 31005
Traceback (most recent call last):
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/connectionpool.py", line 601, in urlopen
chunked=chunked)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/connectionpool.py", line 346, in _make_request
self._validate_conn(conn)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/connectionpool.py", line 850, in validate_conn
conn.connect()
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/connection.py", line 326, in connect
ssl_context=context)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/util/ssl
.py", line 329, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/local/python/lib/python3.4/ssl.py", line 365, in wrap_socket
_context=self)
File "/usr/local/python/lib/python3.4/ssl.py", line 583, in init
self.do_handshake()
File "/usr/local/python/lib/python3.4/ssl.py", line 810, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/wechat-admin/venv/lib/python3.4/site-packages/requests/adapters.py", line 440, in send
timeout=timeout
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/connectionpool.py", line 639, in urlopen
_stacktrace=sys.exc_info()[2])
File "/root/wechat-admin/venv/lib/python3.4/site-packages/urllib3/util/retry.py", line 388, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='login.weixin.qq.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/wechat-admin/venv/src/itchat/itchat/utils.py", line 128, in test_connect
r = requests.get(config.BASE_URL)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/requests/sessions.py", line 502, in request
resp = self.send(prep, **send_kwargs)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/requests/sessions.py", line 612, in send
r = adapter.send(request, **kwargs)
File "/root/wechat-admin/venv/lib/python3.4/site-packages/requests/adapters.py", line 504, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='login.weixin.qq.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'),))

You can't get access to internet or wechat domain, so exit.

关于环境部署在虚拟机中~

我在虚拟机中部署了环境,并用虚拟机的IP访问

http://192.168.33.10:8100/#/login

可以看到页面“Scan to log in to WeChat”,但二维码显示不了。并且报一些列错:

GET http://localhost:8100/stream net::ERR_CONNECTION_REFUSED
app.js:1 Failed to connect to event stream
localhost:8100/stream:1 GET http://localhost:8100/stream net::ERR_CONNECTION_REFUSED
app.js:1 Failed to connect to event stream
localhost:8100/stream:1 GET http://localhost:8100/stream net::ERR_CONNECTION_REFUSED
app.js:1 Failed to connect to event stream
localhost:8100/stream:1 GET http://localhost:8100/stream net::ERR_CONNECTION_REFUSED
app.js:1 Failed to connect to event stream

之类的错误。请问这种情况如何解决呢?我虚拟机是全控制台的,并没有浏览器去访问localhost的条件。

谢谢~

`docker-compose run init` error `ModuleNotFoundError: No module named 'wxpy'`

similar to #19

steps to reproduce:

  1. docker images before build
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              c73c7527c03a        2 days ago          412MB
python              3.6                 968120d8cbe8        4 days ago          684MB
redis               latest              d4f259423416        4 days ago          106MB
  1. docker-compose run init
[...]
Traceback (most recent call last):
  File "/usr/local/bin/flask", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 513, in main
    cli.main(args=args, prog_name=name)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 380, in main
    return AppGroup.main(self, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1061, in invoke
    cmd_name, cmd, args = self.resolve_command(ctx, args)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1100, in resolve_command
    cmd = self.get_command(ctx, cmd_name)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 351, in get_command
    rv = info.load_app().cli.get_command(ctx, name)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 237, in load_app
    rv = locate_app(self.app_import_path)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 90, in locate_app
    __import__(module)
  File "/web/manager.py", line 4, in <module>
    from views.api import json_api as app
  File "/web/views/__init__.py", line 1, in <module>
    from .api import json_api  # noqa
  File "/web/views/api.py", line 12, in <module>
    import views.settings as settings
  File "/web/views/settings.py", line 7, in <module>
    from models.core import User
  File "/web/models/__init__.py", line 2, in <module>
    from .messaging import Log, Message  # noqa
  File "/web/models/messaging.py", line 7, in <module>
    from libs.consts import ID_TO_TYPE_MAP, MP as _MP
  File "/web/libs/consts.py", line 1, in <module>
    from wxpy.api.consts import *  # noqa
ModuleNotFoundError: No module named 'wxpy'

群内消息互相转发

是否可以考虑加入转发功能
定制哪几个群内容互相转发。如:群1,群2, 群3 , 那么三个中任何一个群中用户发的文本、图片、语音、视频,可以自动通过机器人转发到其他两个群,实现消息互通

谢谢

拉取不到好友列表~

成功登录后,界面里啥都没有,也没有联系人,后台报:

[2017-07-18 12:05:02,796: INFO/MainProcess] Connected to redis://localhost:6379//
[2017-07-18 12:05:02,813: INFO/MainProcess] mingle: searching for neighbors
[2017-07-18 12:05:03,036: INFO/Beat] beat: Starting...
[2017-07-18 12:05:03,847: INFO/MainProcess] mingle: all alone
[2017-07-18 12:05:03,881: INFO/MainProcess] [email protected] ready.
[2017-07-18 12:05:04,006: INFO/MainProcess] Received task: wechat.tasks.retrieve_data[09202141-7201-496e-9dcf-b11670698eab]  
[2017-07-18 12:05:04,011: INFO/MainProcess] Received task: wechat.tasks.listener[82bc9e23-0b66-4057-996c-8f3111fd0a87]  
[2017-07-18 12:05:04,021: INFO/ForkPoolWorker-3] <Bot: 大人物上篮>: joined
[2017-07-18 12:05:04,030: INFO/ForkPoolWorker-3] Task wechat.tasks.listener[82bc9e23-0b66-4057-996c-8f3111fd0a87] succeeded in 0.009817359001317527s: None
[2017-07-18 12:05:04,291: ERROR/ForkPoolWorker-2] Task wechat.tasks.retrieve_data[09202141-7201-496e-9dcf-b11670698eab] raised unexpected: AttributeError("'NoneType' object has no attribute 'mps'",)
Traceback (most recent call last):
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/celery/app/trace.py", line 367, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/celery/app/trace.py", line 622, in __protected_call__
    return self.run(*args, **kwargs)
  File "/vagrant/wechat-admin/wechat/tasks.py", line 125, in retrieve_data
    _retrieve_data()
  File "/vagrant/wechat-admin/wechat/tasks.py", line 32, in _retrieve_data
    _update_mp(bot, update)
  File "/vagrant/wechat-admin/wechat/tasks.py", line 72, in _update_mp
    local_ids = set([m.id for m in myself.mps])
AttributeError: 'NoneType' object has no attribute 'mps'
[2017-07-18 12:05:42,885: INFO/MainProcess] Received task: wechat.tasks.update_contact[96dd7a5e-2bd0-46bb-ba3d-dbb20435fca0]  
[2017-07-18 12:05:42,902: ERROR/ForkPoolWorker-2] Task wechat.tasks.update_contact[96dd7a5e-2bd0-46bb-ba3d-dbb20435fca0] raised unexpected: AttributeError("'NoneType' object has no attribute 'friends'",)
Traceback (most recent call last):
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/celery/app/trace.py", line 367, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/vagrant/wechat-admin/venv/lib/python3.6/site-packages/celery/app/trace.py", line 622, in __protected_call__
    return self.run(*args, **kwargs)
  File "/vagrant/wechat-admin/wechat/tasks.py", line 131, in update_contact
    _update_contact(bot, update=update)
  File "/vagrant/wechat-admin/wechat/tasks.py", line 93, in _update_contact
    local_ids = set([u.id for u in myself.friends.all()])
AttributeError: 'NoneType' object has no attribute 'friends'

不知道是不是太久没更新的问题?集中反馈下

主要用来想用来备份群消息的,发现的问题(能否手工删除聊天记录呢?这个聊天记录能保存多久?# 能否搜索呢?
拉人组群成功,但是强制刷新无效
qq 20180422144440
所有消息都会显示3条。。。(重启解决)
qq 20180422144525
发送消息可以发文字,不能发图片,不然会失败。
登陆后过一段时间提示这个

qq 20180422144627

完全不懂python,按说明安装的。。。用screen执行的venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0,然后用另一个screen执行的venv/bin/celery -A wechat worker -l info -B,不知道是不是方式不对,
最后感谢作者的程序。

docker 安装说明有误

docker 安装方式 中git 获取文件的路径有误,不是 wechat-plugin 。应为wechat-admin

`docker-compose run init` error `ModuleNotFoundError: No module named 'itchat'`

$ docker-compose run init
Creating network "wechatadmin_bridge" with driver "bridge"
Creating volume "wechatadmin_mysql-data" with local driver
Creating wechatadmin_mysql_1 ... 
Creating wechatadmin_redis_1 ... 
Creating wechatadmin_mysql_1
Creating wechatadmin_mysql_1 ... done
Traceback (most recent call last):
  File "/usr/local/bin/flask", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 513, in main
    cli.main(args=args, prog_name=name)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 380, in main
    return AppGroup.main(self, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1061, in invoke
    cmd_name, cmd, args = self.resolve_command(ctx, args)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1100, in resolve_command
    cmd = self.get_command(ctx, cmd_name)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 351, in get_command
    rv = info.load_app().cli.get_command(ctx, name)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 237, in load_app
    rv = locate_app(self.app_import_path)
  File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 90, in locate_app
    __import__(module)
  File "/web/manager.py", line 4, in <module>
    from views.api import json_api as app
  File "/web/views/__init__.py", line 1, in <module>
    from .api import json_api  # noqa
  File "/web/views/api.py", line 7, in <module>
    from itchat.signals import scan_qr_code, confirm_login, logged_in
ModuleNotFoundError: No module named 'itchat'

貌似是 requirements.txt 中 -e 参数的问题,我把它去掉,重新build就正常了

-e git+https://github.com/dongweiming/wxpy@signals#egg=wxpy
-e git+https://github.com/dongweiming/ItChat@signals#egg=itchat

通过wxpy获取的部分公众号puid字段为None,User记录创建失败

# wechat/tasks.py _update_mp

(Pdb) l
 76  	    wx_mps = bot.mps()
 77  	    local_ids = set([m.id for m in myself.mps])
 78  	    wx_ids = set([u.puid for u in wx_mps])
 79  	    need_add = wx_ids.difference(local_ids)
 80  	    if need_add:
 81  ->	        for m in wx_mps:
 82  	            if m.puid in need_add:
 83  	                try:
 84  	                    User.create(id=m.puid, **{field: getattr(m, field)
 85  	                                              for field in MP_FIELD})
 86  	                except:
(Pdb) l
 87  	                    from celery.contrib import rdb
 88  	                    rdb.set_trace()
 89  	                # wxpy还不支持公众号的头像下载
 90  	    need_del = local_ids.difference(wx_ids)
 91  	    if need_del:
 92  	        for mp in myself.mps:
 93  	            if mp.id in need_del:
 94  	                db.session.delete(mp)
 95  	    session.commit()
 96  	
 97  	
(Pdb) wx_mps[10].puid
(Pdb) type(wx_mps[10].puid)
<class 'NoneType'>
(Pdb) wx_mps[10].signature
'AIX大师公开课'
(Pdb) 

二维码停止推送

请问如何把登录时扫描二维码的方式改成浏览器请求的方式?

终端页面点击“退出登录”无效

软硬件环境:ubuntu 14.04,python3.4,VPS 远程连接, firefox终端。
点击“退出登录”,页面返回扫码页面,马上又自动进入主页面,再点击“退出登录”,再次返回扫码页面并马上进入主页面,直到第三次点击“退出登录”返回扫码界面之后,页面并没有返回主页面,但是服务端没有打印出“logout”消息

出现这个错误是gunicorn版本的问题嘛,我按照requirement安装的呀,求教

[2017-08-22 10:24:45 +0800] [566] [INFO] Starting gunicorn 19.7.1
Traceback (most recent call last):
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/sock.py", line 44, in set_options
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
OSError: [Errno 92] Protocol not available

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "venv/bin/gunicorn", line 11, in
sys.exit(run())
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 74, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/app/base.py", line 203, in run
super(Application, self).run()
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/app/base.py", line 72, in run
Arbiter(self).run()
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/arbiter.py", line 198, in run
self.start()
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/arbiter.py", line 157, in start
self.LISTENERS = sock.create_sockets(self.cfg, self.log, fds)
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/sock.py", line 180, in create_sockets
sock = sock_type(addr, conf, log)
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/sock.py", line 32, in init
self.sock = self.set_options(sock, bound=bound)
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/sock.py", line 89, in set_options
return super(TCPSocket, self).set_options(sock, bound=bound)
File "/home/wechat-admin/venv/lib/python3.5/site-packages/gunicorn/sock.py", line 46, in set_options
if err[0] not in (errno.ENOPROTOOPT, errno.EINVAL):
TypeError: 'OSError' object is not subscriptable

登录页面不停刷新,产生close wait连接,堵死server进程

  1. 在登录页面不停刷新,浏览器到server的连接中断,但是server未能及时关闭连接,最后导致gunicorn被堵死,只能重启,没想到好的解决办法~
    2017-07-21 10 33 56

  2. flask app默认只能处理一个并发,可以做如下修改,方便调试

if __name__ == '__main__':                                                                                                                         
     app.run(host='0.0.0.0', port=8100, debug=app.debug, threaded=True)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.