From c1e702aafd1a7d640093e8751a92de48e1f7a953 Mon Sep 17 00:00:00 2001 From: urinx <1336006643@qq.com> Date: Sun, 16 Apr 2017 21:55:51 +0800 Subject: [PATCH] i just come out and take a bubble, haha \O^O/ --- .gitignore | 6 +- README.md | 123 ++- genReq.sh | 2 - {screenshot => imgs}/1.png | Bin {screenshot => imgs}/2.png | Bin {screenshot => imgs}/3.png | Bin {screenshot => imgs}/4.png | Bin {screenshot => imgs}/5.png | Bin imgs/8.jpg | Bin 0 -> 25091 bytes {saved/qrcodes => imgs}/groupQrcode.jpg | Bin saved/qrcodes/qrcode.jpg | Bin 41486 -> 0 bytes screenshot/6.png | Bin 219904 -> 0 bytes screenshot/7.png | Bin 11954 -> 0 bytes screenshot/8.jpg | Bin 25101 -> 0 bytes .../requirements.txt | 0 weixin.py => wxbot_demo_py3/weixin.py | 0 wxbot_project_py2.7/README.md | 37 + wxbot_project_py2.7/config/__init__.py | 6 + wxbot_project_py2.7/config/config_manager.py | 105 ++ wxbot_project_py2.7/config/constant.py | 215 ++++ wxbot_project_py2.7/config/log.py | 23 + wxbot_project_py2.7/config/requirements.txt | 5 + wxbot_project_py2.7/config/wechat.conf.bak | 72 ++ wxbot_project_py2.7/db/__init__.py | 5 + wxbot_project_py2.7/db/mysql_db.py | 200 ++++ wxbot_project_py2.7/db/sqlite_db.py | 173 ++++ wxbot_project_py2.7/docker/Dockerfile | 18 + wxbot_project_py2.7/docker/README.md | 49 + wxbot_project_py2.7/server/index.html | 210 ++++ wxbot_project_py2.7/server/upload.html | 7 + .../wechat/__init__.py | 2 + wxbot_project_py2.7/wechat/utils.py | 359 +++++++ wxbot_project_py2.7/wechat/wechat.py | 697 +++++++++++++ wxbot_project_py2.7/wechat/wechat_apis.py | 969 ++++++++++++++++++ wxbot_project_py2.7/weixin_bot.py | 278 +++++ wxbot_project_py2.7/wx_handler/__init__.py | 5 + wxbot_project_py2.7/wx_handler/bot.py | 47 + .../wx_handler/wechat_msg_processor.py | 246 +++++ 38 files changed, 3809 insertions(+), 50 deletions(-) delete mode 100644 genReq.sh rename {screenshot => imgs}/1.png (100%) rename {screenshot => imgs}/2.png (100%) rename {screenshot => imgs}/3.png (100%) rename {screenshot => imgs}/4.png (100%) rename {screenshot => imgs}/5.png (100%) create mode 100644 imgs/8.jpg rename {saved/qrcodes => imgs}/groupQrcode.jpg (100%) delete mode 100644 saved/qrcodes/qrcode.jpg delete mode 100644 screenshot/6.png delete mode 100644 screenshot/7.png delete mode 100644 screenshot/8.jpg rename requirements.txt => wxbot_demo_py3/requirements.txt (100%) rename weixin.py => wxbot_demo_py3/weixin.py (100%) create mode 100644 wxbot_project_py2.7/README.md create mode 100644 wxbot_project_py2.7/config/__init__.py create mode 100644 wxbot_project_py2.7/config/config_manager.py create mode 100644 wxbot_project_py2.7/config/constant.py create mode 100644 wxbot_project_py2.7/config/log.py create mode 100644 wxbot_project_py2.7/config/requirements.txt create mode 100644 wxbot_project_py2.7/config/wechat.conf.bak create mode 100644 wxbot_project_py2.7/db/__init__.py create mode 100644 wxbot_project_py2.7/db/mysql_db.py create mode 100644 wxbot_project_py2.7/db/sqlite_db.py create mode 100644 wxbot_project_py2.7/docker/Dockerfile create mode 100644 wxbot_project_py2.7/docker/README.md create mode 100644 wxbot_project_py2.7/server/index.html create mode 100644 wxbot_project_py2.7/server/upload.html rename __init__.py => wxbot_project_py2.7/wechat/__init__.py (59%) create mode 100644 wxbot_project_py2.7/wechat/utils.py create mode 100644 wxbot_project_py2.7/wechat/wechat.py create mode 100644 wxbot_project_py2.7/wechat/wechat_apis.py create mode 100755 wxbot_project_py2.7/weixin_bot.py create mode 100644 wxbot_project_py2.7/wx_handler/__init__.py create mode 100644 wxbot_project_py2.7/wx_handler/bot.py create mode 100644 wxbot_project_py2.7/wx_handler/wechat_msg_processor.py diff --git a/.gitignore b/.gitignore index 7dea058..0a652e3 100644 --- a/.gitignore +++ b/.gitignore @@ -94,4 +94,8 @@ ENV/ .idea *.pyc -saved/qrcodes/qrcode.jpg \ No newline at end of file +wxbot_demo_py3/saved/ +wxbot_project_py2.7/tmp_data/ +wxbot_project_py2.7/wechat/wechat_js_backup/ +wxbot_project_py2.7/config/wechat.conf +wxbot_project_py2.7/wiki/ diff --git a/README.md b/README.md index c5b7c82..d62c138 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,42 @@ -# WeixinBot [![star this repo](http://github-svg-buttons.herokuapp.com/star.svg?user=Urinx&repo=WeixinBot&style=flat&background=1081C1)](http://github.com/Urinx/WeixinBot) [![fork this repo](http://github-svg-buttons.herokuapp.com/fork.svg?user=Urinx&repo=WeixinBot&style=flat&background=1081C1)](http://github.com/Urinx/WeixinBot/fork) ![python](https://img.shields.io/badge/python-3-ff69b4.svg) +# WeixinBot [![star this repo](http://github-svg-buttons.herokuapp.com/star.svg?user=Urinx&repo=WeixinBot&style=flat&background=1081C1)](http://github.com/Urinx/WeixinBot) [![fork this repo](http://github-svg-buttons.herokuapp.com/fork.svg?user=Urinx&repo=WeixinBot&style=flat&background=1081C1)](http://github.com/Urinx/WeixinBot/fork) ![python](https://img.shields.io/badge/python-2.7%20&%203.6-ff69b4.svg) 网页版微信API,包含终端版微信及微信机器人 -## Demo -为了运行 `weixin.py` 示例脚本,你需要有安装 `qrcode` 包,你可以通过 `pip install qrcode` 来安装。 +## Contents +* [Demo](#Demo) +* [Web Weixin Pipeline](#Web-Weixin-Pipeline) +* [Web Weixin API](#Web-Weixin-API) +* [Discussion Group](#Discussion-Group) +* [Recent Update](#Recent-Update) -![1](screenshot/1.png) +## Demo +为了确保能正常运行示例脚本,请安装所需的第三方包。 + +``` +pip install -r requirements.txt +``` + +注:下面演示的图片与功能可能不是最新的,具体请看源码。 + +
+ +
按照操作指示在手机微信上扫描二维码然后登录,你可以选择是否开启自动回复模式。 -![2](screenshot/2.png) +![2](imgs/2.png) 开启自动回复模式后,如果接收到的是文字消息就会自动回复,包括群消息。 -![3](screenshot/3.png) +![3](imgs/3.png) -现在,名片,链接,动画表情和地址位置消息都可以正常接收。 +名片,链接,动画表情和地址位置消息。 -![4](screenshot/4.png) +![4](imgs/4.png) -![5](screenshot/5.png) +![5](imgs/5.png) -**目前支持的命令**: - -`->[昵称或ID]:[内容]` 给好友发送消息 - -`m->[昵称或ID]:[文件路径]` 给好友发送文件中的内容 - -![6](screenshot/6.png) - -`f->[昵称或ID]:[文件路径]` 给好友发送文件 - -`i->[昵称或ID]:[图片路径]` 给好友发送图片 - -`e->[昵称或ID]:[文件路径]` 给好友发送表情(jpg/gif) - -`quit` 退出程序 - -![7](screenshot/7.png) - -注意,以上命令均不包含方括号。 +网页版上有的功能目前基本上都能支持。 ## Web Weixin Pipeline @@ -69,14 +66,7 @@ |QRCode Scaned| +-------------+ ``` -## Discussion Group -如果你希望和 WeixinBot 的其他开发者交流,或者有什么问题和建议,欢迎大家加入微信群【Youth fed the dog】一起讨论。扫描下面的二维码添加机器人为好友,并回复【Aidog】获取入群链接。 -
-join us -
- -注:这个不是群的二维码,是机器人拉你入群,记得回复机器人【Aidog】哦~ (secret code: Aidog) ## Web Weixin API @@ -95,12 +85,29 @@ window.QRLogin.code = 200; window.QRLogin.uuid = "xxx" ``` > 注:这里的appid就是在微信开放平台注册的应用的AppID。网页版微信有两个AppID,早期的是`wx782c26e4c19acffb`,在微信客户端上显示为应用名称为`Web微信`;现在用的是`wxeb7ec651dd0aefa9`,显示名称为`微信网页版`。 -![6](screenshot/8.jpg) +
+ +
+ +
+| API | 绑定登陆(webwxpushloginurl) | +| --- | --------- | +| url | https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxpushloginurl | +| method | GET | +| params | **uin**: xxx | + +返回数据(String): +``` +{'msg': 'all ok', 'uuid': 'xxx', 'ret': '0'} + +通过这种方式可以省掉扫二维码这步操作,更加方便 +```
| API | 生成二维码 | | --- | --------- | | url | https://login.weixin.qq.com/l/ `uuid` | +| method | GET |
| API | 二维码扫描登录 | @@ -299,7 +306,7 @@ window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?tic | API | synccheck | | --- | --------- | | protocol | https | -| host | webpush.weixin.qq.com
webpush2.weixin.qq.com
webpush.wechat.com
webpush1.wechat.com
webpush2.wechat.com
webpush.wechatapp.com
webpush1.wechatapp.com | +| host | webpush.weixin.qq.com
webpush.wx2.qq.com
webpush.wx8.qq.com
webpush.wx.qq.com
webpush.web2.wechat.com
webpush.web.wechat.com | | path | /cgi-bin/mmwebwx-bin/synccheck | | method | GET | | data | URL Encode | @@ -396,6 +403,24 @@ selector: } ``` +| API | webwxrevokemsg | +| --- | ------------ | +| url | https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxrevokemsg | +| method | POST | +| data | JSON | +| header | ContentType: application/json; charset=UTF-8 | +| params | {
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx },
     SvrMsgId: msg_id,
     ToUserName: user_id,
     ClientMsgId: local_msg_id
} | + +返回数据(JSON): +``` +{ + "BaseResponse": { + "Ret": 0, + "ErrMsg": "" + } +} +``` + #### 发送表情 | API | webwxsendmsgemotion | @@ -497,10 +522,10 @@ selector: | 1 | 文本消息 | | 3 | 图片消息 | | 34 | 语音消息 | -| 37 | VERIFYMSG | +| 37 | 好友确认消息 | | 40 | POSSIBLEFRIEND_MSG | | 42 | 共享名片 | -| 43 | 视频通话消息 | +| 43 | 视频消息 | | 47 | 动画表情 | | 48 | 位置消息 | | 49 | 分享链接 | @@ -757,13 +782,17 @@ Content: "收到红包,请在手机上查看" ``` -持续更新中 ... -## Todo -- [x] 发送图片或者文件功能 -- [ ] 主动给群聊发送消息 -- [ ] 建立群聊 -- [x] 群发消息 -- [ ] 补充更多的接口及完善文档 +## Discussion Group +如果你希望和 WeixinBot 的其他开发者交流,或者有什么问题和建议,欢迎大家加入微信群【Youth fed the dog】一起讨论。扫描下面的二维码添加机器人为好友,并回复【Aidog】获取入群链接。 -P.S. 还有啥要补充的也可以在[issue #8](https://github.com/Urinx/WeixinBot/issues/8)下留言 +
+join us +
+ +注:这个不是群的二维码,是机器人拉你入群,记得回复机器人【Aidog】哦~ (secret code: Aidog) + +## Recent Update + +- association_login + 目前网页版微信已经可以脱离扫码,但是依然需要在客户端进行确认登录。 diff --git a/genReq.sh b/genReq.sh deleted file mode 100644 index 051bf6b..0000000 --- a/genReq.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -pip freeze |grep -v wheel | gawk -F"==" ' { print $1 } ' > requirements.txt diff --git a/screenshot/1.png b/imgs/1.png similarity index 100% rename from screenshot/1.png rename to imgs/1.png diff --git a/screenshot/2.png b/imgs/2.png similarity index 100% rename from screenshot/2.png rename to imgs/2.png diff --git a/screenshot/3.png b/imgs/3.png similarity index 100% rename from screenshot/3.png rename to imgs/3.png diff --git a/screenshot/4.png b/imgs/4.png similarity index 100% rename from screenshot/4.png rename to imgs/4.png diff --git a/screenshot/5.png b/imgs/5.png similarity index 100% rename from screenshot/5.png rename to imgs/5.png diff --git a/imgs/8.jpg b/imgs/8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..921a8161ec4a9877cc3a073a2d0a1ba829a9f525 GIT binary patch literal 25091 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 BRs#S4 literal 0 HcmV?d00001 diff --git a/saved/qrcodes/groupQrcode.jpg b/imgs/groupQrcode.jpg similarity index 100% rename from saved/qrcodes/groupQrcode.jpg rename to imgs/groupQrcode.jpg diff --git a/saved/qrcodes/qrcode.jpg b/saved/qrcodes/qrcode.jpg deleted file mode 100644 index 80262a3c0c73c1e38590117f47ab16f723ec9121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41486 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 diff --git a/screenshot/6.png b/screenshot/6.png deleted file mode 100644 index 7703178fdfe405140a4c695fe201ad203d7f3a13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219904 zcmaHS1ymeevn>z^7F>h726uNSxI2Tpy9IYmaCZ$F+&#FvJHZEc-sJo5yZ5g3_#Ug7 z>FMs%r>jnNb)CI;hbzcQAi&|kfq{V`NJ)w+fq_AxgMmSiz@y~ zFTe^5Udn(7-IGA57uCO!%ZTu#)jU$PrVF53^Qqy&vO zytk^n(XIVja6u9xx&7VRIwF2Vu*xA!m@6;3JNsn`B8LElF@~D-O2kh=FM8vDi?u_~{uytu9-ehR+@*o;>j|t06Dt=OvxjNb}_(jZfO_YfKz)a2@uNB+q2k9xn(&e-k=I5K^1@_s2iq7S{C_ko<6k}O8G_jm99}TMDWhNfVUz2`B`4DDm#Jd>hLSZf3^~BMFyy#@;ic0@H zh1bzf%1i8wN`PXE+!w?{gvpyE{<$WtpBDYKD+9I&j429}F+rC(YKg-#5LaX#u?gu6 z@j>K_^TPsUQWM{3AMRaHGne4$-6t`l)sDH#!3VO6&IvQoDuc>R#vT%nld=04%@^$c zyH*?r1H#LE@&*W=ka~bwjf@7V8g$Cy=L!O=UOB0YMQQghy0H0mV$#hfU7T%-xW_cd z{Kpe-DVc0Nf>b^mM6o=S^0ma?bx=;hZL`04i#VQ1oKm~J8|EO3e%42mf+d`{o?HP# zh+k|;qeeEIxxRump^KOtao~@DefusCmecuE#Nv+7xS$0l=Ta@!c|s5=u;p1FYl)7R4EQx5A_QSI;Mx6c46qjAX}S#U z(P#a|?J;%0)CHlNz|Xqtr{MLzfnOkgB8CwbHiyBV5_Co(?SrTh%RoWuBZL(riH9VE zl@hxTgGr73A|@So^PAlmNh$m}B13eXBsorQ7jZiJnz$-no+?C1QB?((O`I}syo3WM zKs=viQiTpflsA5ry!YcLD59eXjVN7YZJ>EV3z38^K zwvM*QXBCgEXTSs9rNl17u-k}VL7Bo>X~*mz6%-e?8?gFt&(OyZ@%+y-ZRX*>c$Y1; z$WQT3iBAI|bi1XAHT?6dC39tS)pBLF3iC4Z;`17}W&0uemHLe$)G?kCcYj1BdM9c~ z!zT{^kfT{s!ci%rU7-r4HKVRl;xF-*dPs$n>euMk56-WZHK`irN+jSG=g4`QUb-&4 z_PM^g)>F+Z3%9JcY_SYKGMsar182iv^QzaV=dv`hES~NA6lFLHV`|Ji<mO%gi4= zLvX+s!(+SGbmXABvtAyney4O$hE={$vZ3%+&^>#x@Ox6DSg{x=h_=AGkWt2^?Nq$) zG4={9+gTf^8^nqg;C`*dEHkOZC}oqks!~gz&uNHp&1n$yD!=7A^~Dc~NtSCF7tfsG z_Gxj}MbgbW6JKL#nMk#iwKJt~g0Bna$|)|yDxjQR$zQ1CD6q>T%-1i`&wuOs2H3QY z15{7tEE#kuEZ9eEdH2%vwu(E7kBeJ~r$=i=uj8g;4}NCgsATaq&9g57G=I~on+Y1ThWWh=Ef+`!obpL>9579b@9bj!�<);_f>TY-NoiF|H) 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؀H*UQ0t0H*#H3L%yho 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%0A0ye>U!$R!hTV@Ei5`B|9TtLu9` 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 diff --git a/screenshot/7.png b/screenshot/7.png deleted file mode 100644 index d8dce4162d498d9b5b2e69eb427ecee0ac9095ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11954 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 Z`c2eC0Oo3)=fi6#2~k;*5+RW9{{uDI7@+_F diff --git a/screenshot/8.jpg b/screenshot/8.jpg deleted file mode 100644 index 0c9329d3b1a2e330a4f78559a65f7f813b647f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25101 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' + + SERVER_LOG_FORMAT = '%(asctime)s - %(pathname)s:%(lineno)d - %(name)s - %(levelname)s - %(message)s' + SERVER_UPLOAD_ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) + SERVER_PAGE_UPLOAD = 'Server/upload.html' + SERVER_PAGE_INDEX = 'Server/index.html' + + RUN_RESULT_SUCCESS = '成功 %ds\n' + RUN_RESULT_FAIL = '失败\n[*] 退出程序\n' + MAIN_RESTART = '[*] wait for restart' + LOG_MSG_FILE = 'WeChat-Msgs-%Y-%m-%d.json' + LOG_MSG_GROUP_LIST_FILE = 'group_list.json' + LOG_MSG_QUIT = '\n[*] Force quit.\n' + LOG_MSG_FAIL = '失败\n' + LOG_MSG_SUCCESS = '成功\n' + LOG_MSG_START = '[*] 微信网页版 ... 开动\n' + LOG_MSG_RECOVER = '[*] 从配置文件中恢复 ... ' + LOG_MSG_RECOVER_CONTACT = '[*] 从文件中恢复联系人数据 ... ' + LOG_MSG_TRY_INIT = '[*] 尝试初始化 ... ' + LOG_MSG_ASSOCIATION_LOGIN = '[*] 通过关联登录 ... ' + LOG_MSG_GET_UUID = '[*] 正在获取 uuid ... ' + LOG_MSG_GET_QRCODE = '[*] 正在获取二维码 ... 成功\n' + LOG_MSG_SCAN_QRCODE = '[*] 请使用微信扫描二维码以登录 ... \n' + LOG_MSG_CONFIRM_LOGIN = '[*] 请在手机上点击确认以登录 ... \n' + LOG_MSG_WAIT_LOGIN_ERR1 = '[登陆超时] \n' + LOG_MSG_WAIT_LOGIN_ERR2 = '[登陆异常] \n' + LOG_MSG_LOGIN = '[*] 正在登录 ... ' + LOG_MSG_INIT = '[*] 微信初始化 ... ' + LOG_MSG_STATUS_NOTIFY = '[*] 开启状态通知 ... ' + LOG_MSG_GET_CONTACT = '[*] 获取联系人 ... ' + LOG_MSG_CONTACT_COUNT = '[*] 应有 %s 个联系人,读取到联系人 %d 个\n' + LOG_MSG_OTHER_CONTACT_COUNT = '[*] 共有 %d 个群 | %d 个直接联系人 | %d 个特殊账号 | %d 公众号或服务号\n' + LOG_MSG_GET_GROUP_MEMBER = '[*] 拉取群聊成员 ... ' + LOG_MSG_SNAPSHOT = '[*] 保存配置 ... ' + LOG_MSG_LOGOUT = '[*] 你在手机上登出了微信\n' + LOG_MSG_LOGIN_OTHERWHERE = '[*] 你在其他地方登录了 WEB 版微信\n' + LOG_MSG_QUIT_ON_PHONE = '[*] 你在手机上主动退出了\n' + LOG_MSG_RUNTIME = '[*] Total run: %s\n' + LOG_MSG_KILL_PROCESS = 'kill %d' + LOG_MSG_NEW_MSG = '>>> %d 条新消息\n' + LOG_MSG_LOCATION = '[位置] %s' + LOG_MSG_PICTURE = '[图片] %s' + LOG_MSG_VOICE = '[语音] %s' + LOG_MSG_RECALL = '撤回了一条消息' + LOG_MSG_ADD_FRIEND = '%s 请求添加你为好友' + LOG_MSG_UNKNOWN_MSG = '[*] 该消息类型为: %d,内容: %s' + LOG_MSG_VIDEO = '[小视频] %s' + LOG_MSG_NOTIFY_PHONE = '[*] 提示手机网页版微信登录状态\n' + LOG_MSG_EMOTION = '[表情] %s' + LOG_MSG_NAME_CARD = ( + '[名片]\n' + '=========================\n' + '= 昵称: %s\n' + '= 微信号: %s\n' + '= 地区: %s %s\n' + '= 性别: %s\n' + '=========================' + ) + LOG_MSG_SEX_OPTION = ['未知', '男', '女'] + LOG_MSG_APP_LINK = ( + '[%s]\n' + '=========================\n' + '= 标题: %s\n' + '= 描述: %s\n' + '= 链接: %s\n' + '= 来自: %s\n' + '=========================' + ) + LOG_MSG_APP_LINK_TYPE = {5: '链接', 3: '音乐', 7: '微博'} + LOG_MSG_APP_IMG = ( + '[图片]\n' + '=========================\n' + '= 文件: %s\n' + '= 来自: %s\n' + '=========================' + ) + LOG_MSG_SYSTEM = '系统消息' + LOG_MSG_UNKNOWN_NAME = '未知_' + LOG_MSG_UNKNOWN_GROUP_NAME = '未知群_' + + TABLE_GROUP_MSG_LOG = 'WeChatRoomMessage' + TABLE_GROUP_MSG_LOG_COL = """ + MsgID text, + RoomOwnerID text, + RoomName text, + UserCount text, + FromUserName text, + ToUserName text, + AttrStatus text, + DisplayName text, + Name text, + MsgType text, + FaceMsg text, + TextMsg text, + ImageMsg text, + VideoMsg text, + SoundMsg text, + LinkMsg text, + NameCardMsg text, + LocationMsg text, + RecallMsgID text, + SysMsg text, + MsgTime text, + MsgTimestamp text + """ + + @staticmethod + def TABLE_GROUP_LIST(): + return 'WeChatRoom_' + time.strftime('%Y%m%d', time.localtime()) + + TABLE_GROUP_LIST_COL = """ + RoomName text, + RoomID text, + RoomOwnerID text, + UserCount text, + RoomIcon text + """ + + @staticmethod + def TABLE_GROUP_USER_LIST(): + return 'WeChatRoomMember_' + time.strftime('%Y%m%d', time.localtime()) + + TABLE_GROUP_USER_LIST_COL = """ + RoomID text, + MemberID text, + MemberNickName text, + MemberDisplayName text, + MemberAttrStatus text + """ + TABLE_RECORD_ENTER_GROUP = 'WeChatEnterGroupRecord' + TABLE_RECORD_ENTER_GROUP_COL = """ + MsgID text, + RoomName text, + FromUserName text, + ToUserName text, + Name text, + EnterTime text + """ + TABLE_RECORD_RENAME_GROUP = 'WeChatRenameGroupRecord' + TABLE_RECORD_RENAME_GROUP_COL = """ + MsgID text, + FromName text, + ToName text, + ModifyPeople text, + ModifyTime text + """ + + API_APPID = 'wx782c26e4c19acffb' + API_WXAPPID = 'wx299208e619de7026' # Weibo + # 'wxeb7ec651dd0aefa9' # Weixin + API_LANG = 'zh_CN' + API_USER_AGENT = ( + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) ' + 'AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/48.0.2564.109 Safari/537.36' + ) + API_SPECIAL_USER = [ + 'newsapp', 'filehelper', 'weibo', 'qqmail', + 'fmessage', 'tmessage', 'qmessage', 'qqsync', + 'floatbottle', 'lbsapp', 'shakeapp', 'medianote', + 'qqfriend', 'readerapp', 'blogapp', 'facebookapp', + 'masssendapp', 'meishiapp', 'feedsapp', 'voip', + 'blogappweixin', 'brandsessionholder', 'weixin', + 'weixinreminder', 'officialaccounts', 'wxitil', + 'notification_messages', 'wxid_novlwrv3lqwv11', + 'gh_22b87fa7cb3c', 'userexperience_alarm', + ] + + EMOTICON = [ + '[Smile]', '[Grimace]', '[Drool]', '[Scowl]', '[CoolGuy]', '[Sob]', '[Shy]', + '[Silent]', '[Sleep]', '[Cry]', '[Awkward]', '[Angry]', '[Tongue]', '[Grin]', + '[Surprise]', '[Frown]', '[Ruthless]', '[Blush]', '[Scream]', '[Puke]', + '[Chuckle]', '[Joyful]', '[Slight]', '[Smug]', '[Hungry]', '[Drowsy]', '[Panic]', + '[Sweat]', '[Laugh]', '[Commando]', '[Determined]', '[Scold]', '[Shocked]', '[Shhh]', + '[Dizzy]', '[Tormented]', '[Toasted]', '[Skull]', '[Hammer]', '[Wave]', + '[Relief]', '[DigNose]', '[Clap]', '[Shame]', '[Trick]',' [Bah!L]','[Bah!R]', + '[Yawn]', '[Lookdown]', '[Wronged]', '[Puling]', '[Sly]', '[Kiss]', '[Uh-oh]', + '[Whimper]', '[Cleaver]', '[Melon]', '[Beer]', '[Basketball]', '[PingPong]', + '[Coffee]', '[Rice]', '[Pig]', '[Rose]', '[Wilt]', '[Lip]', '[Heart]', + '[BrokenHeart]', '[Cake]', '[Lightning]', '[Bomb]', '[Dagger]', '[Soccer]', '[Ladybug]', + '[Poop]', '[Moon]', '[Sun]', '[Gift]', '[Hug]', '[Strong]', + '[Weak]', '[Shake]', '[Victory]', '[Admire]', '[Beckon]', '[Fist]', '[Pinky]', + '[Love]', '[No]', '[OK]', '[InLove]', '[Blowkiss]', '[Waddle]', '[Tremble]', + '[Aaagh!]', '[Twirl]', '[Kotow]', '[Lookback]', '[Jump]', '[Give-in]', + u'\U0001f604', u'\U0001f637', u'\U0001f639', u'\U0001f61d', u'\U0001f632', u'\U0001f633', + u'\U0001f631', u'\U0001f64d', u'\U0001f609', u'\U0001f60c', u'\U0001f612', u'\U0001f47f', + u'\U0001f47b', u'\U0001f49d', u'\U0001f64f', u'\U0001f4aa', u'\U0001f4b5', u'\U0001f382', + u'\U0001f388', u'\U0001f4e6', + ] + BOT_ZHIHU_URL_LATEST = 'http://news-at.zhihu.com/api/4/news/latest' + BOT_ZHIHU_URL_DAILY = 'http://daily.zhihu.com/story/' + BOT_TULING_API_KEY = '55e7f30895a0a10535984bae5ad294d1' + BOT_TULING_API_URL = 'http://www.tuling123.com/openapi/api?key=%s&info=%s&userid=%s' + BOT_TULING_BOT_REPLY = u'麻烦说的清楚一点,我听不懂你在说什么' diff --git a/wxbot_project_py2.7/config/log.py b/wxbot_project_py2.7/config/log.py new file mode 100644 index 0000000..eac4933 --- /dev/null +++ b/wxbot_project_py2.7/config/log.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from constant import Constant +from config import ConfigManager +#--------------------------------------------------- +import logging +import logging.config +#=================================================== + +cm = ConfigManager() + +logging.config.fileConfig(Constant.WECHAT_CONFIG_FILE) +# create logger +Log = logging.getLogger(Constant.LOGGING_LOGGER_NAME) + +# 'application' code +# Log.debug('debug message') +# Log.info('info message') +# Log.warn('warn message') +# Log.error('error message') +# Log.critical('critical message') diff --git a/wxbot_project_py2.7/config/requirements.txt b/wxbot_project_py2.7/config/requirements.txt new file mode 100644 index 0000000..b0cf8fe --- /dev/null +++ b/wxbot_project_py2.7/config/requirements.txt @@ -0,0 +1,5 @@ +qrcode +flask +requests +requests_toolbelt +pymysql diff --git a/wxbot_project_py2.7/config/wechat.conf.bak b/wxbot_project_py2.7/config/wechat.conf.bak new file mode 100644 index 0000000..2dba3e0 --- /dev/null +++ b/wxbot_project_py2.7/config/wechat.conf.bak @@ -0,0 +1,72 @@ +[wechat] +host = wx.qq.com +uuid = +redirect_uri = +uin = +sid = +skey = +pass_ticket = +device_id = +last_login = + +[setting] +prefix = tmp_data/ +database = WeChat.db +datadir = Data/infos/ +logdir = Logs +mediapath = Data +uploaddir = Data/upload +qrcodedir = Data/qrcode +server_port = 8080 +cookie = Cookie/WeChat.cookie +contact_user = Pickle/User.pkl +contact_member_list = Pickle/MemberList.pkl +contact_group_list = Pickle/GroupList.pkl +contact_group_memeber_list = Pickle/GroupMemeberList.pkl +contact_special_users_list = Pickle/SpecialUsersList.pkl +server_mode = False +server_log_file = server.log +log_mode = False + +[mysql] +host = localhost +port = 3306 +user = root +passwd = root +database = wechat + +[loggers] +keys = root,WeChat + +[handlers] +keys = consoleHandler,fileHandler + +[formatters] +keys = simpleFormatter + +[logger_root] +level = DEBUG +handlers = consoleHandler + +[logger_WeChat] +level = DEBUG +handlers = fileHandler +qualname = WeChat +propagate = 0 + +[handler_consoleHandler] +class = StreamHandler +level = DEBUG +formatter = simpleFormatter +args = (sys.stdout,) + +[handler_fileHandler] +class = FileHandler +level = DEBUG +formatter = simpleFormatter +args = ('tmp_data/wechat.log',) + +[formatter_simpleFormatter] +format = %(asctime)s - %(name)s - %(levelname)s - %(message)s +datefmt = + diff --git a/wxbot_project_py2.7/db/__init__.py b/wxbot_project_py2.7/db/__init__.py new file mode 100644 index 0000000..5d5ff9a --- /dev/null +++ b/wxbot_project_py2.7/db/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# coding: utf-8 + +from sqlite_db import SqliteDB +from mysql_db import MysqlDB \ No newline at end of file diff --git a/wxbot_project_py2.7/db/mysql_db.py b/wxbot_project_py2.7/db/mysql_db.py new file mode 100644 index 0000000..30df872 --- /dev/null +++ b/wxbot_project_py2.7/db/mysql_db.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from config import Log +#--------------------------------------------------- +import pymysql +import threading +import traceback +#=================================================== + +def array_join(arr, c): + t = '' + for a in arr: + t += "'%s'" % str(a).replace("'","\\\'") + c + return t[:-len(c)] + +class MysqlDB(object): + """ + 修改服务器上的配置文件/etc/my.cnf,在对应位置添加以下设置: + [client] + default-character-set = utf8mb4 + + [mysql] + default-character-set = utf8mb4 + + [mysqld] + character-set-client-handshake = FALSE + character-set-server = utf8mb4 + collation-server = utf8mb4_unicode_ci + init_connect='SET NAMES utf8mb4' + """ + + def __init__(self, conf): + self.conf = conf + config = { + 'host': conf['host'], + 'port': conf['port'], + 'user': conf['user'], + 'passwd': conf['passwd'], + 'charset':'utf8mb4', # 支持1-4个字节字符 + 'cursorclass': pymysql.cursors.DictCursor + } + self.conn = pymysql.connect(**config) + self.conn.autocommit(1) + # for thread-save + self.lock = threading.Lock() + + self.create_db(conf['database']) + self.conn.select_db(conf['database']) + + # cache table cols + self.table_cols = {} + for t in self.show_tables(): + self.table_cols[t] = self.get_table_column_name(t) + + def show_database(self): + c = self.conn.cursor() + sql = 'SHOW DATABASES' + Log.debug('DB -> %s' % sql) + c.execute(sql) + return [r['Database'] for r in c.fetchall()] + + def show_tables(self): + c = self.conn.cursor() + sql = 'SHOW TABLES' + Log.debug('DB -> %s' % sql) + c.execute(sql) + return [r['Tables_in_'+self.conf['database']] for r in c.fetchall()] + + def create_db(self, db_name): + """ + @brief Creates a database + @param db_name String + """ + if self.conf['database'] not in self.show_database(): + sql = 'CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci' % db_name + Log.debug('DB -> %s' % sql) + self.execute(sql) + + def create_table(self, table, cols): + """ + @brief Creates a table in database + @param table String + @param cols String, the cols in table + """ + if table not in self.table_cols: + sql = 'CREATE TABLE IF NOT EXISTS %s(id int primary key auto_increment, %s) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci' % (table, cols) + Log.debug('DB -> %s' % sql) + self.execute(sql) + self.table_cols[table] = ['id'] + [c.strip().split(' ')[0] for c in cols.split(',')] + + def delete_table(self, table): + """ + @brief Delete a table in database + @param table String + """ + if table in self.table_cols: + sql = "DROP TABLE IF EXISTS %s" % table + Log.debug('DB -> %s' % sql) + self.execute(sql) + self.table_cols.pop(table) + + def insert(self, table, value): + """ + @brief Insert a row in table + @param table String + @param value Tuple + """ + col_name = self.table_cols[table][1:] + sql = "INSERT INTO %s(%s) VALUES (%s)" % (table, str(','.join(col_name)), array_join(value, ',')) + Log.debug('DB -> %s' % sql) + self.execute(sql) + + def insertmany(self, table, values): + """ + @brief Insert many rows in table + @param table String + @param values Array of tuple + """ + col_name = self.table_cols[table][1:] + sql = 'INSERT INTO %s(%s) VALUES (%s)' % (table, ','.join(col_name), ','.join(['%s'] * len(values[0]))) + Log.debug('DB -> %s' % sql) + self.execute(sql, values) + + def select(self, table, field='', condition=''): + """ + @brief select all result from table + @param table String + @param field String + @param condition String + @return result Tuple + """ + sql = "SELECT * FROM %s" % table + if field and condition: + sql += " WHERE %s='%s'" % (field, condition) + Log.debug('DB -> %s' % sql) + return self.execute(sql) + + def get_table_column_name(self, table): + """ + @brief select all result from table + @param table String + @return result Array + """ + c = self.conn.cursor() + c.execute("SELECT * FROM %s" % table) + names = list(map(lambda x: x[0], c.description)) + return names + + def execute(self, sql, values=None): + """ + @brief execute sql commands, return result if it has + @param sql String + @param value Tuple + @return result Array + """ + c = self.conn.cursor() + self.lock.acquire() + hasReturn = sql.lstrip().upper().startswith("SELECT") + + result = [] + try: + if values: + c.executemany(sql, values) + else: + c.execute(sql) + + if hasReturn: + result = c.fetchall() + + except Exception, e: + Log.error(traceback.format_exc()) + self.conn.rollback() + finally: + self.lock.release() + + if hasReturn: + return result + + def delete(self, table, field='', condition=''): + """ + @brief execute sql commands, return result if it has + @param table String + @param field String + @param condition String + """ + sql = "DELETE FROM %s WHERE %s=%s" % (table, field, condition) + Log.debug('DB -> %s' % sql) + self.execute(sql) + + def close(self): + """ + @brief close connection to database + """ + Log.debug('DB -> close') + # 关闭数据库连接 + self.conn.close() + + \ No newline at end of file diff --git a/wxbot_project_py2.7/db/sqlite_db.py b/wxbot_project_py2.7/db/sqlite_db.py new file mode 100644 index 0000000..5abc522 --- /dev/null +++ b/wxbot_project_py2.7/db/sqlite_db.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from config import Log +#--------------------------------------------------- +import sqlite3 +import threading +import traceback +#=================================================== + + +def _dict_factory(cursor, row): + aDict = {} + for iField, field in enumerate (cursor.description): + aDict [field [0]] = row [iField] + return aDict + + +class SqliteDB(object): + + def __init__(self, db_file): + self.db_file = db_file + self.conn = sqlite3.connect(db_file, check_same_thread=False) + # use 8-bit strings instead of unicode string + self.conn.text_factory = str + # not return a tuple but a dict with column name as key + self.conn.row_factory = _dict_factory + # for thread-save + self.lock = threading.Lock() + + def create_table(self, table, cols): + """ + @brief Creates a table in database + @param table String + @param cols String, the cols in table + """ + sql = "CREATE TABLE if not exists %s (%s);" % (table, cols) + Log.debug('DB -> %s' % sql) + self.execute(sql) + + def delete_table(self, table): + """ + @brief Delete a table in database + @param table String + """ + sql = "DROP TABLE if exists %s;" % table + Log.debug('DB -> %s' % sql) + self.execute(sql) + + def insert(self, table, value): + """ + @brief Insert a row in table + @param table String + @param value Tuple + """ + sql = ("INSERT INTO %s VALUES (" + ",".join(['?'] * len(value)) + ");") % table + Log.debug('DB -> %s' % sql) + self.execute(sql, value) + + def insertmany(self, table, values): + """ + @brief Insert many rows in table + @param table String + @param values Array of tuple + """ + c = self.conn.cursor() + self.lock.acquire() + n = len(values[0]) + sql = ("INSERT INTO %s VALUES (" + ",".join(['?'] * n) + ");") % table + Log.debug('DB -> %s' % sql) + + try: + c.executemany(sql, values) + except Exception, e: + Log.error(traceback.format_exc()) + finally: + self.lock.release() + + self.conn.commit() + + def select(self, table, field='', condition=''): + """ + @brief select all result from table + @param table String + @param field String + @param condition String + @return result Tuple + """ + result = [] + if field and condition: + cond = (condition,) + sql = "SELECT * FROM %s WHERE %s=?" % (table, field) + Log.debug('DB -> %s' % sql) + result = self.execute(sql, cond) + else: + sql = "SELECT * FROM %s" % table + Log.debug('DB -> %s' % sql) + result = self.execute(sql) + return result + + def update(self, table, dic, condition=''): + k_arr = [] + v_arr = [] + for (k, v) in dic.items(): + k_arr.append('%s=?' % k) + v_arr.append(v) + + sql = "UPDATE %s SET %s" % (table, ','.join(k_arr)) + if condition: + sql += " WHERE %s" % condition + + Log.debug('DB -> %s' % sql) + self.execute(sql, tuple(v_arr)) + + def get_table_column_name(self, table): + """ + @brief select all result from table + @param table String + @return result Array + """ + c = self.conn.cursor() + c.execute("SELECT * FROM %s" % table) + names = list(map(lambda x: x[0], c.description)) + return names + + def execute(self, sql, value=None): + """ + @brief execute sql commands, return result if it has + @param sql String + @param value Tuple + @return result Array + """ + c = self.conn.cursor() + self.lock.acquire() + hasReturn = sql.lstrip().upper().startswith("SELECT") + + try: + if value: + c.execute(sql, value) + else: + c.execute(sql) + + if hasReturn: + result = c.fetchall() + except Exception, e: + Log.error(traceback.format_exc()) + finally: + self.lock.release() + + self.conn.commit() + + if hasReturn: + return result + + def delete(self, table, field='', condition=''): + """ + @brief execute sql commands, return result if it has + @param table String + @param field String + @param condition String + """ + sql = "DELETE FROM %s WHERE %s=?" % (table, field) + Log.debug('DB -> %s' % sql) + cond = (condition,) + self.execute(sql, cond) + + def close(self): + """ + @brief close connection to database + """ + Log.debug('DB -> close') + self.conn.close() diff --git a/wxbot_project_py2.7/docker/Dockerfile b/wxbot_project_py2.7/docker/Dockerfile new file mode 100644 index 0000000..0bab668 --- /dev/null +++ b/wxbot_project_py2.7/docker/Dockerfile @@ -0,0 +1,18 @@ +FROM ubuntu:16.04 +MAINTAINER Urinx + +RUN apt-get update && \ + apt-get install -y python \ + python-dev \ + python-pip && \ + apt-get clean && \ + apt-get autoclean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ADD weixin_bot.tar.gz / +WORKDIR /weixin_bot + +RUN pip install -r config/requirements.txt +EXPOSE 80 +ENTRYPOINT ["./weixin_bot.py"] +CMD [""] diff --git a/wxbot_project_py2.7/docker/README.md b/wxbot_project_py2.7/docker/README.md new file mode 100644 index 0000000..4072aca --- /dev/null +++ b/wxbot_project_py2.7/docker/README.md @@ -0,0 +1,49 @@ +# 本地构建 wechat_bot docker 镜像 + +拉下镜像: + +```bash +docker pull ubuntu:16.04 +``` + +打包本项目,将压缩包放到`docker`目录下: + +``` +tar -czf weixin_bot.tar.gz wxbot_project_py2.7/ +``` + +切换到`docker`目录,执行`build`命令: + +```bash +docker build -t wechat-bot . +``` + +导出镜像: + +```bash +docker save wechat-bot > wechat.tar +``` + +导入镜像: + +```bash +docker load < wechat.tar +``` + +运行: + +```bash +docker run -d -P --name xxx -v /src/data/dir:/Wechat_bot/test wechat-bot +``` + +删除镜像: + +```bash +docker rmi -f wechat-bot +``` + +查看log: + +```bash +docker log wechat-bot +``` diff --git a/wxbot_project_py2.7/server/index.html b/wxbot_project_py2.7/server/index.html new file mode 100644 index 0000000..4482b9f --- /dev/null +++ b/wxbot_project_py2.7/server/index.html @@ -0,0 +1,210 @@ + + + + + WeChat Bot Server + + + + +
+
+	#####################
+	# WeChat Bot Server #
+	#####################
+
+
+## APIs
+
+- /qrcode
+  ------------------------
+  @brief      login qrcode
+  @method     get
+  @return     raw image
+  ------------------------
+
+- /runtime
+  -----------------------------
+  @brief      basic info
+  @method     get
+  @return     application/json
+              {
+                'ret': 0,
+                'runtime': '',
+                'total_size': '',
+                'db_size': '',
+                'msg_count': '',
+                'image_count': '',
+                'voice_count': '',
+                'video_count': '',
+              }
+  -----------------------------
+
+- /group_list
+  ------------------------
+  @brief      list groups
+  @method     get
+  ------------------------
+
+- /group_member_list/<g_id>
+  -----------------------------
+  @brief      list group member
+  @method     get
+  @param      g_id String
+  -----------------------------
+
+- /group_chat_log/<g_name>
+  -------------------------------
+  @brief      list group chat log
+  @method     get
+  @param      g_name String
+  -------------------------------
+
+- /upload
+  -------------------------------
+  @brief      upload a file
+  @method     get/post
+  @return     application/json
+              {
+                'ret': 0,
+                'msg': '',
+              }
+  -------------------------------
+
+- /send_msg/<to>/<msg>
+  -------------------------------------------
+  @brief      send message to user or gourp
+  @method     get
+  @param      to: String, user id or group id
+  @param      msg: String, words
+  @return     application/json
+              {
+                'ret': 0,
+              }
+  -------------------------------------------
+
+- /send_img/<to>/<img>
+  -------------------------------------------
+  @brief      send image to user or gourp
+  @method     get
+  @param      to: String, user id or group id
+  @param      img: String, image file name
+  @return     application/json
+              {
+                'ret': 0,
+              }
+  -------------------------------------------
+
+- /send_emot/<to>/<emot>
+  -------------------------------------------
+  @brief      send emotion to user or gourp
+  @method     get
+  @param      to: String, user id or group id
+  @param      emot: String, emotion file name
+  @return     application/json
+              {
+                'ret': 0,
+              }
+  -------------------------------------------
+
+- /send_file/<to>/<file>
+  -------------------------------------------
+  @brief      send emotion to user or gourp
+  @method     get
+  @param      to: String, user id or group id
+  @param      file: String, file name
+  @return     application/json
+              {
+                'ret': 0,
+              }
+  -------------------------------------------
+
+- /mass_send_msg
+  -------------------------------------------
+  @brief      send text to mass users or gourps
+  @method     post
+  @param      application/json
+              {
+                'to_list': [
+                  'group_id',
+                  ...
+                ],
+                'msg': '',
+              }
+  @return     application/json
+              {
+                'ret': 0,
+                'unsend_list': [],
+              }
+  -------------------------------------------
+
+- /mass_send_img
+  -------------------------------------------
+  @brief      send image to mass users or gourps
+  @method     post
+  @param      application/json
+              {
+                'to_list': [
+                  'group_id',
+                  ...
+                ],
+                'msg': '',
+              }
+  @return     application/json
+              {
+                'ret': 0,
+                'unsend_list': [],
+              }
+  -------------------------------------------
+
+- /mass_send_emot
+  -------------------------------------------
+  @brief      send emoticon to mass users or gourps
+  @method     post
+  @param      application/json
+              {
+                'to_list': [
+                  'group_id',
+                  ...
+                ],
+                'msg': '',
+              }
+  @return     application/json
+              {
+                'ret': 0,
+                'unsend_list': [],
+              }
+  -------------------------------------------
+
+- /mass_send_file
+  -------------------------------------------
+  @brief      send file to mass users or gourps
+  @method     post
+  @param      application/json
+              {
+                'to_list': [
+                  'group_id',
+                  ...
+                ],
+                'msg': '',
+              }
+  @return     application/json
+              {
+                'ret': 0,
+                'unsend_list': [],
+              }
+  -------------------------------------------
+
+
+ + + + diff --git a/wxbot_project_py2.7/server/upload.html b/wxbot_project_py2.7/server/upload.html new file mode 100644 index 0000000..ecb88ba --- /dev/null +++ b/wxbot_project_py2.7/server/upload.html @@ -0,0 +1,7 @@ + +Upload new File +

Upload new File

+
+

+ +

\ No newline at end of file diff --git a/__init__.py b/wxbot_project_py2.7/wechat/__init__.py similarity index 59% rename from __init__.py rename to wxbot_project_py2.7/wechat/__init__.py index 394a0a0..1877c14 100644 --- a/__init__.py +++ b/wxbot_project_py2.7/wechat/__init__.py @@ -1,2 +1,4 @@ #!/usr/bin/env python # coding: utf-8 + +from wechat import WeChat \ No newline at end of file diff --git a/wxbot_project_py2.7/wechat/utils.py b/wxbot_project_py2.7/wechat/utils.py new file mode 100644 index 0000000..06b8d48 --- /dev/null +++ b/wxbot_project_py2.7/wechat/utils.py @@ -0,0 +1,359 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from config import Log +from config import Constant +#--------------------------------------------------- +import qrcode +import re +import os +import sys +import json +import urllib +import urllib2 +import cookielib +import cPickle as pickle +import traceback +import time +import hashlib +#=================================================== + + +def _decode_data(data): + """ + @brief decode array or dict to utf-8 + @param data array or dict + @return utf-8 + """ + if isinstance(data, dict): + rv = {} + for key, value in data.iteritems(): + if isinstance(key, unicode): + key = key.encode('utf-8') + rv[key] = _decode_data(value) + return rv + elif isinstance(data, list): + rv = [] + for item in data: + item = _decode_data(item) + rv.append(item) + return rv + elif isinstance(data, unicode): + return data.encode('utf-8') + else: + return data + + +def str2qr_terminal(text): + """ + @brief convert string to qrcode matrix and outprint + @param text The string + """ + Log.debug(text) + qr = qrcode.QRCode() + qr.border = 1 + qr.add_data(text) + mat = qr.get_matrix() + print_qr(mat) + + +def str2qr_image(text, image_path): + """ + @brief convert string to qrcode image & save + @param text The string + @param image_path Save image to the path + """ + qr = qrcode.QRCode() + qr.border = 1 + qr.add_data(text) + qr.make(fit=True) + img = qr.make_image() + img.save(image_path) + + +def print_qr(mat): + for i in mat: + BLACK = Constant.QRCODE_BLACK + WHITE = Constant.QRCODE_WHITE + echo(''.join([BLACK if j else WHITE for j in i])+'\n') + + +def echo(str): + Log.info(str[:-1]) + sys.stdout.write(str) + sys.stdout.flush() + + +def run(str, func, *args): + t = time.time() + echo(str) + r = False + try: + r = func(*args) + except: + Log.error(traceback.format_exc()) + if r: + totalTime = int(time.time() - t) + echo(Constant.RUN_RESULT_SUCCESS % totalTime) + else: + echo(Constant.RUN_RESULT_FAIL) + exit() + + +def get(url, api=None): + """ + @brief http get request + @param url String + @param api wechat api + @return http response + """ + Log.debug('GET -> ' + url) + request = urllib2.Request(url=url) + request.add_header(*Constant.HTTP_HEADER_CONNECTION) + request.add_header(*Constant.HTTP_HEADER_REFERER) + if api in ['webwxgetvoice', 'webwxgetvideo']: + request.add_header(*Constant.HTTP_HEADER_RANGE) + + while True: + try: + response = urllib2.urlopen(request, timeout=30) + data = response.read() + response.close() + if api == None: + Log.debug(data) + return data + except (KeyboardInterrupt, SystemExit): + raise + except: + Log.error(traceback.format_exc()) + + time.sleep(1) + + +def post(url, params, jsonfmt=True): + """ + @brief http post request + @param url String + @param params Dict, post params + @param jsonfmt Bool, whether is json format + @return http response + """ + Log.debug('POST -> '+url) + Log.debug(params) + if jsonfmt: + request = urllib2.Request(url=url, data=json.dumps(params, ensure_ascii=False).encode('utf8')) + request.add_header(*Constant.HTTP_HEADER_CONTENTTYPE) + else: + request = urllib2.Request(url=url, data=urllib.urlencode(params)) + + while True: + try: + response = urllib2.urlopen(request, timeout=30) + data = response.read() + response.close() + + if jsonfmt: + Log.debug(data) + return json.loads(data, object_hook=_decode_data) + return data + except (KeyboardInterrupt, SystemExit): + raise + except: + Log.error(traceback.format_exc()) + + time.sleep(1) + + +def set_cookie(cookie_file): + """ + @brief Load cookie from file + @param cookie_file + @param user_agent + @return cookie, LWPCookieJar + """ + cookie = cookielib.LWPCookieJar(cookie_file) + try: + cookie.load(ignore_discard=True) + except: + Log.error(traceback.format_exc()) + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) + opener.addheaders = Constant.HTTP_HEADER_USERAGENT + urllib2.install_opener(opener) + return cookie + + +def generate_file_name(filename): + """ + @brief generate file name + @return new file name + """ + i = filename.rfind('.') + ext = filename[i:] + tmp = filename + str(int(time.time())) + hash_md5 = hashlib.md5(tmp) + return hash_md5.hexdigest() + ext + + +def save_file(filename, data, dirName): + """ + @brief Saves raw data to file. + @param filename String + @param data Binary data + @param dirName String + @return file path + """ + Log.debug('save file: ' + filename) + fn = filename + if not os.path.exists(dirName): + os.makedirs(dirName) + fn = os.path.join(dirName, filename) + with open(fn, 'wb') as f: + f.write(data) + return fn + + +def save_json(filename, data, dirName, mode='w+'): + """ + @brief Saves dict to json file. + @param filename String + @param data Dict + @param dirName String + @return file path + """ + Log.debug('save json: ' + filename) + fn = filename + if not os.path.exists(dirName): + os.makedirs(dirName) + fn = os.path.join(dirName, filename) + with open(fn, mode) as f: + f.write(json.dumps(data, indent=4)+'\n') + return fn + + +def pickle_save(data, file): + """ + @brief Use pickle to save python object into file + @param data The pyhton data + @param file The file + """ + basedir = os.path.dirname(file) + if not os.path.exists(basedir): + os.makedirs(basedir) + with open(file, 'wb') as f: + pickle.dump(data, f, pickle.HIGHEST_PROTOCOL) + + +def pickle_load(file): + """ + @brief Use pickle to load python object from file + @param file The file + @return python data + """ + if os.path.isfile(file): + with open(file, 'rb') as f: + return pickle.load(f) + return None + + +def search_content(key, content, fmat='attr'): + """ + @brief Search content from xml or html format + @param key String + @param content String + @param fmat attr + xml + @return String + """ + if fmat == 'attr': + pm = re.search(key + '\s?=\s?"([^"<]+)"', content) + if pm: + return pm.group(1) + elif fmat == 'xml': + pm = re.search('<{0}>([^<]+)'.format(key), content) + if not pm: + pm = re.search( + '<{0}><\!\[CDATA\[(.*?)\]\]>'.format(key), content) + if pm: + return pm.group(1) + return 'unknown' + + +def is_str(s): + """ + @brief Determines if string. + @param s String + @return True if string, False otherwise. + """ + return isinstance(s, basestring) + + +def trans_coding(data): + """ + @brief Transform string to unicode + @param data String + @return unicode + """ + if not data: + return data + result = None + if type(data) == unicode: + result = data + elif type(data) == str: + result = data.decode('utf-8') + return result + + +def trans_emoji(text): + """ + @brief Transform emoji html text to unicode + @param text String + @return emoji unicode + """ + def _emoji(matched): + hex = matched.group(1) + return ('\\U%08x' % int(hex, 16)).decode('unicode-escape').encode('utf-8') + + replace_t = re.sub(Constant.REGEX_EMOJI, _emoji, text) + return replace_t + + +def auto_reload(mod): + """ + @brief reload modules + @param mod: the need reload modules + """ + try: + module = sys.modules[mod] + except: + Log.error(traceback.format_exc()) + return False + + filename = module.__file__ + # .pyc 修改时间不会变 + # 所以就用 .py 的修改时间 + if filename.endswith(".pyc"): + filename = filename.replace(".pyc", ".py") + mod_time = os.path.getmtime(filename) + if not "loadtime" in module.__dict__: + module.loadtime = 0 + + try: + if mod_time > module.loadtime: + reload(module) + else: + return False + except: + Log.error(traceback.format_exc()) + return False + + module.loadtime = mod_time + + echo('[*] load \'%s\' successful.\n' % mod) + return True + + +def split_array(arr, n): + for i in xrange(0, len(arr), n): + yield arr[i:i+n] + diff --git a/wxbot_project_py2.7/wechat/wechat.py b/wxbot_project_py2.7/wechat/wechat.py new file mode 100644 index 0000000..b68ab7f --- /dev/null +++ b/wxbot_project_py2.7/wechat/wechat.py @@ -0,0 +1,697 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from utils import * +from wechat_apis import WXAPI +from config import ConfigManager +from config import Constant +from config import Log +#--------------------------------------------------- +import json +import re +import sys +import os +import time +import random +from collections import defaultdict +from datetime import timedelta +import traceback +import Queue +import threading +#=================================================== + + +class WeChat(WXAPI): + + def __str__(self): + description = \ + "=========================\n" + \ + "[#] Web WeChat\n" + \ + "[#] UUID: " + self.uuid + "\n" + \ + "[#] Uin: " + str(self.uin) + "\n" + \ + "[#] Sid: " + self.sid + "\n" + \ + "[#] Skey: " + self.skey + "\n" + \ + "[#] DeviceId: " + self.device_id + "\n" + \ + "[#] PassTicket: " + self.pass_ticket + "\n" + \ + "=========================" + return description + + def __init__(self, host='wx.qq.com'): + super(WeChat, self).__init__(host) + + self.db = None + self.save_data_folder = '' # 保存图片,语音,小视频的文件夹 + self.last_login = 0 # 上次退出的时间 + self.time_out = 5 # 同步时间间隔(单位:秒) + self.msg_handler = None + self.start_time = time.time() + self.bot = None + + cm = ConfigManager() + self.save_data_folders = cm.get_wechat_media_dir() + self.cookie_file = cm.get_cookie() + self.pickle_file = cm.get_pickle_files() + self.log_mode = cm.get('setting', 'log_mode') == 'True' + self.exit_code = 0 + + def start(self): + echo(Constant.LOG_MSG_START) + run(Constant.LOG_MSG_RECOVER, self.recover) + + timeOut = time.time() - self.last_login + echo(Constant.LOG_MSG_TRY_INIT) + if self.webwxinit(): + echo(Constant.LOG_MSG_SUCCESS) + run(Constant.LOG_MSG_RECOVER_CONTACT, self.recover_contacts) + else: + echo(Constant.LOG_MSG_FAIL) + + while True: + # first try to login by uin without qrcode + echo(Constant.LOG_MSG_ASSOCIATION_LOGIN) + if self.association_login(): + echo(Constant.LOG_MSG_SUCCESS) + else: + echo(Constant.LOG_MSG_FAIL) + # scan qrcode to login + run(Constant.LOG_MSG_GET_UUID, self.getuuid) + echo(Constant.LOG_MSG_GET_QRCODE) + self.genqrcode() + echo(Constant.LOG_MSG_SCAN_QRCODE) + + if not self.waitforlogin(): + continue + echo(Constant.LOG_MSG_CONFIRM_LOGIN) + if not self.waitforlogin(0): + continue + break + + run(Constant.LOG_MSG_LOGIN, self.login) + run(Constant.LOG_MSG_INIT, self.webwxinit) + run(Constant.LOG_MSG_STATUS_NOTIFY, self.webwxstatusnotify) + run(Constant.LOG_MSG_GET_CONTACT, self.webwxgetcontact) + echo(Constant.LOG_MSG_CONTACT_COUNT % ( + self.MemberCount, len(self.MemberList) + )) + echo(Constant.LOG_MSG_OTHER_CONTACT_COUNT % ( + len(self.GroupList), len(self.ContactList), + len(self.SpecialUsersList), len(self.PublicUsersList) + )) + run(Constant.LOG_MSG_GET_GROUP_MEMBER, self.fetch_group_contacts) + + run(Constant.LOG_MSG_SNAPSHOT, self.snapshot) + + while True: + [retcode, selector] = self.synccheck() + Log.debug('retcode: %s, selector: %s' % (retcode, selector)) + self.exit_code = int(retcode) + + if retcode == '1100': + echo(Constant.LOG_MSG_LOGOUT) + break + if retcode == '1101': + echo(Constant.LOG_MSG_LOGIN_OTHERWHERE) + break + if retcode == '1102': + echo(Constant.LOG_MSG_QUIT_ON_PHONE) + break + elif retcode == '0': + if selector == '2': + r = self.webwxsync() + if r is not None: + try: + self.handle_msg(r) + except: + Log.error(traceback.format_exc()) + elif selector == '7': + r = self.webwxsync() + elif selector == '0': + time.sleep(self.time_out) + elif selector == '4': + # 保存群聊到通讯录 + # 修改群名称 + # 新增或删除联系人 + # 群聊成员数目变化 + r = self.webwxsync() + if r is not None: + try: + self.handle_mod(r) + except: + Log.error(traceback.format_exc()) + elif selector == '3' or selector == '6': + break + else: + r = self.webwxsync() + Log.debug('webwxsync: %s\n' % json.dumps(r)) + + # 执行定时任务 + if self.msg_handler: + self.msg_handler.check_schedule_task() + + # if self.bot: + # r = self.bot.time_schedule() + # if r: + # for g in self.GroupList: + # echo('[*] 推送 -> %s: %s' % (g['NickName'], r)) + # g_id = g['UserName'] + # self.webwxsendmsg(r, g_id) + + def get_run_time(self): + """ + @brief get how long this run + @return String + """ + totalTime = int(time.time() - self.start_time) + t = timedelta(seconds=totalTime) + return '%s Day %s' % (t.days, t) + + def stop(self): + """ + @brief Save some data and use shell to kill this process + """ + run(Constant.LOG_MSG_SNAPSHOT, self.snapshot) + echo(Constant.LOG_MSG_RUNTIME % self.get_run_time()) + # close database connect + self.db.close() + + def fetch_group_contacts(self): + """ + @brief Fetches all groups contacts. + @return Bool: whether operation succeed. + @note This function must be finished in 180s + """ + Log.debug('fetch_group_contacts') + # clean database + if self.msg_handler: + self.msg_handler.clean_db() + + # sqlite + # ---------------------------------------------------- + # group max_thread_num max_fetch_group_num time(s) + # 197 10 10 108 + # 197 10 15 95 + # 197 20 10 103 + # 197 10 20 55 + # 197 5 30 39 + # 197 4 50 35 + # ---------------------------------------------------- + # mysql + # ---------------------------------------------------- + # group max_thread_num max_fetch_group_num time(s) + # 197 4 50 20 + # ---------------------------------------------------- + + max_thread_num = 4 + max_fetch_group_num = 50 + group_list_queue = Queue.Queue() + + class GroupListThread(threading.Thread): + + def __init__(self, group_list_queue, wechat): + threading.Thread.__init__(self) + self.group_list_queue = group_list_queue + self.wechat = wechat + + def run(self): + while not self.group_list_queue.empty(): + g_list = self.group_list_queue.get() + gid_list = [] + g_dict = {} + for g in g_list: + gid = g['UserName'] + gid_list.append(gid) + g_dict[gid] = g + + group_member_list = self.wechat.webwxbatchgetcontact(gid_list) + + for member_list in group_member_list: + gid = member_list['UserName'] + g = g_dict[gid] + g['MemberCount'] = member_list['MemberCount'] + g['OwnerUin'] = member_list['OwnerUin'] + self.wechat.GroupMemeberList[gid] = member_list['MemberList'] + + # 如果使用 Mysql 则可以在多线程里操作数据库 + # 否则请注释下列代码在主线程里更新群列表 + # ----------------------------------- + # 处理群成员 + # if self.wechat.msg_handler: + # self.wechat.msg_handler.handle_group_member_list(gid, member_list['MemberList']) + # ----------------------------------- + + self.group_list_queue.task_done() + + for g_list in split_array(self.GroupList, max_fetch_group_num): + group_list_queue.put(g_list) + + for i in range(max_thread_num): + t = GroupListThread(group_list_queue, self) + t.setDaemon(True) + t.start() + + group_list_queue.join() + + if self.msg_handler: + # 处理群 + if self.GroupList: + self.msg_handler.handle_group_list(self.GroupList) + + # 这个是用 sqlite 来存储群列表,sqlite 对多线程的支持不太好 + # ---------------------------------------------------- + # 处理群成员 + for (gid, member_list) in self.GroupMemeberList.items(): + self.msg_handler.handle_group_member_list(gid, member_list) + # ---------------------------------------------------- + + return True + + def snapshot(self): + """ + @brief Save basic infos for next login. + @return Bool: whether operation succeed. + """ + try: + conf = { + 'uuid': self.uuid, + 'redirect_uri': self.redirect_uri, + 'uin': self.uin, + 'sid': self.sid, + 'skey': self.skey, + 'pass_ticket': self.pass_ticket, + 'synckey': self.synckey, + 'device_id': self.device_id, + 'last_login': time.time(), + } + cm = ConfigManager() + Log.debug('save wechat config') + cm.set_wechat_config(conf) + + # save cookie + Log.debug('save cookie') + if self.cookie: + self.cookie.save(ignore_discard=True) + + # save contacts + Log.debug('save contacts') + self.save_contacts() + except Exception, e: + Log.error(traceback.format_exc()) + return False + return True + + def recover(self): + """ + @brief Recover from snapshot data. + @return Bool: whether operation succeed. + """ + cm = ConfigManager() + [self.uuid, self.redirect_uri, self.uin, + self.sid, self.skey, self.pass_ticket, + self.synckey, device_id, self.last_login] = cm.get_wechat_config() + + if device_id: + self.device_id = device_id + + self.base_request = { + 'Uin': int(self.uin), + 'Sid': self.sid, + 'Skey': self.skey, + 'DeviceID': self.device_id, + } + + # set cookie + Log.debug('set cookie') + self.cookie = set_cookie(self.cookie_file) + + return True + + def save_contacts(self): + """ + @brief Save contacts. + """ + pickle_save(self.User, self.pickle_file['User']) + pickle_save(self.MemberList, self.pickle_file['MemberList']) + pickle_save(self.GroupList, self.pickle_file['GroupList']) + pickle_save(self.GroupMemeberList, self.pickle_file['GroupMemeberList']) + pickle_save(self.SpecialUsersList, self.pickle_file['SpecialUsersList']) + + def recover_contacts(self): + """ + @brief recover contacts. + @return Bool: whether operation succeed. + """ + try: + self.User = pickle_load(self.pickle_file['User']) + self.MemberList = pickle_load(self.pickle_file['MemberList']) + self.GroupList = pickle_load(self.pickle_file['GroupList']) + self.GroupMemeberList = pickle_load(self.pickle_file['GroupMemeberList']) + self.SpecialUsersList = pickle_load(self.pickle_file['SpecialUsersList']) + return True + except Exception, e: + Log.error(traceback.format_exc()) + return False + + def handle_mod(self, r): + # ModContactCount: 变更联系人或群聊成员数目 + # ModContactList: 变更联系人或群聊列表,或群名称改变 + Log.debug('handle modify') + self.handle_msg(r) + for m in r['ModContactList']: + if m['UserName'][:2] == '@@': + # group + in_list = False + g_id = m['UserName'] + for g in self.GroupList: + # group member change + if g_id == g['UserName']: + g['MemberCount'] = m['MemberCount'] + g['NickName'] = m['NickName'] + self.GroupMemeberList[g_id] = m['MemberList'] + in_list = True + if self.msg_handler: + self.msg_handler.handle_group_member_change(g_id, m['MemberList']) + break + if not in_list: + # a new group + self.GroupList.append(m) + self.GroupMemeberList[g_id] = m['MemberList'] + if self.msg_handler: + self.msg_handler.handle_group_list_change(m) + self.msg_handler.handle_group_member_change(g_id, m['MemberList']) + + elif m['UserName'][0] == '@': + # user + in_list = False + for u in self.MemberList: + u_id = m['UserName'] + if u_id == u['UserName']: + u = m + in_list = True + break + # if don't have then add it + if not in_list: + self.MemberList.append(m) + + def handle_msg(self, r): + """ + @brief Recover from snapshot data. + @param r Dict: message json + """ + Log.debug('handle message') + if self.msg_handler: + self.msg_handler.handle_wxsync(r) + + n = len(r['AddMsgList']) + if n == 0: + return + + if self.log_mode: + echo(Constant.LOG_MSG_NEW_MSG % n) + + for msg in r['AddMsgList']: + + msgType = msg['MsgType'] + msgId = msg['MsgId'] + content = msg['Content'].replace('<', '<').replace('>', '>') + raw_msg = None + + if msgType == self.wx_conf['MSGTYPE_TEXT']: + # 地理位置消息 + if content.find('pictype=location') != -1: + location = content.split('
')[1][:-1] + raw_msg = { + 'raw_msg': msg, + 'location': location, + 'log': Constant.LOG_MSG_LOCATION % location + } + # 普通文本消息 + else: + text = content.split(':
')[-1] + raw_msg = { + 'raw_msg': msg, + 'text': text, + 'log': text.replace('
', '\n') + } + elif msgType == self.wx_conf['MSGTYPE_IMAGE']: + data = self.webwxgetmsgimg(msgId) + fn = 'img_' + msgId + '.jpg' + dir = self.save_data_folders['webwxgetmsgimg'] + path = save_file(fn, data, dir) + raw_msg = {'raw_msg': msg, + 'image': path, + 'log': Constant.LOG_MSG_PICTURE % path} + elif msgType == self.wx_conf['MSGTYPE_VOICE']: + data = self.webwxgetvoice(msgId) + fn = 'voice_' + msgId + '.mp3' + dir = self.save_data_folders['webwxgetvoice'] + path = save_file(fn, data, dir) + raw_msg = {'raw_msg': msg, + 'voice': path, + 'log': Constant.LOG_MSG_VOICE % path} + elif msgType == self.wx_conf['MSGTYPE_SHARECARD']: + info = msg['RecommendInfo'] + card = Constant.LOG_MSG_NAME_CARD % ( + info['NickName'], + info['Alias'], + info['Province'], info['City'], + Constant.LOG_MSG_SEX_OPTION[info['Sex']] + ) + namecard = '%s %s %s %s %s' % ( + info['NickName'], info['Alias'], info['Province'], + info['City'], Constant.LOG_MSG_SEX_OPTION[info['Sex']] + ) + raw_msg = { + 'raw_msg': msg, + 'namecard': namecard, + 'log': card + } + elif msgType == self.wx_conf['MSGTYPE_EMOTICON']: + url = search_content('cdnurl', content) + raw_msg = {'raw_msg': msg, + 'emoticon': url, + 'log': Constant.LOG_MSG_EMOTION % url} + elif msgType == self.wx_conf['MSGTYPE_APP']: + card = '' + # 链接, 音乐, 微博 + if msg['AppMsgType'] in [ + self.wx_conf['APPMSGTYPE_AUDIO'], + self.wx_conf['APPMSGTYPE_URL'], + self.wx_conf['APPMSGTYPE_OPEN'] + ]: + card = Constant.LOG_MSG_APP_LINK % ( + Constant.LOG_MSG_APP_LINK_TYPE[msg['AppMsgType']], + msg['FileName'], + search_content('des', content, 'xml'), + msg['Url'], + search_content('appname', content, 'xml') + ) + raw_msg = { + 'raw_msg': msg, + 'link': msg['Url'], + 'log': card + } + # 图片 + elif msg['AppMsgType'] == self.wx_conf['APPMSGTYPE_IMG']: + data = self.webwxgetmsgimg(msgId) + fn = 'img_' + msgId + '.jpg' + dir = self.save_data_folders['webwxgetmsgimg'] + path = save_file(fn, data, dir) + card = Constant.LOG_MSG_APP_IMG % ( + path, + search_content('appname', content, 'xml') + ) + raw_msg = { + 'raw_msg': msg, + 'image': path, + 'log': card + } + else: + raw_msg = { + 'raw_msg': msg, + 'log': Constant.LOG_MSG_UNKNOWN_MSG % (msgType, content) + } + elif msgType == self.wx_conf['MSGTYPE_STATUSNOTIFY']: + Log.info(Constant.LOG_MSG_NOTIFY_PHONE) + elif msgType == self.wx_conf['MSGTYPE_MICROVIDEO']: + data = self.webwxgetvideo(msgId) + fn = 'video_' + msgId + '.mp4' + dir = self.save_data_folders['webwxgetvideo'] + path = save_file(fn, data, dir) + raw_msg = {'raw_msg': msg, + 'video': path, + 'log': Constant.LOG_MSG_VIDEO % path} + elif msgType == self.wx_conf['MSGTYPE_RECALLED']: + recall_id = search_content('msgid', content, 'xml') + text = Constant.LOG_MSG_RECALL + raw_msg = { + 'raw_msg': msg, + 'text': text, + 'recall_msg_id': recall_id, + 'log': text + } + elif msgType == self.wx_conf['MSGTYPE_SYS']: + raw_msg = { + 'raw_msg': msg, + 'sys_notif': content, + 'log': content + } + elif msgType == self.wx_conf['MSGTYPE_VERIFYMSG']: + name = search_content('fromnickname', content) + raw_msg = { + 'raw_msg': msg, + 'log': Constant.LOG_MSG_ADD_FRIEND % name + } + else: + raw_msg = { + 'raw_msg': msg, + 'log': Constant.LOG_MSG_UNKNOWN_MSG % (msgType, content) + } + + isGroupMsg = '@@' in msg['FromUserName']+msg['ToUserName'] + if self.msg_handler and raw_msg: + if isGroupMsg: + # handle group messages + g_msg = self.make_group_msg(raw_msg) + self.msg_handler.handle_group_msg(g_msg) + else: + # handle personal messages + self.msg_handler.handle_user_msg(raw_msg) + + if self.log_mode: + self.show_msg(raw_msg) + + def make_group_msg(self, msg): + """ + @brief Package the group message for storage. + @param msg Dict: raw msg + @return raw_msg Dict: packged msg + """ + Log.debug('make group message') + raw_msg = { + 'raw_msg': msg['raw_msg'], + 'msg_id': msg['raw_msg']['MsgId'], + 'group_owner_uin': '', + 'group_name': '', + 'group_count': '', + 'from_user_name': msg['raw_msg']['FromUserName'], + 'to_user_name': msg['raw_msg']['ToUserName'], + 'user_attrstatus': '', + 'user_display_name': '', + 'user_nickname': '', + 'msg_type': msg['raw_msg']['MsgType'], + 'text': '', + 'link': '', + 'image': '', + 'video': '', + 'voice': '', + 'emoticon': '', + 'namecard': '', + 'location': '', + 'recall_msg_id': '', + 'sys_notif': '', + 'time': '', + 'timestamp': '', + 'log': '', + } + content = msg['raw_msg']['Content'].replace( + '<', '<').replace('>', '>') + + group = None + src = None + + if msg['raw_msg']['FromUserName'][:2] == '@@': + # 接收到来自群的消息 + g_id = msg['raw_msg']['FromUserName'] + group = self.get_group_by_id(g_id) + + if re.search(":
", content, re.IGNORECASE): + u_id = content.split(':
')[0] + src = self.get_group_user_by_id(u_id, g_id) + + elif msg['raw_msg']['ToUserName'][:2] == '@@': + # 自己发给群的消息 + g_id = msg['raw_msg']['ToUserName'] + u_id = msg['raw_msg']['FromUserName'] + src = self.get_group_user_by_id(u_id, g_id) + group = self.get_group_by_id(g_id) + + if src: + raw_msg['user_attrstatus'] = src['AttrStatus'] + raw_msg['user_display_name'] = src['DisplayName'] + raw_msg['user_nickname'] = src['NickName'] + if group: + raw_msg['group_count'] = group['MemberCount'] + raw_msg['group_owner_uin'] = group['OwnerUin'] + raw_msg['group_name'] = group['ShowName'] + + raw_msg['timestamp'] = msg['raw_msg']['CreateTime'] + t = time.localtime(float(raw_msg['timestamp'])) + raw_msg['time'] = time.strftime("%Y-%m-%d %T", t) + + for key in [ + 'text', 'link', 'image', 'video', 'voice', + 'emoticon', 'namecard', 'location', 'log', + 'recall_msg_id', 'sys_notif' + ]: + if key in msg: + raw_msg[key] = msg[key] + + return raw_msg + + def show_msg(self, message): + """ + @brief Log the message to stdout + @param message Dict + """ + msg = message + src = None + dst = None + group = None + + if msg and msg['raw_msg']: + + content = msg['raw_msg']['Content'] + content = content.replace('<', '<').replace('>', '>') + msg_id = msg['raw_msg']['MsgId'] + + if msg['raw_msg']['FromUserName'][:2] == '@@': + # 接收到来自群的消息 + g_id = msg['raw_msg']['FromUserName'] + group = self.get_group_by_id(g_id) + + if re.search(":
", content, re.IGNORECASE): + u_id = content.split(':
')[0] + src = self.get_group_user_by_id(u_id, g_id) + dst = {'ShowName': 'GROUP'} + else: + u_id = msg['raw_msg']['ToUserName'] + src = {'ShowName': 'SYSTEM'} + dst = self.get_group_user_by_id(u_id, g_id) + elif msg['raw_msg']['ToUserName'][:2] == '@@': + # 自己发给群的消息 + g_id = msg['raw_msg']['ToUserName'] + u_id = msg['raw_msg']['FromUserName'] + group = self.get_group_by_id(g_id) + src = self.get_group_user_by_id(u_id, g_id) + dst = {'ShowName': 'GROUP'} + else: + # 非群聊消息 + src = self.get_user_by_id(msg['raw_msg']['FromUserName']) + dst = self.get_user_by_id(msg['raw_msg']['ToUserName']) + + if group: + echo('%s |%s| %s -> %s: %s\n' % ( + msg_id, + trans_emoji(group['ShowName']), + trans_emoji(src['ShowName']), + dst['ShowName'], + trans_emoji(msg['log']) + )) + else: + echo('%s %s -> %s: %s\n' % ( + msg_id, + trans_emoji(src['ShowName']), + trans_emoji(dst['ShowName']), + trans_emoji(msg['log']) + )) diff --git a/wxbot_project_py2.7/wechat/wechat_apis.py b/wxbot_project_py2.7/wechat/wechat_apis.py new file mode 100644 index 0000000..6f02c42 --- /dev/null +++ b/wxbot_project_py2.7/wechat/wechat_apis.py @@ -0,0 +1,969 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from utils import * +from config import Constant +from config import Log +#--------------------------------------------------- +import sys +import os +import cookielib +import random +import requests +import time +import xml.dom.minidom +# for media upload +import mimetypes +from requests_toolbelt.multipart.encoder import MultipartEncoder +#=================================================== + + +class WXAPI(object): + + def __init__(self, host): + self.wx_host = host + self.wx_filehost = '' + self.wx_conf = {} + # jsLogin时这个appid只能使用: wx782c26e4c19acffb + self.appid = Constant.API_APPID + self.uuid = '' + self.redirect_uri = '' + self.skey = '' + self.sid = '' + self.uin = '' + self.pass_ticket = '' + self.base_request = {} + self.synckey_dic = {} + self.synckey = '' + self.device_id = 'e' + repr(random.random())[2:17] + # device_id: 登录手机设备 + # web wechat 的格式为: e123456789012345 (e+15位随机数) + # mobile wechat 的格式为: A1234567890abcde (A+15位随机数字或字母) + self.user_agent = Constant.API_USER_AGENT + self.cookie = None + + self.conf_factory() + + self.User = [] # 登陆账号信息 + self.MemberList = [] # 好友+群聊+公众号+特殊账号 + self.MemberCount = 0 + self.ContactList = [] # 好友 + self.GroupList = [] # 群 + self.GroupMemeberList = {} # 群聊成员字典 + # "group_id": [ + # {member}, ... + # ] + self.PublicUsersList = [] # 公众号/服务号 + self.SpecialUsersList = [] # 特殊账号 + + self.media_count = 0 + + def conf_factory(self): + e = self.wx_host # wx.qq.com + t, o, n = "login.weixin.qq.com", "file.wx.qq.com", "webpush.weixin.qq.com" + + if e.find("wx2.qq.com") > -1: + t, o, n = "login.wx2.qq.com", "file.wx2.qq.com", "webpush.wx2.qq.com" + elif e.find("wx8.qq.com") > -1: + t, o, n = "login.wx8.qq.com", "file.wx8.qq.com", "webpush.wx8.qq.com" + elif e.find("qq.com") > -1: + t, o, n = "login.wx.qq.com", "file.wx.qq.com", "webpush.wx.qq.com" + elif e.find("web2.wechat.com") > -1: + t, o, n = "login.web2.wechat.com", "file.web2.wechat.com", "webpush.web2.wechat.com" + elif e.find("wechat.com") > -1: + t, o, n = "login.web.wechat.com", "file.web.wechat.com", "webpush.web.wechat.com" + + self.wx_filehost = o + conf = { + 'LANG': Constant.API_LANG, + 'SpecialUsers': Constant.API_SPECIAL_USER, + 'API_jsLogin': "https://" + t + "/jslogin", + 'API_qrcode': "https://login.weixin.qq.com/l/", + 'API_qrcode_img': "https://login.weixin.qq.com/qrcode/", + 'API_login': "https://" + t + "/cgi-bin/mmwebwx-bin/login", + 'API_synccheck': "https://" + n + "/cgi-bin/mmwebwx-bin/synccheck", + 'API_webwxdownloadmedia': "https://" + o + "/cgi-bin/mmwebwx-bin/webwxgetmedia", + 'API_webwxuploadmedia': "https://" + o + "/cgi-bin/mmwebwx-bin/webwxuploadmedia", + 'API_webwxpreview': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxpreview", + 'API_webwxinit': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxinit", + 'API_webwxgetcontact': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgetcontact", + 'API_webwxsync': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsync", + 'API_webwxbatchgetcontact': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxbatchgetcontact", + 'API_webwxgeticon': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgeticon", + 'API_webwxsendmsg': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsendmsg", + 'API_webwxsendmsgimg': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsendmsgimg", + 'API_webwxsendmsgvedio': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsendvideomsg", + 'API_webwxsendemoticon': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsendemoticon", + 'API_webwxsendappmsg': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsendappmsg", + 'API_webwxgetheadimg': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgetheadimg", + 'API_webwxgetmsgimg': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgetmsgimg", + 'API_webwxgetmedia': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgetmedia", + 'API_webwxgetvideo': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgetvideo", + 'API_webwxlogout': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxlogout", + 'API_webwxgetvoice': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxgetvoice", + 'API_webwxupdatechatroom': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxupdatechatroom", + 'API_webwxcreatechatroom': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxcreatechatroom", + 'API_webwxstatusnotify': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxstatusnotify", + 'API_webwxcheckurl': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxcheckurl", + 'API_webwxverifyuser': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxverifyuser", + 'API_webwxfeedback': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsendfeedback", + 'API_webwxreport': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxstatreport", + 'API_webwxsearch': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxsearchcontact", + 'API_webwxoplog': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxoplog", + 'API_checkupload': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxcheckupload", + 'API_webwxrevokemsg': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxrevokemsg", + 'API_webwxpushloginurl': "https://" + e + "/cgi-bin/mmwebwx-bin/webwxpushloginurl", + 'CONTACTFLAG_CONTACT': 1, + 'CONTACTFLAG_CHATCONTACT': 2, + 'CONTACTFLAG_CHATROOMCONTACT': 4, + 'CONTACTFLAG_BLACKLISTCONTACT': 8, + 'CONTACTFLAG_DOMAINCONTACT': 16, + 'CONTACTFLAG_HIDECONTACT': 32, + 'CONTACTFLAG_FAVOURCONTACT': 64, + 'CONTACTFLAG_3RDAPPCONTACT': 128, + 'CONTACTFLAG_SNSBLACKLISTCONTACT': 256, + 'CONTACTFLAG_NOTIFYCLOSECONTACT': 512, + 'CONTACTFLAG_TOPCONTACT': 2048, + 'MSGTYPE_TEXT': 1, + 'MSGTYPE_IMAGE': 3, + 'MSGTYPE_VOICE': 34, + 'MSGTYPE_VIDEO': 43, + 'MSGTYPE_MICROVIDEO': 62, + 'MSGTYPE_EMOTICON': 47, + 'MSGTYPE_APP': 49, + 'MSGTYPE_VOIPMSG': 50, + 'MSGTYPE_VOIPNOTIFY': 52, + 'MSGTYPE_VOIPINVITE': 53, + 'MSGTYPE_LOCATION': 48, + 'MSGTYPE_STATUSNOTIFY': 51, + 'MSGTYPE_SYSNOTICE': 9999, + 'MSGTYPE_POSSIBLEFRIEND_MSG': 40, + 'MSGTYPE_VERIFYMSG': 37, + 'MSGTYPE_SHARECARD': 42, + 'MSGTYPE_SYS': 10000, + 'MSGTYPE_RECALLED': 10002, + 'APPMSGTYPE_TEXT': 1, + 'APPMSGTYPE_IMG': 2, + 'APPMSGTYPE_AUDIO': 3, + 'APPMSGTYPE_VIDEO': 4, + 'APPMSGTYPE_URL': 5, + 'APPMSGTYPE_ATTACH': 6, + 'APPMSGTYPE_OPEN': 7, + 'APPMSGTYPE_EMOJI': 8, + 'APPMSGTYPE_VOICE_REMIND': 9, + 'APPMSGTYPE_SCAN_GOOD': 10, + 'APPMSGTYPE_GOOD': 13, + 'APPMSGTYPE_EMOTION': 15, + 'APPMSGTYPE_CARD_TICKET': 16, + 'APPMSGTYPE_REALTIME_SHARE_LOCATION': 17, + 'APPMSGTYPE_TRANSFERS': 2e3, + 'APPMSGTYPE_RED_ENVELOPES': 2001, + 'APPMSGTYPE_READER_TYPE': 100001, + 'UPLOAD_MEDIA_TYPE_IMAGE': 1, + 'UPLOAD_MEDIA_TYPE_VIDEO': 2, + 'UPLOAD_MEDIA_TYPE_AUDIO': 3, + 'UPLOAD_MEDIA_TYPE_ATTACHMENT': 4, + } + self.wx_conf = conf + + def getuuid(self): + """ + @brief Gets the uuid just used for login. + @return Bool: whether operation succeed. + """ + url = self.wx_conf['API_jsLogin'] + params = { + 'appid': self.appid, + 'fun': 'new', + 'lang': self.wx_conf['LANG'], + '_': int(time.time()), + } + data = post(url, params, False) + regx = r'window.QRLogin.code = (\d+); window.QRLogin.uuid = "(\S+?)"' + pm = re.search(regx, data) + if pm: + code = pm.group(1) + self.uuid = pm.group(2) + return code == '200' + return False + + def genqrcode(self): + """ + @brief outprint the qrcode to stdout on macos/linux + or open image on windows + """ + if sys.platform.startswith('win'): + url = self.wx_conf['API_qrcode_img'] + self.uuid + params = { + 't': 'webwx', + '_': int(time.time()) + } + data = post(url, params, False) + if data == '': + return + qrcode_path = save_file('qrcode.jpg', data, './') + os.startfile(qrcode_path) + else: + str2qr_terminal(self.wx_conf['API_qrcode'] + self.uuid) + + def waitforlogin(self, tip=1): + """ + @brief wait for scaning qrcode to login + @param tip 1: wait for scan qrcode + 0: wait for confirm + @return Bool: whether operation succeed + """ + time.sleep(tip) + url = self.wx_conf['API_login'] + '?tip=%s&uuid=%s&_=%s' % ( + tip, self.uuid, int(time.time())) + data = get(url) + pm = re.search(r'window.code=(\d+);', data) + code = pm.group(1) + + if code == '201': + return True + elif code == '200': + pm = re.search(r'window.redirect_uri="(\S+?)";', data) + r_uri = pm.group(1) + '&fun=new' + self.redirect_uri = r_uri + self.wx_host = r_uri.split('://')[1].split('/')[0] + self.conf_factory() + return True + elif code == '408': + echo(Constant.LOG_MSG_WAIT_LOGIN_ERR1) + else: + echo(Constant.LOG_MSG_WAIT_LOGIN_ERR2) + return False + + def login(self): + """ + @brief login + redirect_uri 有效时间是从扫码成功后算起, + 大概是 300 秒,在此期间可以重新登录,但获取的联系人和群ID会改变 + @return Bool: whether operation succeed + """ + data = get(self.redirect_uri) + doc = xml.dom.minidom.parseString(data) + root = doc.documentElement + + for node in root.childNodes: + if node.nodeName == 'ret': + if node.childNodes[0].data != "0": + return False + elif node.nodeName == 'skey': + self.skey = node.childNodes[0].data + elif node.nodeName == 'wxsid': + self.sid = node.childNodes[0].data + elif node.nodeName == 'wxuin': + self.uin = node.childNodes[0].data + elif node.nodeName == 'pass_ticket': + self.pass_ticket = node.childNodes[0].data + + if '' in (self.skey, self.sid, self.uin, self.pass_ticket): + return False + + self.base_request = { + 'Uin': int(self.uin), + 'Sid': self.sid, + 'Skey': self.skey, + 'DeviceID': self.device_id, + } + + return True + + def webwxinit(self): + """ + @brief wechat initial + 掉线后 300 秒可以重新使用此 api 登录 + 获取的联系人和群ID保持不变 + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxinit'] + \ + '?pass_ticket=%s&skey=%s&r=%s' % ( + self.pass_ticket, self.skey, int(time.time()) + ) + params = { + 'BaseRequest': self.base_request + } + dic = post(url, params) + self.User = dic['User'] + self.make_synckey(dic) + + return dic['BaseResponse']['Ret'] == 0 + + def webwxstatusnotify(self): + """ + @brief notify the mobile phone, this not necessary + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxstatusnotify'] + \ + '?lang=%s&pass_ticket=%s' % ( + self.wx_conf['LANG'], self.pass_ticket + ) + params = { + 'BaseRequest': self.base_request, + "Code": 3, + "FromUserName": self.User['UserName'], + "ToUserName": self.User['UserName'], + "ClientMsgId": int(time.time()) + } + dic = post(url, params) + + return dic['BaseResponse']['Ret'] == 0 + + def webwxgetcontact(self): + """ + @brief get all contacts: people, group, public user, special user + @return Bool: whether operation succeed + """ + SpecialUsers = self.wx_conf['SpecialUsers'] + url = self.wx_conf['API_webwxgetcontact'] + \ + '?pass_ticket=%s&skey=%s&r=%s' % ( + self.pass_ticket, self.skey, int(time.time()) + ) + dic = post(url, {}) + + self.MemberCount = dic['MemberCount'] + self.MemberList = dic['MemberList'] + ContactList = self.MemberList[:] + GroupList = self.GroupList[:] + PublicUsersList = self.PublicUsersList[:] + SpecialUsersList = self.SpecialUsersList[:] + + for i in xrange(len(ContactList) - 1, -1, -1): + Contact = ContactList[i] + if Contact['VerifyFlag'] & 8 != 0: # 公众号/服务号 + ContactList.remove(Contact) + self.PublicUsersList.append(Contact) + elif Contact['UserName'] in SpecialUsers: # 特殊账号 + ContactList.remove(Contact) + self.SpecialUsersList.append(Contact) + elif Contact['UserName'].find('@@') != -1: # 群聊 + ContactList.remove(Contact) + self.GroupList.append(Contact) + elif Contact['UserName'] == self.User['UserName']: # 自己 + ContactList.remove(Contact) + self.ContactList = ContactList + + return True + + def webwxbatchgetcontact(self, gid_list): + """ + @brief get group contacts + @param gid_list, The list of group id + @return List, list of group contacts + """ + url = self.wx_conf['API_webwxbatchgetcontact'] + \ + '?type=ex&r=%s&pass_ticket=%s' % ( + int(time.time()), self.pass_ticket + ) + params = { + 'BaseRequest': self.base_request, + "Count": len(gid_list), + "List": [{"UserName": gid, "EncryChatRoomId": ""} for gid in gid_list] + } + dic = post(url, params) + return dic['ContactList'] + + def synccheck(self): + """ + @brief check whether there's a message + @return [retcode, selector] + retcode: 0 successful + 1100 logout + 1101 login otherwhere + selector: 0 nothing + 2 message + 6 unkonwn + 7 webwxsync + """ + params = { + 'r': int(time.time()), + 'sid': self.sid, + 'uin': self.uin, + 'skey': self.skey, + 'deviceid': self.device_id, + 'synckey': self.synckey, + '_': int(time.time()), + } + url = self.wx_conf['API_synccheck'] + '?' + urllib.urlencode(params) + data = get(url) + reg = r'window.synccheck={retcode:"(\d+)",selector:"(\d+)"}' + pm = re.search(reg, data) + retcode = pm.group(1) + selector = pm.group(2) + return [retcode, selector] + + def webwxsync(self): + """ + @brief sync the messages + @return Dict{} + """ + url = self.wx_conf['API_webwxsync'] + \ + '?sid=%s&skey=%s&pass_ticket=%s' % ( + self.sid, self.skey, self.pass_ticket + ) + params = { + 'BaseRequest': self.base_request, + 'SyncKey': self.synckey_dic, + 'rr': ~int(time.time()) + } + dic = post(url, params) + + if dic['BaseResponse']['Ret'] == 0: + self.make_synckey(dic) + return dic + + def webwxgetmsgimg(self, msgid): + """ + @brief get image in message + @param msgid The id of message + @return binary data of image + """ + url = self.wx_conf['API_webwxgetmsgimg'] + \ + '?MsgID=%s&skey=%s' % (msgid, self.skey) + data = get(url, api='webwxgetmsgimg') + return data + + def webwxgetvoice(self, msgid): + """ + @brief get voice in message + @param msgid The id of message + @return binary data of voice + """ + url = self.wx_conf['API_webwxgetvoice'] + \ + '?msgid=%s&skey=%s' % (msgid, self.skey) + data = get(url, api='webwxgetvoice') + return data + + def webwxgetvideo(self, msgid): + """ + @brief get video in message + @param msgid The id of message + @return binary data of video + """ + url = self.wx_conf['API_webwxgetvideo'] + \ + '?msgid=%s&skey=%s' % (msgid, self.skey) + data = get(url, api='webwxgetvideo') + return data + + def webwxgeticon(self, id): + """ + @brief get user small icon + @param id String + @return binary data of icon + """ + url = self.wx_conf['API_webwxgeticon'] + \ + '?username=%s&skey=%s' % (id, self.skey) + data = get(url, api='webwxgeticon') + return data + + def webwxgetheadimg(self, id): + """ + @brief get user head image + @param id String + @return binary data of image + """ + url = self.wx_conf['API_webwxgetheadimg'] + \ + '?username=%s&skey=%s' % (id, self.skey) + data = get(url, api='webwxgetheadimg') + return data + + def webwxsendmsg(self, word, to='filehelper'): + """ + @brief send text message + @param word String + @param to User id + @return dic Dict + """ + url = self.wx_conf['API_webwxsendmsg'] + \ + '?pass_ticket=%s' % (self.pass_ticket) + clientMsgId = str(int(time.time() * 1000)) + \ + str(random.random())[:5].replace('.', '') + params = { + 'BaseRequest': self.base_request, + 'Msg': { + "Type": 1, + "Content": trans_coding(word), + "FromUserName": self.User['UserName'], + "ToUserName": to, + "LocalID": clientMsgId, + "ClientMsgId": clientMsgId + } + } + dic = post(url, params) + return dic + + def webwxuploadmedia(self, file_path): + """ + @brief upload image + @param file_path String + @return Dict: json + """ + url = self.wx_conf['API_webwxuploadmedia'] + '?f=json' + # 计数器 + self.media_count = self.media_count + 1 + fn = file_path + # mime_type: + # 'application/pdf' + # 'image/jpeg' + # 'image/png' + # ... + mime_type = mimetypes.guess_type(fn, strict=False)[0] + if not mime_type: + mime_type = 'text/plain' + # 文档格式 + # 微信服务器目前应该支持3种类型: + # pic 直接显示,包含图片,表情 + # video 不清楚 + # doc 显示为文件,包含PDF等 + media_type = 'pic' if mime_type.split('/')[0] == 'image' else 'doc' + time_format = "%a %b %d %Y %T GMT%z (%Z)" + last_modifie_date = time.strftime(time_format, time.localtime()) + file_size = os.path.getsize(fn) + pass_ticket = self.pass_ticket + client_media_id = str(int(time.time() * 1000)) + \ + str(random.random())[:5].replace('.', '') + + webwx_data_ticket = '' + for item in self.cookie: + if item.name == 'webwx_data_ticket': + webwx_data_ticket = item.value + break + if (webwx_data_ticket == ''): + Log.error("No Cookie\n") + return None + + uploadmediarequest = json.dumps({ + "BaseRequest": self.base_request, + "ClientMediaId": client_media_id, + "TotalLen": file_size, + "StartPos": 0, + "DataLen": file_size, + "MediaType": 4 + }, ensure_ascii=False).encode('utf8') + + multipart_encoder = MultipartEncoder( + fields={ + 'id': 'WU_FILE_' + str(self.media_count), + 'name': fn, + 'type': mime_type, + 'lastModifieDate': last_modifie_date, + 'size': str(file_size), + 'mediatype': media_type, + 'uploadmediarequest': uploadmediarequest, + 'webwx_data_ticket': webwx_data_ticket, + 'pass_ticket': pass_ticket, + 'filename': ( + fn, + open(fn, 'rb'), + mime_type.split('/')[1] + ) + }, + boundary=( + '-----------------------------' + '1575017231431605357584454111' + ) + ) + + headers = { + 'Host': self.wx_filehost, + 'User-Agent': self.user_agent, + 'Accept': ( + 'text/html,application/xhtml+xml,' + 'application/xml;q=0.9,*/*;q=0.8' + ), + 'Accept-Language': 'en-US,en;q=0.5', + 'Accept-Encoding': 'gzip, deflate', + 'Referer': 'https://' + self.wx_host, + 'Content-Type': multipart_encoder.content_type, + 'Origin': 'https://' + self.wx_host, + 'Connection': 'keep-alive', + 'Pragma': 'no-cache', + 'Cache-Control': 'no-cache', + } + + r = requests.post(url, data=multipart_encoder, headers=headers) + if dic['BaseResponse']['Ret'] == 0: + return dic + return None + + def webwxsendmsgimg(self, user_id, media_id): + """ + @brief send image + @param user_id String + @param media_id String + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxsendmsgimg'] + \ + '?fun=async&f=json&pass_ticket=%s' % self.pass_ticket + clientMsgId = str(int(time.time() * 1000)) + \ + str(random.random())[:5].replace('.', '') + data_json = { + "BaseRequest": self.base_request, + "Msg": { + "Type": 3, + "MediaId": media_id, + "FromUserName": self.User['UserName'], + "ToUserName": user_id, + "LocalID": clientMsgId, + "ClientMsgId": clientMsgId + } + } + r = post(url, data_json) + return dic['BaseResponse']['Ret'] == 0 + + def webwxsendemoticon(self, user_id, media_id): + """ + @brief send image + @param user_id String + @param media_id String + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxsendemoticon'] + \ + '?fun=sys&f=json&pass_ticket=%s' % self.pass_ticket + clientMsgId = str(int(time.time() * 1000)) + \ + str(random.random())[:5].replace('.', '') + data_json = { + "BaseRequest": self.base_request, + "Msg": { + "Type": 47, + "EmojiFlag": 2, + "MediaId": media_id, + "FromUserName": self.User['UserName'], + "ToUserName": user_id, + "LocalID": clientMsgId, + "ClientMsgId": clientMsgId + } + } + r = post(url, data_json) + return dic['BaseResponse']['Ret'] == 0 + + def webwxsendappmsg(self, user_id, data): + """ + @brief send app msg + @param user_id String + @param data Dict + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxsendappmsg'] + \ + '?fun=sys&f=json&pass_ticket=%s' % self.pass_ticket + clientMsgId = str(int(time.time() * 1000)) + \ + str(random.random())[:5].replace('.', '') + content = ''.join([ + "" % data['appid'], # 可使用其它AppID + "%s" % data['title'], + "", + "", + "%d" % data['type'], + "", + "", + "", + "", + "%d" % data['totallen'], + "%s" % data['attachid'], + "%s" % data['fileext'], + "", + "", + "", + ]) + data_json = { + "BaseRequest": self.base_request, + "Msg": { + "Type": data['type'], + "Content": content, + "FromUserName": self.User['UserName'], + "ToUserName": user_id, + "LocalID": clientMsgId, + "ClientMsgId": clientMsgId + }, + "Scene": 0 + } + r = post(url, data_json) + return dic['BaseResponse']['Ret'] == 0 + + def webwxcreatechatroom(self, uid_arr): + """ + @brief create a chat group + @param uid_arr [String] + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxcreatechatroom'] + '?r=%s' % int(time.time()) + params = { + 'BaseRequest': self.base_request, + 'Topic': '', + 'MemberCount': len(uid_arr), + 'MemberList': [{'UserName': uid} for uid in uid_arr], + } + dic = post(url, params) + return dic['BaseResponse']['Ret'] == 0 + + def webwxupdatechatroom(self, add_arr, del_arr, invite_arr): + """ + @brief add/delete/invite member in chat group + @param add_arr [uid: String] + @param del_arr [uid: String] + @param invite_arr [uid: String] + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxupdatechatroom'] + '?r=%s' % int(time.time()) + params = { + 'BaseRequest': self.base_request, + 'ChatRoomName': '', + 'NewTopic': '', + 'AddMemberList': add_arr, + 'DelMemberList': del_arr, + 'InviteMemberList': invite_arr, + } + dic = post(url, params) + return dic['BaseResponse']['Ret'] == 0 + + def webwxrevokemsg(self, msgid, user_id, client_msgid): + """ + @brief revoke a message + @param msgid String + @param user_id String + @param client_msgid String + @return Bool: whether operation succeed + """ + url = self.wx_conf['API_webwxrevokemsg'] + '?r=%s' % int(time.time()) + params = { + 'BaseRequest': self.base_request, + 'SvrMsgId': msgid, + 'ToUserName': user_id, + 'ClientMsgId': client_msgid + } + dic = post(url, params) + return dic['BaseResponse']['Ret'] == 0 + + def webwxpushloginurl(self, uin): + """ + @brief push a login confirm alert to mobile device + @param uin String + @return dic Dict + """ + url = self.wx_conf['API_webwxpushloginurl'] + '?uin=%s' % uin + dic = eval(get(url)) + return dic + + def association_login(self): + """ + @brief login without scan qrcode + @return Bool: whether operation succeed + """ + if self.uin != '': + dic = self.webwxpushloginurl(self.uin) + if dic['ret'] == '0': + self.uuid = dic['uuid'] + return True + return False + + def send_text(self, user_id, text): + """ + @brief send text + @param user_id String + @param text String + @return Bool: whether operation succeed + """ + dic = self.webwxsendmsg(text, user_id) + return dic['BaseResponse']['Ret'] == 0 + + def send_img(self, user_id, file_path): + """ + @brief send image + @param user_id String + @param file_path String + @return Bool: whether operation succeed + """ + response = self.webwxuploadmedia(file_path) + media_id = "" + if response is not None: + media_id = response['MediaId'] + return self.webwxsendmsgimg(user_id, media_id) + + def send_emot(self, user_id, file_path): + """ + @brief send emotion + @param user_id String + @param file_path String + @return Bool: whether operation succeed + """ + response = self.webwxuploadmedia(file_path) + media_id = "" + if response is not None: + media_id = response['MediaId'] + return self.webwxsendemoticon(user_id, media_id) + + def send_file(self, user_id, file_path): + """ + @brief send file + @param user_id String + @param file_path String + @return Bool: whether operation succeed + """ + title = file_path.split('/')[-1] + data = { + 'appid': Constant.API_WXAPPID, + 'title': title, + 'totallen': '', + 'attachid': '', + 'type': self.wx_conf['APPMSGTYPE_ATTACH'], + 'fileext': title.split('.')[-1], + } + + response = self.webwxuploadmedia(file_path) + if response is not None: + data['totallen'] = response['StartPos'] + data['attachid'] = response['MediaId'] + else: + Log.error('File upload error') + + return self.webwxsendappmsg(user_id, data) + + def make_synckey(self, dic): + self.synckey_dic = dic['SyncKey'] + + def foo(x): + return str(x['Key']) + '_' + str(x['Val']) + + # synckey for synccheck + self.synckey = '|'.join( + [foo(keyVal) for keyVal in self.synckey_dic['List']]) + + def revoke_msg(self, msgid, user_id, client_msgid): + """ + @brief revoke a message + @param msgid String + @param user_id String + @param client_msgid String + @return Bool: whether operation succeed + """ + return self.webwxrevokemsg(msgid, user_id, client_msgid) + + # ----------------------------------------------------- + # The following is getting user & group infomation apis + def get_user_by_id(self, user_id): + """ + @brief get all type of name by user id + @param user_id The id of user + @return Dict: { + 'UserName' # 微信动态ID + 'RemarkName' # 备注 + 'NickName' # 微信昵称 + 'ShowName' # Log显示用的 + } + """ + UnknownPeople = Constant.LOG_MSG_UNKNOWN_NAME + user_id + name = { + 'UserName': user_id, + 'RemarkName': '', + 'NickName': '', + 'ShowName': '', + } + name['ShowName'] = UnknownPeople + + # yourself + if user_id == self.User['UserName']: + name['RemarkName'] = self.User['RemarkName'] + name['NickName'] = self.User['NickName'] + name['ShowName'] = name['NickName'] + else: + # 联系人 + for member in self.MemberList: + if member['UserName'] == user_id: + r, n = member['RemarkName'], member['NickName'] + name['RemarkName'] = r + name['NickName'] = n + name['ShowName'] = r if r else n + break + # 特殊帐号 + for member in self.SpecialUsersList: + if member['UserName'] == user_id: + name['RemarkName'] = user_id + name['NickName'] = user_id + name['ShowName'] = user_id + break + + return name + + def get_group_user_by_id(self, user_id, group_id): + """ + @brief get group user by user id + @param user_id The id of user + @param group_id The id of group + @return Dict: { + 'UserName' # 微信动态ID + 'NickName' # 微信昵称 + 'DisplayName' # 群聊显示名称 + 'ShowName' # Log显示用的 + 'AttrStatus' # 群用户id + } + """ + UnknownPeople = Constant.LOG_MSG_UNKNOWN_NAME + user_id + name = { + 'UserName': user_id, + 'NickName': '', + 'DisplayName': '', + 'ShowName': '', + 'AttrStatus': '', + } + name['ShowName'] = UnknownPeople + + # 群友 + if group_id in self.GroupMemeberList: + for member in self.GroupMemeberList[group_id]: + if member['UserName'] == user_id: + n, d = member['NickName'], member['DisplayName'] + name['NickName'] = n + name['DisplayName'] = d + name['AttrStatus'] = member['AttrStatus'] + name['ShowName'] = d if d else n + break + + return name + + def get_group_by_id(self, group_id): + """ + @brief get basic info by group id + @param group_id The id of group + @return Dict: { + 'UserName' # 微信动态ID + 'NickName' # 微信昵称 + 'DisplayName' # 群聊显示名称 + 'ShowName' # Log显示用的 + 'OwnerUin' # 群主ID + 'MemberCount' # 群人数 + } + """ + UnknownGroup = Constant.LOG_MSG_UNKNOWN_GROUP_NAME + group_id + group = { + 'UserName': group_id, + 'NickName': '', + 'DisplayName': '', + 'ShowName': '', + 'OwnerUin': '', + 'MemberCount': '', + } + + for member in self.GroupList: + if member['UserName'] == group_id: + group['NickName'] = member['NickName'] + group['DisplayName'] = member.get('DisplayName', '') + group['ShowName'] = member.get('NickName', UnknownGroup) + group['OwnerUin'] = member.get('OwnerUin', '') + group['MemberCount'] = member['MemberCount'] + break + + return group + + def get_user_id(self, name): + """ + @brief Gets the user id. + @param name The user nickname or remarkname + @return The user id. + """ + for member in self.MemberList: + if name == member['RemarkName'] or name == member['NickName']: + return member['UserName'] + return None diff --git a/wxbot_project_py2.7/weixin_bot.py b/wxbot_project_py2.7/weixin_bot.py new file mode 100755 index 0000000..96bb745 --- /dev/null +++ b/wxbot_project_py2.7/weixin_bot.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from wechat import WeChat +from wechat.utils import * +from wx_handler import WeChatMsgProcessor +from wx_handler import Bot +from db import SqliteDB +from db import MysqlDB +from config import ConfigManager +from config import Constant +from config import Log +#--------------------------------------------------- +import flask +import threading +import traceback +import os +import logging +import time +#=================================================== + + +cm = ConfigManager() +db = SqliteDB(cm.getpath('database')) +# db = MysqlDB(cm.mysql()) +wechat_msg_processor = WeChatMsgProcessor(db) +wechat = WeChat(cm.get('wechat', 'host')) +wechat.db = db +wechat.bot = Bot() +wechat.msg_handler = wechat_msg_processor +wechat_msg_processor.wechat = wechat + +PORT = int(cm.get('setting', 'server_port')) +app = flask.Flask(__name__) +app.config['UPLOAD_FOLDER'] = cm.getpath('uploaddir') + +logger = logging.getLogger('werkzeug') +log_format_str = Constant.SERVER_LOG_FORMAT +formatter = logging.Formatter(log_format_str) +flask_log_handler = logging.FileHandler(cm.getpath('server_log_file')) +flask_log_handler.setLevel(logging.INFO) +flask_log_handler.setFormatter(formatter) +logger.addHandler(flask_log_handler) +app.logger.addHandler(flask_log_handler) + + +@app.route('/') +def index(): + with open(Constant.SERVER_PAGE_INDEX, 'r') as f: + return f.read() + + +@app.route('/qrcode') +def qrcode(): + qdir = cm.getpath('qrcodedir') + if not os.path.exists(qdir): + os.makedirs(qdir) + image_path = '%s/%s_%d.png' % (qdir, wechat.uuid, int(time.time()*100)) + s = wechat.wx_conf['API_qrcode'] + wechat.uuid + str2qr_image(s, image_path) + return flask.send_file(image_path, mimetype='image/png') + + +@app.route("/group_list") +def group_list(): + """ + @brief list groups + """ + result = wechat.db.select(Constant.TABLE_GROUP_LIST()) + j = {'count': len(result), 'group': result} + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/group_member_list/') +def group_member_list(g_id): + """ + @brief list group member + @param g_id String + """ + result = wechat.db.select(Constant.TABLE_GROUP_USER_LIST(), 'RoomID', g_id) + j = {'count': len(result), 'member': result} + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/group_chat_log/') +def group_chat_log(g_name): + """ + @brief list group chat log + @param g_name String + """ + result = wechat.db.select(Constant.TABLE_GROUP_MSG_LOG, 'RoomName', g_name) + j = {'count': len(result), 'chats': result} + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/upload', methods=['GET', 'POST']) +def upload_file(): + if flask.request.method == 'POST': + def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1] in Constant.SERVER_UPLOAD_ALLOWED_EXTENSIONS + + j = {'ret': 1, 'msg': ''} + + # check if the post request has the file part + if 'file' not in flask.request.files: + j['msg'] = 'No file part' + return flask.Response(json.dumps(j), mimetype='application/json') + + # if user does not select file, browser also + # submit a empty part without filename + file = flask.request.files['file'] + if file.filename == '': + j['msg'] = 'No selected file' + elif file and allowed_file(file.filename): + filename = generate_file_name(file.filename) + file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) + file.save(file_path) + j['ret'] = 0 + j['msg'] = filename + else: + j['msg'] = 'File type not support' + return flask.Response(json.dumps(j), mimetype='application/json') + else: + with open(Constant.SERVER_PAGE_UPLOAD, 'r') as f: + return f.read() + + +@app.route('/send_msg//') +def send_msg(to, msg): + """ + @brief send message to user or gourp + @param to: String, user id or group id + @param msg: String, words + """ + j = {'ret': 0 if wechat.send_text(to, msg) else 1} + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/send_img//') +def send_img(to, img): + """ + @brief send image to user or gourp + @param to: String, user id or group id + @param img: String, image file name + """ + img_path = os.path.join(app.config['UPLOAD_FOLDER'], img) + j = {'ret': 0 if wechat.send_img(to, img_path) else 1} + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/send_emot//') +def send_emot(to, emot): + """ + @brief send emotion to user or gourp + @param to: String, user id or group id + @param emot: String, emotion file name + """ + emot_path = os.path.join(app.config['UPLOAD_FOLDER'], emot) + j = {'ret': 0 if wechat.send_emot(to, emot_path) else 1} + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/send_file//') +def send_file(to, file): + """ + @brief send file to user or gourp + @param to: String, user id or group id + @param file: String, file name + """ + file_path = os.path.join(app.config['UPLOAD_FOLDER'], file) + j = {'ret': 0 if wechat.send_file(to, file_path) else 1} + return flask.Response(json.dumps(j), mimetype='application/json') + + +def mass_send(method, data, func): + j = {'ret': -1, 'unsend_list':[]} + if method == 'POST' and data: + to_list = data['to_list'] + msg = data['msg'] + media_type = data.get('media_type', '') + + if media_type in ['img', 'emot']: + file_path = os.path.join(app.config['UPLOAD_FOLDER'], msg) + response = wechat.webwxuploadmedia(file_path) + if response is not None: + msg = response['MediaId'] + elif media_type == 'file': + file_path = os.path.join(app.config['UPLOAD_FOLDER'], msg) + data = { + 'appid': Constant.API_WXAPPID, + 'title': msg, + 'totallen': '', + 'attachid': '', + 'type': wechat.wx_conf['APPMSGTYPE_ATTACH'], + 'fileext': msg.split('.')[-1], + } + response = wechat.webwxuploadmedia(file_path) + if response is not None: + data['totallen'] = response['StartPos'] + data['attachid'] = response['MediaId'] + else: + Log.error('File upload error') + msg = data + + for groups in split_array(to_list, 20): + for g in groups: + r = func(g, msg) + if not r: + j['unsend_list'].append(g) + time.sleep(1) + + j['ret'] = len(j['unsend_list']) + + return j + + +@app.route('/mass_send_msg/', methods=["GET", "POST"]) +def mass_send_msg(): + """ + @brief send text to mass users or gourps + """ + j = mass_send(flask.request.method, flask.request.json, wechat.send_text) + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/mass_send_img', methods=["GET", "POST"]) +def mass_send_img(): + """ + @brief send iamge to mass users or gourps + """ + j = mass_send(flask.request.method, flask.request.json, wechat.webwxsendmsgimg) + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/mass_send_emot', methods=["GET", "POST"]) +def mass_send_emot(): + """ + @brief send emoticon to mass users or gourps + """ + j = mass_send(flask.request.method, flask.request.json, wechat.webwxsendemoticon) + return flask.Response(json.dumps(j), mimetype='application/json') + + +@app.route('/mass_send_file', methods=["GET", "POST"]) +def mass_send_file(): + """ + @brief send file to mass users or gourps + """ + j = mass_send(flask.request.method, flask.request.json, wechat.webwxsendappmsg) + return flask.Response(json.dumps(j), mimetype='application/json') + + +def run_server(): + app.run(port=PORT) + +if cm.get('setting', 'server_mode') == 'True': + serverProcess = threading.Thread(target=run_server) + serverProcess.start() + +while True: + try: + wechat.start() + except KeyboardInterrupt: + echo(Constant.LOG_MSG_QUIT) + wechat.exit_code = 1 + else: + Log.error(traceback.format_exc()) + finally: + wechat.stop() + + if wechat.exit_code == 0: + echo(Constant.MAIN_RESTART) + else: + # kill process + os.system(Constant.LOG_MSG_KILL_PROCESS % os.getpid()) + diff --git a/wxbot_project_py2.7/wx_handler/__init__.py b/wxbot_project_py2.7/wx_handler/__init__.py new file mode 100644 index 0000000..19c28f2 --- /dev/null +++ b/wxbot_project_py2.7/wx_handler/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# coding: utf-8 + +from wechat_msg_processor import WeChatMsgProcessor +from bot import Bot \ No newline at end of file diff --git a/wxbot_project_py2.7/wx_handler/bot.py b/wxbot_project_py2.7/wx_handler/bot.py new file mode 100644 index 0000000..b3420bf --- /dev/null +++ b/wxbot_project_py2.7/wx_handler/bot.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from wechat.utils import * +from config import Constant +#--------------------------------------------------- +import random, time, json +#=================================================== + + +class Bot(object): + + def __init__(self): + self.emoticons = Constant.EMOTICON + self.gifs = [] + self.last_time = time.time() + + def time_schedule(self): + r = '' + now = time.time() + if int(now - self.last_time) > 3600: + self.last_time = now + url_latest = Constant.BOT_ZHIHU_URL_LATEST + url_daily = Constant.BOT_ZHIHU_URL_DAILY + data = get(url_latest) + j = json.loads(data) + story = j['stories'][random.randint(0, len(j['stories'])-1)] + r = story['title'] + '\n' + url_daily + str(story['id']) + return r.encode('utf-8') + + def reply(self, text): + APIKEY = Constant.BOT_TULING_API_KEY + api_url = Constant.BOT_TULING_API_URL % (APIKEY, text, '12345678') + r = json.loads(get(api_url)) + if r.get('code') == 100000 and r.get('text') != Constant.BOT_TULING_BOT_REPLY: + p = random.randint(1, 10) + if p > 3: + return r['text'] + elif p > 1: + # send emoji + if random.randint(1, 10) > 5: + n = random.randint(0, len(self.emoticons)-1) + m = random.randint(1, 3) + reply = self.emoticons[n].encode('utf-8') * m + return reply + return '' diff --git a/wxbot_project_py2.7/wx_handler/wechat_msg_processor.py b/wxbot_project_py2.7/wx_handler/wechat_msg_processor.py new file mode 100644 index 0000000..d70f54b --- /dev/null +++ b/wxbot_project_py2.7/wx_handler/wechat_msg_processor.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +# coding: utf-8 + +#=================================================== +from wechat.utils import * +from config import ConfigManager +from config import Constant +from config import Log +#--------------------------------------------------- +import os +import time +import json +import re +#=================================================== + + +class WeChatMsgProcessor(object): + """ + Process fetched data + """ + + def __init__(self, db): + self.db = db + self.wechat = None # recieve `WeChat` class instance + # for call some wechat apis + + # read config + cm = ConfigManager() + [self.upload_dir, self.data_dir, self.log_dir] = cm.setup_database() + + def clean_db(self): + """ + @brief clean database, delete table & create table + """ + self.db.delete_table(Constant.TABLE_GROUP_LIST()) + self.db.delete_table(Constant.TABLE_GROUP_USER_LIST()) + self.db.create_table(Constant.TABLE_GROUP_MSG_LOG, Constant.TABLE_GROUP_MSG_LOG_COL) + self.db.create_table(Constant.TABLE_GROUP_LIST(), Constant.TABLE_GROUP_LIST_COL) + self.db.create_table(Constant.TABLE_GROUP_USER_LIST(), Constant.TABLE_GROUP_USER_LIST_COL) + self.db.create_table(Constant.TABLE_RECORD_ENTER_GROUP, Constant.TABLE_RECORD_ENTER_GROUP_COL) + self.db.create_table(Constant.TABLE_RECORD_RENAME_GROUP, Constant.TABLE_RECORD_RENAME_GROUP_COL) + + def handle_wxsync(self, msg): + """ + @brief Recieve webwxsync message, saved into json + @param msg Dict: webwxsync msg + """ + fn = time.strftime(Constant.LOG_MSG_FILE, time.localtime()) + save_json(fn, msg, self.log_dir, 'a+') + + def handle_group_list(self, group_list): + """ + @brief handle group list & saved in DB + @param group_list Array + """ + fn = Constant.LOG_MSG_GROUP_LIST_FILE + save_json(fn, group_list, self.data_dir) + cols = [( + g['NickName'], + g['UserName'], + g['OwnerUin'], + g['MemberCount'], + g['HeadImgUrl'] + ) for g in group_list] + self.db.insertmany(Constant.TABLE_GROUP_LIST(), cols) + + def handle_group_member_list(self, group_id, member_list): + """ + @brief handle group member list & saved in DB + @param member_list Array + """ + fn = group_id + '.json' + save_json(fn, member_list, self.data_dir) + cols = [( + group_id, + m['UserName'], + m['NickName'], + m['DisplayName'], + m['AttrStatus'] + ) for m in member_list] + self.db.insertmany(Constant.TABLE_GROUP_USER_LIST(), cols) + + def handle_group_list_change(self, new_group): + """ + @brief handle adding a new group & saved in DB + @param new_group Dict + """ + self.handle_group_list([new_group]) + + def handle_group_member_change(self, group_id, member_list): + """ + @brief handle group member changes & saved in DB + @param group_id Dict + @param member_list Dict + """ + self.db.delete(Constant.TABLE_GROUP_USER_LIST(), "RoomID", group_id) + self.handle_group_member_list(group_id, member_list) + + def handle_group_msg(self, msg): + """ + @brief Recieve group messages + @param msg Dict: packaged msg + """ + # rename media files + for k in ['image', 'video', 'voice']: + if msg[k]: + t = time.localtime(float(msg['timestamp'])) + time_str = time.strftime("%Y%m%d%H%M%S", t) + # format: 时间_消息ID_群名 + file_name = '/%s_%s_%s.' % (time_str, msg['msg_id'], msg['group_name']) + new_name = re.sub(r'\/\w+\_\d+\.', file_name, msg[k]) + Log.debug('rename file to %s' % new_name) + os.rename(msg[k], new_name) + msg[k] = new_name + + if msg['msg_type'] == 10000: + # record member enter in group + m = re.search(r'邀请(.+)加入了群聊', msg['sys_notif']) + if m: + name = m.group(1) + col_enter_group = ( + msg['msg_id'], + msg['group_name'], + msg['from_user_name'], + msg['to_user_name'], + name, + msg['time'], + ) + self.db.insert(Constant.TABLE_RECORD_ENTER_GROUP, col_enter_group) + + # record rename group + n = re.search(r'(.+)修改群名为“(.+)”', msg['sys_notif']) + if n: + people = n.group(1) + to_name = n.group(2) + col_rename_group = ( + msg['msg_id'], + msg['group_name'], + to_name, + people, + msg['time'], + ) + self.db.insert(Constant.TABLE_RECORD_RENAME_GROUP, col_rename_group) + + # upadte group in GroupList + for g in self.wechat.GroupList: + if g['UserName'] == msg['from_user_name']: + g['NickName'] = to_name + break + + # normal group message + col = ( + msg['msg_id'], + msg['group_owner_uin'], + msg['group_name'], + msg['group_count'], + msg['from_user_name'], + msg['to_user_name'], + msg['user_attrstatus'], + msg['user_display_name'], + msg['user_nickname'], + msg['msg_type'], + msg['emoticon'], + msg['text'], + msg['image'], + msg['video'], + msg['voice'], + msg['link'], + msg['namecard'], + msg['location'], + msg['recall_msg_id'], + msg['sys_notif'], + msg['time'], + msg['timestamp'] + ) + self.db.insert(Constant.TABLE_GROUP_MSG_LOG, col) + + text = msg['text'] + if text and text[0] == '@': + n = trans_coding(text).find(u'\u2005') + name = trans_coding(text)[1:n].encode('utf-8') + if name in [self.wechat.User['NickName'], self.wechat.User['RemarkName']]: + self.handle_command(trans_coding(text)[n+1:].encode('utf-8'), msg) + + def handle_user_msg(self, msg): + """ + @brief Recieve personal messages + @param msg Dict + """ + wechat = self.wechat + + text = trans_coding(msg['text']).encode('utf-8') + uid = msg['raw_msg']['FromUserName'] + + if text == 'test_revoke': # 撤回消息测试 + dic = wechat.webwxsendmsg('这条消息将被撤回', uid) + wechat.revoke_msg(dic['MsgID'], uid, dic['LocalID']) + + + def handle_command(self, cmd, msg): + """ + @brief handle msg of `@yourself cmd` + @param cmd String + @param msg Dict + """ + wechat = self.wechat + g_id = '' + for g in wechat.GroupList: + if g['NickName'] == msg['group_name']: + g_id = g['UserName'] + + cmd = cmd.strip() + if cmd == 'test': + # wechat.send_file(g_id, 'test/Data/upload/shake.wav') + wechat.send_img(g_id, 'test/emotion/7.gif') + elif cmd == 'runtime': + wechat.webwxsendmsg(wechat.get_run_time(), g_id) + else: + # reply bot + # --------- + # if wechat.bot: + # r = wechat.bot.reply(cmd) + # if r: + # wechat.webwxsendmsg(r, g_id) + # else: + # pass + img_name = [ + '0.jpg', '1.jpeg', '2.gif', '3.jpg', '4.jpeg', + '5.gif', '6.gif', '7.gif', '8.jpg', '9.jpg' + ] + name = img_name[int(time.time()) % 10] + emot_path = os.path.join('test/emotion/', name) + wechat.send_emot(g_id, emot_path) + + def check_schedule_task(self): + # update group member list at 00:00 am every morning + t = time.localtime() + if t.tm_hour == 0 and t.tm_min <= 1: + # update group member + Log.debug('update group member list everyday') + self.db.delete_table(Constant.TABLE_GROUP_LIST()) + self.db.delete_table(Constant.TABLE_GROUP_USER_LIST()) + self.db.create_table(Constant.TABLE_GROUP_LIST(), Constant.TABLE_GROUP_LIST_COL) + self.db.create_table(Constant.TABLE_GROUP_USER_LIST(), Constant.TABLE_GROUP_USER_LIST_COL) + self.wechat.fetch_group_contacts() +