Skip to content
This repository has been archived by the owner on Jan 20, 2022. It is now read-only.

Commit

Permalink
不完美的福州大学学子每日一报支持
Browse files Browse the repository at this point in the history
  • Loading branch information
ZimoLoveShuang committed Jul 25, 2020
1 parent 2d76e87 commit 64110dc
Show file tree
Hide file tree
Showing 9 changed files with 756 additions and 3 deletions.
43 changes: 40 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
- `index.py` 完成自动提交的py脚本
- `generate.py` 帮助生成默认项配置的py脚本
- `requirements.txt` py依赖库以及版本说明文件
- `dependency.zip` 打包好的云函数依赖库文件
- `fzu` 针对福州大学的同学们

# 使用方式

Expand All @@ -28,7 +28,7 @@
git clone https://github.com/ZimoLoveShuang/auto-submit.git
```
2. 打开本地仓库文件夹,配置`config.yml`中对应的学号(username)和密码(password)还有地址(address)等等信息,详情请看`config.yml`中的注释说明,**注意这里的学号和密码都是智慧校园的学号和密码**
3. 打开百度搜索[腾讯云函数](https://console.cloud.tencent.com/scf/index?rid=1),注册认证后,进入控制台,点击左边的层,然后点新建,名称随意,然后点击上传zip,选择项目中的`dependency.zip`上传,然后选择运行环境`python3.6`,然后点击确定,耐心等待一下,上传依赖包需要花费的时间比较长
3. 打开百度搜索[腾讯云函数](https://console.cloud.tencent.com/scf/index?rid=1),注册认证后,进入控制台,点击左边的层,然后点新建,名称随意,然后点击上传zip,选择release中的`dependency.zip`上传,然后选择运行环境`python3.6`,然后点击确定,耐心等待一下,上传依赖包需要花费的时间比较长
![新建腾讯云函数依赖](screenshots/ed6044e6.png)
4. 点左边的函数服务,新建云函数,名称随意,运行环境选择`python3.6`,创建方式选择空白函数,然后点击下一步
![新建腾讯云函数](screenshots/a971478e.png)
Expand All @@ -50,6 +50,42 @@
```python
config = getYmlConfig(yaml_file='config.yml')
```

## 福州大学的同学

1. clone 或者 下载 此仓库到本地
```shell script
git clone https://github.com/ZimoLoveShuang/auto-submit.git
```
2. 打开本地仓库文件夹下的fzu文件夹,配置`config.yml`
3. 抓包获取到`acw_tc``MOD_AUTH_CAS``CpdailyInfo`,填入`fzu/index.py`对应位置
4. 配置腾讯云函数,依赖层配置和上面一样,提交方法选择提交文件夹,请选择`fzu`文件夹,触发管理和上面一样
5. enjoy it!!!
6. 不要问我为什么福州大学的这么麻烦,**我也不想的**,我只能说我尽力了,我开始尝试写了个脚本,获取`MOD_AUTH_CAS`,可没两天就失效了(被堵了),后来我又尝试了全程模拟app的行为,可还是获取不到,。,唉,就不知道什么原因,**可能是还有某个过程没注意到,或者被忽略了**,精力有限,暂时先这样吧
7. 至于抓包方案,不懂的朋友们,可以去我的博客爬帖,如果你用fiddler,抓到类似下面这样就行了,将cookie字段的值填入`fzu/index.py`
```http request
POST https://fzu.cpdaily.com/wec-counselor-collector-apps/stu/collector/queryCollectorProcessingList HTTP/1.1
Host: fzu.cpdaily.com
Connection: keep-alive
Content-Length: 29
accept: application/json, text/plain, */*
Origin: https://fzu.cpdaily.com
x-requested-with: XMLHttpRequest
User-Agent: Mozilla/5.0 (Linux; Android 4.4.4; PCRT00 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36 cpdaily/8.0.8 wisedu/8.0.8
content-type: application/json
Referer: https://fzu.cpdaily.com/wec-counselor-collector-apps/stu/mobile/index.html?timestamp=1595648285420
Accept-Encoding: gzip,deflate
Accept-Language: zh-CN,en-US;q=0.8
# cookie信息已打码
Cookie: acw_tc=16b20adb15956482658adff07efff0fbffd044b2566fd2f471b0cb184e0ae8; MOD_AUTH_CAS=0-YhXWbbabc3cssszge123451833587
{"pageSize":6,"pageNumber":1}
```
8. CpdailyInfo(和Cpdaily-Extension是同一个东西),如果你抓不到,可以直接执行`fzu/utils.py`,将输出复制到`fzu/index.py`
9. 未测试cookie的失效时限
10. 想来模拟点击应该是**最为有效且简单**的方案,仅针对福州大学的同学们来说
11. 至于为什么没有删掉**没有用的**`login.py`,我的想法是就当给大家写个参考吧,同时这也记录着我的探索过程

# 封禁白嫖说明

#### 白嫖党太多且几乎定时为同一时刻,导致高并发,使得提供模拟登陆API的服务器响应很不稳定,已采取封禁措施
Expand Down Expand Up @@ -124,7 +160,7 @@ config = getYmlConfig(yaml_file='config.yml')
</tbody>
</table>

#### <s>福州大学的同学自动签到已支持,请看[auto-sign项目](https://github.com/ZimoLoveShuang/auto-sign)</s>暂不支持,原因:接口更新,暂未测试通过
#### <s>福州大学的同学自动签到已支持,请看[auto-sign项目](https://github.com/ZimoLoveShuang/auto-sign)</s>暂不支持,原因:接口更新,获取不到MOD_AUTH_CAS

# 说明

Expand Down Expand Up @@ -170,6 +206,7 @@ config = getYmlConfig(yaml_file='config.yml')

# 更新日志

- 2020-07-25 新增针对福州大学的一些脚本,不完美
- 2020-07-17 优化自动获取登陆地址的函数,处理某些学校转发到另一个域名去进行登陆认证的情况
- 2020-07-12 新增对配置文件默认项不正确的检查,并提示
- 2020-07-09 由于根据joinType确定的登陆地址不准确,所以将自动确定登陆地址的方式,改为根据关键字确定
Expand Down
Binary file removed dependency.zip
Binary file not shown.
84 changes: 84 additions & 0 deletions fzu/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
user:
#username 学号或者工号
username: 161105024
#password 密码,用不到,原因是:login.py获取不到MOD_AUTH_CAS
# password: 161105024
#address 地址,定位信息
address: 中国四川省成都市金牛区一环路北1段-129号-附9号
#email 接受通知消息的邮箱
email: [email protected]
#lon 当前位置经度,可以访问http://zuobiao.ay800.com/s/27/index.php获取
lon: '119.191475'
#lat 当前位置纬度
lat: '26.058264'
#school 学校全称
school: 福州大学
#今日校园相关配置
cpdaily:
#表单组默认选项配置
defaults:
#表单默认选项配置,按顺序,注意,只有标必填项的才处理,不会配置就执行generate.py
- default:
title: 今日所在位置
type: 1
value: 福建省/漳州市/芗城区
- default:
title: 昨日午检体温
type: 2
value: 小于37.3度
- default:
title: 今日晨检体温
type: 2
value: 小于37.3度
- default:
title: 今日健康状况(可多选)
type: 3
value: 健康,无症状
- default:
title: 家庭成员是否有确诊感染、疑似感染新冠肺炎患者或无症状感染者
type: 2
value:
- default:
title: 今日是否为入院状态(入院指生病住院)
type: 2
value:
- default:
title: 目前是否为新冠肺炎确诊/疑似病例或无症状感染者(若选“是“,必须已与就诊医生确认)
type: 2
value:
- default:
title: 今日隔离情况
type: 2
value: 无需隔离
- default:
title: 今日是否因与确诊病人有密切接触,被当地强制隔离中
type: 2
value:
- default:
title: 今日是否因有发热、咳嗽、乏力、呼吸困难等疑似症状在隔离中
type: 2
value:
- default:
title: 近14日以来,你接触过疫情重点地区流出人员或确诊/疑似新冠肺炎患者等情况
type: 2
value: 无此类情况
- default:
title: 近14日以来,你居住、旅行、途经疫情重点地区情况
type: 2
value: 无此类情况
- default:
title: 是否在今日入闽
type: 2
value:
- default:
title: 住址是否在今日有变动
type: 2
value:
- default:
title: 近14日以来,你的共同居住者(包括家庭成员、共同租住人员、共同居住房东家庭成员)有无以下特殊情况(可多选)
type: 3
value: 无以下特殊情况
- default:
title: 本人承诺以上所填报的全部内容均属实、准确,不存在任何隐瞒与不实的情况,更无遗漏之处。
type: 2
value:
62 changes: 62 additions & 0 deletions fzu/encrypt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import math
import random
import base64
from Crypto.Cipher import AES
from pyDes import des, CBC, PAD_PKCS5


# DES加密
def DESEncrypt(s, key='XCE927=='):
iv = b"\x01\x02\x03\x04\x05\x06\x07\x08"
k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
encrypt_str = k.encrypt(s)
return base64.b64encode(encrypt_str).decode()


# DES解密
def DESDecrypt(s, key='XCE927=='):
s = base64.b64decode(s)
iv = b"\x01\x02\x03\x04\x05\x06\x07\x08"
k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
return k.decrypt(s)


# 获取随机字符串
def getRandomString(length):
chs = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
result = ''
for i in range(0, length):
result += chs[(math.floor(random.random() * len(chs)))]
return result


# AES加密
def EncryptAES(s, key, iv='1' * 16, charset='utf-8'):
key = key.encode(charset)
iv = iv.encode(charset)
BLOCK_SIZE = 16
pad = lambda s: (s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s) % BLOCK_SIZE))
raw = pad(s)
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(bytes(raw, encoding=charset))
return str(base64.b64encode(encrypted), charset)


# AES解密
def DecryptAES(s, key, iv='1' * 16, charset='utf-8'):
key = key.encode(charset)
iv = iv.encode(charset)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypt = unpad(cipher.decrypt(base64.b64decode(s)))
return str(decrypt, charset)


# 金智的AES加密过程
def AESEncrypt(data, key):
return EncryptAES(getRandomString(64) + data, key, key)


# 金智的AES解密过程
def AESDecrypt(data, key):
return DecryptAES(data, key)[64:]
59 changes: 59 additions & 0 deletions fzu/generate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# encoding: utf-8
from fzu import index as app
import yaml


# 生成默认配置
def generate():
form = dict(app.queryForm())['form']
# app.log(form)
defaults = []
sort = 1
for formItem in form:
if formItem['isRequired'] == 1:
default = {}
one = {}
default['title'] = formItem['title']
default['type'] = formItem['fieldType']
print('问题%d:' % sort + default['title'])
if default['type'] == 1:
default['value'] = input("请输入文本:")
if default['type'] == 2:
fieldItems = formItem['fieldItems']
num = 1
for fieldItem in fieldItems:
print('\t%d ' % num + fieldItem['content'])
num += 1
choose = int(input("请输入序号:"))
if choose < 1 or choose > num:
print('输入错误,请重新执行此脚本')
exit(-1)
default['value'] = fieldItems[choose - 1]['content']
if default['type'] == 3:
fieldItems = formItem['fieldItems']
num = 1
for fieldItem in fieldItems:
print('\t%d ' % num + fieldItem['content'])
num += 1
chooses = list(map(int, input('请输入序号(可输入多个,请用空格隔开):').split()))
default['value'] = ''
for i in range(0, len(chooses)):
choose = chooses[i]
if choose < 1 or choose > num:
print('输入错误,请重新执行此脚本')
exit(-1)
if i != len(chooses) - 1:
default['value'] += fieldItems[choose - 1]['content'] + ','
else:
default['value'] += fieldItems[choose - 1]['content']
if default['type'] == 4:
default['value'] = input("请输入图片名称:")
one['default'] = default
defaults.append(one)
sort += 1
print('======================分隔线======================')
print(yaml.dump(defaults, allow_unicode=True))


if __name__ == "__main__":
generate()
Loading

0 comments on commit 64110dc

Please sign in to comment.