Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 35 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,98 +1,67 @@
# lykchat信息发送系统
lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基于个人微信号,为系统管理人员提供信息发送工具。

实现的功能有用户登录管理、微信登陆管理和微信信息发送功能。


## 特点 ##
# 通知
在2017年7月20日晚上,疑似微信web端做了调整,web上不在显示好友微信号,所以即日使用微信号发送信息可能提示无法找到好友等错误提示。

解决办法:

1、使用好友昵称来发送信息
2、使用备注名来发送信息
但必须只能是数字、字母、符号等,不能为图片等

## 特点

1、简单高效
基于个人微信号,模拟微信web端,部署和维护简单
web管理页面实现可视化管理微信登陆
接口采用URL,简化调用复杂度,返回结果均为json格式
2、信息共享
通过共享用户session和微信登陆信息,保证系统长期稳定运行
2、信息共享
通过共享用户session和微信登陆信息,保证系统长期稳定运行
3、7*24不间断服务
计划任务定时检查微信登陆状态,微信保持登陆超过20天
4、用户管理
计划任务定时检查微信登陆状态,微信保持登陆超过20天(有用户反映,保持登陆超过30天后,会被微信封掉,解决办法是登陆后2~3个星期退出登陆一次)
4、支持发送多媒体信息
除了支持发送纯文字信息外,还支持发送图片、视频、文件等信息
5、用户管理
通过用户隔离微信个人号,不同用户管理不同微信号
用户密码分为管理密码和接口密码,保证用户信息安全性
5、微信信息安全
6、微信信息安全
不会监控和存储微信聊天信息
不会增加和删除好友


## 截图 ##

管理页面--等待扫码
![等待扫码 截图](https://raw.githubusercontent.com/lykops/lykchat/master/doc/web管理--登陆.jpg)

## 截图

管理页面--功能展示

![等待扫码 截图](https://raw.githubusercontent.com/lykops/lykchat/master/doc/web页面--功能说明.jpg)

管理页面--微信登陆时长
![等待扫码 截图](https://raw.githubusercontent.com/lykops/lykchat/master/doc/微信登陆时间超过1天.jpg)

管理页面--微信登陆时长

![微信登陆时长 截图](https://raw.githubusercontent.com/lykops/lykchat/V2.1.0/doc/微信登陆时间超过1天.jpg)

接口-发送信息成功

![等待扫码 截图](https://raw.githubusercontent.com/lykops/lykchat/master/doc/接口-发送信息成功.jpg)

![发送信息成功 截图](https://raw.githubusercontent.com/lykops/lykchat/master/doc/接口-发送信息成功.jpg)


## 发送信息接口使用说明
[https://github.com/lykops/lykchat/wiki/%E5%8F%91%E9%80%81%E4%BF%A1%E6%81%AF%E6%8E%A5%E5%8F%A3%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E](https://github.com/lykops/lykchat/wiki/%E5%8F%91%E9%80%81%E4%BF%A1%E6%81%AF%E6%8E%A5%E5%8F%A3%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E "发送信息接口")

## 模块 ##
## 模块和工作流程
[https://github.com/lykops/lykchat/wiki/%E6%A8%A1%E5%9D%97%E5%92%8C%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B](https://github.com/lykops/lykchat/wiki/%E6%A8%A1%E5%9D%97%E5%92%8C%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B "模块和工作流程")

1、管理web页面:可视化管理微信个人号
用户登录和认证
微信号登陆管理
发送信息给好友
2、发送信息接口:
通过接口方式为其他业务系统发送信息给指定好友
3、计划任务检测微信登陆状态:
获取所有登录微信成功的用户,通过调用检测微信登陆接口
4、会话保持模块:
存储微信登陆信息和会话信息,同用户在任何地方登陆,保证微信登陆状态一致
5、模拟微信web端模块:
通过微信登陆信息,访问微信web端接口,实现管理登陆、发送信息等功能。


## V2.0.0版本说明 ##

1、修复bug:
微信登陆时间超过12小时自动退出,测试过程中测得最大登陆时长20天
2、完善功能:
1)、微信会话保持机制:
保存位置:之前保存在数据库中,修改为数据库只记录用户名,所有信息保持到文件中,减少数据库的查询、写入、加解密压力
动态更新微信登陆信息
调整会话信息内容
2)、优化微信检测登陆流程,大大缩短各个页面执行时间
3)、完善获取好友流程
3、新增功能:
1)、增加用户管理机制
2)、好友信息缓存机制
4、取消功能:
接受和处理新信息


## 发送信息接口 ##
URL地址:http://IP(或者域名)/sendmsg
支持post和get方法
请求参数说明:
'username' : 管理用户,同管理web页面,通过用户确认微信发送者
'pwd' : 接口密码,注意不等于登陆密码,
'friendfield':接受信息的好友字段代号,0昵称,1微信号,2备注名,可以为空,默认为0
'friend': 接受信息的好友的昵称、微信号、备注名的其中之一,不能为空
'content': 发送内容,不能为空
注意:
friend一定是该用户下的登陆微信好友列表中的
friendfield最好是微信号(Alias),也可以使用昵称(NickName)或者备注名(RemarkName)(但不能重复出现)
由于好友列表使用缓存机制,新增好友可能发送信息不成功
返回信息:
json格式,{'Msg': 执行结果, 'Code':返回代码, 'ErrMsg':如果-1005返回参数列表,其他发送微信返回信息}
常见code:0成功;-1101参数错误;-1102无法找到好友;1101微信号退出登录,其他为微信返回错误
例子:http://192.168.100.104/sendmsg?username=zabbix&pwd=123456&friendfield=1&friend=lyk-ops&content=test
## 安装手册
[https://github.com/lykops/lykchat/wiki/%E5%AE%89%E8%A3%85%E6%89%8B%E5%86%8C](https://github.com/lykops/lykchat/wiki/%E5%AE%89%E8%A3%85%E6%89%8B%E5%86%8C "安装手册")

## ChangeLog
[https://github.com/lykops/lykchat/wiki/ChangeLog](https://github.com/lykops/lykchat/wiki/ChangeLog "ChangeLog")

## 说明 ##
## 说明

1、作者尽可能通过严谨测试来验证系统功能,但由于专业水平有限,无法避免出现bug。
2、该项目是基于微信web端进行开发的
Expand All @@ -109,6 +78,3 @@ lykchat信息发送系统是Python3开发的,通过模拟微信网页端,基
邮箱:liyingke112@126.com


![WIKI](https://github.com/lykops/lykchat/wiki/)


32 changes: 32 additions & 0 deletions doc/ChangeLog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# V2.1.0
## 升级内容
新增发送图片、视频、文件等多媒体信息
## 从v2.0.0更新步骤
1、下载最新版本
2、安装依赖包
/usr/local/python36/bin/pip3 install -r /opt/lykchat/install/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3、修改配置文件
配置文件library/config/wechat.py
新增上传文件最大数max_upload_size(默认为5M,建议不要上传文件太大,导致访问接口超时)
4、修改nginx的上传文件最大值
client_max_body_size 10m;
## 说明事项
django默认启用防CSRF(Cross-site request forgery跨站请求伪造),导致无法使用post方法调用该接口,所以作者强制关闭了防csrf功能。
如果你觉得有安全隐患,又不需要发送多媒体文件,请下载2.0版本:https://codeload.github.com/lykops/lykchat/zip/master

# V2.0.0

1、修复bug:
微信登陆时间超过12小时自动退出,测试过程中测得最大登陆时长20天
2、完善功能:
1)、微信会话保持机制:
保存位置:之前保存在数据库中,修改为数据库只记录用户名,所有信息保持到文件中,减少数据库的查询、写入、加解密压力
动态更新微信登陆信息
调整会话信息内容
2)、优化微信检测登陆流程,大大缩短各个页面执行时间
3)、完善获取好友流程
3、新增功能:
1)、增加用户管理机制
2)、好友信息缓存机制
4、取消功能:
接受和处理新信息
30 changes: 9 additions & 21 deletions doc/使用手册.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
# lykchat工作流程
![lykchat工作流程](https://raw.githubusercontent.com/lykops/lykchat/master/doc/lykchat工作流程.jpg)


# 模块说明

## 管理web页面
Expand All @@ -12,26 +8,15 @@
发送信息给好友:用于测试发送功能是否可用
通过选择好友列表显示获取需要发送信息的好友
好友信息列表只展示文件传输助手、除了自己外的好友(疑似好友表示没有设置该好友没有设置性别)、部分群(是根据第一页好友信息获取的),自动屏蔽掉公众号、微信系统用户、好友为自己。
## 发送信息接口
通过接口方式为其他业务系统发送信息给指定好友
URL地址:http://IP(或者域名)/sendmsg
支持post和get方法
请求参数说明:
'username' : 管理用户,同管理web页面,通过用户确认微信发送者
'pwd' : 接口密码,注意不等于登陆密码
'friendfield':接受信息的好友字段代号,{0:"NickName" , 1:"Alias" , 2:"RemarkName"},可以为空,默认为0
'friend': 接受信息的好友的昵称、微信号、备注名的其中之一,不能为空
'content': 发送内容,不能为空
注意:
friend一定是该用户下的登陆微信好友列表中的
friendfield最好是微信号(Alias),也可以使用昵称(NickName)或者备注名(RemarkName),但不能重复
返回信息:
json格式,{'Msg': 执行结果, 'Code':返回代码, 'ErrMsg':如果-1005返回参数列表,其他发送微信返回信息}
常见code:0成功,-1101参数错误,-1102无法找到好友,1101微信号退出登录,其他为微信返回错误
例子:http://192.168.100.104/sendmsg?username=zabbix&pwd=123456&friendfield=1&friend=lyk-ops&content=test
上传需要发送的文件

## 发送信息接口 ##
[https://github.com/lykops/lykchat/wiki/%E5%8F%91%E9%80%81%E4%BF%A1%E6%81%AF%E6%8E%A5%E5%8F%A3%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E](https://github.com/lykops/lykchat/wiki/%E5%8F%91%E9%80%81%E4%BF%A1%E6%81%AF%E6%8E%A5%E5%8F%A3%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E "发送信息接口")

## 计划任务
检测微信登陆状态:
获取所有登录微信成功的用户,通过调用检测微信登陆接口

## 会话保持模块
存储微信登陆信息和会话信息,同用户在任何地方登陆,保证微信登陆状态一致
访问管理页面和微信登陆检测接口,根据session或者参数获取用户名,然后读取会话文件,页面操作后,再一次更新数据库和会话文件
Expand All @@ -47,7 +32,10 @@
json格式
每次访问更新
默认存放在/dev/shm/lykchat下,根据用户名命名

## 模拟微信web端模块
它是该系统的核心和底层模块。
通过微信登陆信息,访问微信web端接口,实现管理登陆、发送信息等功能。

# lykchat工作流程
![lykchat工作流程](https://raw.githubusercontent.com/lykops/lykchat/master/doc/lykchat工作流程.jpg)
52 changes: 52 additions & 0 deletions doc/发送信息接口说明.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
发送信息接口为其他业务系统发送信息给指定好友

# 特点
支持post和get方法
除了支持纯文字外,还支持图片、文字等诸多多媒体文件。

# 注意
django默认启用防CSRF(Cross-site request forgery跨站请求伪造),导致无法使用post方法调用该接口,所以作者强制关闭了防csrf功能。
如果你觉得有安全隐患,又不需要发送多媒体文件,请下载2.0版本:https://codeload.github.com/lykops/lykchat/zip/master

# 参数说明
下面参数支持post和get方法
'username' :
管理用户,同管理web页面,通过用户确认微信发送者
'pwd' :
接口密码,注意不等于登陆密码
'type' :
'发送信息类型
可选{"txt":"纯文字" ,"img":"图片","file":"发送文件","video":"视频"},可以为空
默认:不发送文件为txt,发送文件为file
'fromalias':
保留字段
发送者的微信号,目前没有使用该参数
'friendfield':
接受者的字段代号,可选{0:"NickName" , 1:"Alias" , 2:"RemarkName"},可以为空
默认为0'
'friend':
接受者的昵称、微信号、备注名的其中一个,不能为空
'content':
发送内容,不能为空
必须是post方法:
'file':
需要发送的文件,
注意:
friend一定是该用户下的登陆微信好友列表中的
friendfield最好是微信号(Alias),也可以使用昵称(NickName)或者备注名(RemarkName),但不能重复

# 返回信息
json格式,{'Msg': 执行结果, 'Code':返回代码, 'ErrMsg':如果-1005返回参数列表,其他发送微信返回信息}
常见code:0成功,-1101参数错误,-1102无法找到好友,1101微信号退出登录,其他为微信返回错误

# 使用实例
接口URL地址:http://IP(或者域名)/sendmsg
发送纯文字:
http://192.168.100.104/sendmsg?username=zabbix&pwd=123456&friendfield=1&friend=lyk-ops&content=test
发送多媒体:
方法1:Linux的curl命令
curl -F "file=@/root/a" 'http://127.0.0.1/sendmsg?username=zabbix&pwd=123456&type=img&friendfield=1&friend=lyk-ops&content=test'
方法2:python脚本test_sendfile.py
请参照该项目的根目录python脚本test_sendfile.py,执行
/usr/local/python36/bin/python3 /opt/lykchat/test_upload.py "{'username':'zabbix','pwd':'123456','type':'img','friendfield':'1','friend':'lyk-ops','content':'恭喜发财','file':'/root/b.jpg'}"

8 changes: 4 additions & 4 deletions doc/安装手册.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
Python3+django1.10
测试环境使用Python3.5.2、3.6.0两个版本测试
## web服务器
Nginx
Nginx
主要解决静态文件展示。
测试环境为nginx 1.10.2
## 数据库
Expand All @@ -21,7 +21,7 @@

## 安装依赖包
yum install -y epel-release
yum install telnet ntpdate lrzsz bash glibc openssl vim automake autoconf gcc xz ncurses-devel patch python-devel git python-pip gcc-c++ redhat-rpm-config -y
yum install telnet ntpdate lrzsz bash glibc openssl vim automake autoconf gcc xz ncurses-devel patch python-devel git python-pip gcc-c++ redhat-rpm-config openssl-devel openssl-static openssl098e openssl-libs -y
yum upgrade -y

## 配置nginx
Expand All @@ -43,7 +43,7 @@

在本地安装mysql
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum install mysql-community-* mysql-connector-python* --skip-broke
yum install mysql-community-client mysql-community-common mysql-community-devel mysql-community-libs mysql-community-libs-compat mysql-community-server --skip-broke

新增一个数据库lykchat
设置用户lykchat,密码为!QAZ2wsx,把数据库lykchat的权限分配给用户lykchat
Expand Down Expand Up @@ -75,7 +75,7 @@
## 初始化数据库和配置计划任务

/usr/local/python36/bin/python3 /opt/lykchat/manage.py makemigrations
/usr/local/python36/bin/python3 /opt/lykchat/manage.py migrat
/usr/local/python36/bin/python3 /opt/lykchat/manage.py migrate

/usr/local/python36/bin/python3 /opt/lykchat/manage.py crontab add
crontab -l
Expand Down
Binary file modified doc/微信登陆时间超过1天.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion install/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ djangorestframework
django-template-utils
mysqlclient
Pillow
requests
requests
requests-toolbelt
7 changes: 4 additions & 3 deletions library/config/wechat.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os, platform
from lykchat.settings import BASE_DIR

version = '2.0.0'
version = '2.1.0'
base_url = 'https://wx2.qq.com'
os_type = platform.system() # Windows, Linux, Darwin
curr_dir = os.getcwd()
Expand Down Expand Up @@ -68,14 +68,15 @@
},
}


SESSION_COOKIE_AGE = 60 * 60 * 1

max_upload_size = 1024 * 1024 * 5
# 上传文件最大值,单位bytes,默认5M

CRONJOBS = (
('*/2 * * * *', 'library.cron.checklogin.check_login', '>>/dev/shm/lykchat.txt 2>&1'),
)

# 检测登陆状态的计划任务

url_frond = 'http://127.0.0.1/'

Expand Down
Empty file added library/file/__init__.py
Empty file.
16 changes: 16 additions & 0 deletions library/file/get_md5.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import hashlib, os

def get_file_md5(filename):
if not os.path.isfile(filename):
return False

myhash = hashlib.md5()
f = open(filename, 'rb')
while True:
b = f.read(8096)
if not b :
break
myhash.update(b)
f.close()

return myhash.hexdigest()
Loading