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

修复currency脚本,添加serverchan turbo支持 #50

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
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
443 changes: 3 additions & 440 deletions README.md

Large diffs are not rendered by default.

28 changes: 28 additions & 0 deletions currency/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 自动填写信息收集-模拟登陆方式

# 项目说明

- `config.yml` 默认配置文件
- `index.py` 完成自动提交的py脚本
- `generate.py` 帮助生成默认项配置的py脚本
- `login.py` 登陆并生成session.yml的py脚本

# 使用方式
1. clone 或者 下载 此仓库到本地
```shell script
git clone https://github.com/A-Cepheus/auto-submit.git
```
2. 进入`auto-submit`目录下,安装依赖,命令`pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple`
3. 打开本地仓库文件夹下的`currency`文件夹,配置`config.yml`
4. 本地执行`python login.py`会自动生成`session.yml`
5. 可以配置腾讯云函数、阿里云FC函数、或者直接在本地执行`index.py`
6. enjoy it!!!
7. 注意:如果你本地有多个python环境,请使用`python3和pip3`

### 一些使用建议(非常重要,请仔细阅读)

#### 如果你不会配置表单组默认选项配置,请先配置好`user`信息之后本地执行`generate.py`,根据提示信息手动输入,然后将分割线下的内容复制到配置文件中对应位置

#### 如果问题中有省市县三级联动的位置,按`xx省/xx市/xx县`这个格式输入文本即可

#### 除非问题和答案都完全一样,否则不建议使用多用户配置
87 changes: 23 additions & 64 deletions currency/config.yml
Original file line number Diff line number Diff line change
@@ -1,84 +1,43 @@
user:
#username 学号或者工号
username: '161105024'
username: '120000000000'
#tellphone 电话号码
tellphone: '15xxxxxxxx8'
tellphone: '13000000000'
#address 地址,定位信息
address: 中国四川省成都市金牛区一环路北1段-129号-附9号
#email 接受通知消息的邮箱
email: 461009747@qq.com
#lon 当前位置经度,可以访问http://zuobiao.ay800.com/s/27/index.php获取
lon: '119.191475'
address: 中国广东省深圳市xx区xx街道xx路
#email 接受通知消息的邮箱(已弃用,可以不填)
email: 895996939@qq.com
#lon 当前位置经度,可以访问http://api.map.baidu.com/lbsapi/getpoint/获取
lon: '116.401969'
#lat 当前位置纬度
lat: '26.058264'
lat: '39.915599'
#school 学校全称
school: 福州大学
school: 辽宁科技大学
#今日校园相关配置
cpdaily:
#表单组默认选项配置
defaults:
#表单默认选项配置,按顺序,注意,只有标必填项的才处理,不会配置就执行generate.py
- default:
title: 今日所在位置
type: 1
value: 福建省/漳州市/芗城区
title: 今日体温是(℃)
type: '1'
value: '36.1'
- 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
title: 今日是否有发热、咳嗽等症状?
type: '2'
value: 否
- default:
title: 今日隔离情况
type: 2
value: 无需隔离
- default:
title: 今日是否因与确诊病人有密切接触,被当地强制隔离中
type: 2
title: 是否有中高风险地区旅居史?
type: '2'
value: 否
- default:
title: 今日是否因有发热、咳嗽、乏力、呼吸困难等疑似症状在隔离中
type: 2
title: 是否被要求隔离
type: '2'
value: 否
- default:
title: 近14日以来,你接触过疫情重点地区流出人员或确诊/疑似新冠肺炎患者等情况
type: 2
value: 无此类情况
- default:
title: 近14日以来,你居住、旅行、途经疫情重点地区情况
type: 2
value: 无此类情况
- default:
title: 是否在今日入闽
type: 2
title: 是否为确诊、疑似病例或无症状感染者?
type: '2'
value: 否
- default:
title: 住址是否在今日有变动
type: 2
value: 否
- default:
title: 近14日以来,你的共同居住者(包括家庭成员、共同租住人员、共同居住房东家庭成员)有无以下特殊情况(可多选)
type: 3
value: 无以下特殊情况
- default:
title: 本人承诺以上所填报的全部内容均属实、准确,不存在任何隐瞒与不实的情况,更无遗漏之处。
type: 2
value: 是

Info:
ServerChan: SCTXXXXXXXXXXXXXXXXXXXX # 填写Server酱的SCKEY 微信推送结果 详情请看https://sct.ftqq.com/
4 changes: 2 additions & 2 deletions currency/encrypt.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@


# DES加密
def DESEncrypt(s, key='XCE927=='):
def DESEncrypt(s, key='b3L26XNL'):
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=='):
def DESDecrypt(s, key='b3L26XNL'):
s = base64.b64decode(s)
iv = b"\x01\x02\x03\x04\x05\x06\x07\x08"
k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5)
Expand Down
8 changes: 4 additions & 4 deletions currency/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ def generate():
default['title'] = formItem['title']
default['type'] = formItem['fieldType']
print('问题%d:' % sort + default['title'])
if default['type'] == 1:
if default['type'] == '1':
default['value'] = input("请输入文本:")
if default['type'] == 2:
if default['type'] == '2':
fieldItems = formItem['fieldItems']
num = 1
for fieldItem in fieldItems:
Expand All @@ -29,7 +29,7 @@ def generate():
print('输入错误,请重新执行此脚本')
exit(-1)
default['value'] = fieldItems[choose - 1]['content']
if default['type'] == 3:
if default['type'] == '3':
fieldItems = formItem['fieldItems']
num = 1
for fieldItem in fieldItems:
Expand All @@ -46,7 +46,7 @@ def generate():
default['value'] += fieldItems[choose - 1]['content'] + ','
else:
default['value'] += fieldItems[choose - 1]['content']
if default['type'] == 4:
if default['type'] == '4':
default['value'] = input("请输入图片名称:")
one['default'] = default
defaults.append(one)
Expand Down
79 changes: 43 additions & 36 deletions currency/index.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
# -*- coding: utf-8 -*-
import oss2
from login import *
from encrypt import *

############配置############
sessionyml = getYmlConfig('session.yml')
Cookies = {
'acw_tc': '',
'MOD_AUTH_CAS': '',
'acw_tc': sessionyml['Cookies']['acw_tc'],
'MOD_AUTH_CAS': sessionyml['Cookies']['MOD_AUTH_CAS'],
}
sessionToken = ''
CpdailyInfo = ''
sessionToken = sessionyml['sessionToken']
CpdailyInfo = sessionyml['CpdailyInfo']
############配置############

# 全局
Expand All @@ -27,7 +29,7 @@ def queryForm():
getModAuthCas(data)
headers = {
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'Mozilla/5.0 (Linux; Android 4.4.4; OPPO R11 Plus Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36 yiban/8.1.11 cpdaily/8.1.11 wisedu/8.1.11',
'User-Agent': 'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36',
'content-type': 'application/json',
'Accept-Encoding': 'gzip,deflate',
'Accept-Language': 'zh-CN,en-US;q=0.8',
Expand Down Expand Up @@ -70,18 +72,18 @@ def fillForm(form):
log('第%d个默认配置不正确,请检查' % sort)
exit(-1)
# 文本直接赋值
if formItem['fieldType'] == 1:
if formItem['fieldType'] == '1':
formItem['value'] = default['value']
# 单选框需要删掉多余的选项
if formItem['fieldType'] == 2:
if formItem['fieldType'] == '2':
# 填充默认值
formItem['value'] = default['value']
fieldItems = formItem['fieldItems']
for i in range(0, len(fieldItems))[::-1]:
if fieldItems[i]['content'] != default['value']:
del fieldItems[i]
# 多选需要分割默认选项值,并且删掉无用的其他选项
if formItem['fieldType'] == 3:
if formItem['fieldType'] == '3':
fieldItems = formItem['fieldItems']
defaultValues = default['value'].split(',')
for i in range(0, len(fieldItems))[::-1]:
Expand All @@ -94,7 +96,7 @@ def fillForm(form):
if flag:
del fieldItems[i]
# 图片需要上传到阿里云oss
if formItem['fieldType'] == 4:
if formItem['fieldType'] == '4':
fileName = uploadPicture(default['value'])
formItem['value'] = getPictureUrl(fileName)
log('必填问题%d:' % sort + formItem['title'])
Expand Down Expand Up @@ -136,58 +138,64 @@ def getPictureUrl(fileName):

# 提交表单
def submitForm(formWid, address, collectWid, schoolTaskWid, form):
extension = {
"model": "OPPO R11 Plus",
"appVersion": "9.0.8",
"systemVersion": "9.1.0",
"userId": user['username'],
"systemName": "android",
"lon": user['lon'],
"lat": user['lat'],
"deviceId": str(uuid.uuid1()),
}
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 4.4.4; OPPO R11 Plus Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36 okhttp/3.12.4',
'User-Agent': 'Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36',
'CpdailyStandAlone': '0',
'extension': '1',
'Cpdaily-Extension': '1wAXD2TvR72sQ8u+0Dw8Dr1Qo1jhbem8Nr+LOE6xdiqxKKuj5sXbDTrOWcaf v1X35UtZdUfxokyuIKD4mPPw5LwwsQXbVZ0Q+sXnuKEpPOtk2KDzQoQ89KVs gslxPICKmyfvEpl58eloAZSZpaLc3ifgciGw+PIdB6vOsm2H6KSbwD8FpjY3 3Tprn2s5jeHOp/3GcSdmiFLYwYXjBt7pwgd/ERR3HiBfCgGGTclquQz+tgjJ PdnDjA==',
'Cpdaily-Extension': DESEncrypt(json.dumps(extension)),
'Content-Type': 'application/json; charset=utf-8',
# 请注意这个应该和配置文件中的host保持一致
'Host': host,
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip'
'Accept-Encoding': 'gzip',
}

# 默认正常的提交参数json
params = {"formWid": formWid, "address": address, "collectWid": collectWid, "schoolTaskWid": schoolTaskWid,
"form": form}
"form": form, "uaIsCpadaily": True}
# print(params)
submitForm = 'https://{host}/wec-counselor-collector-apps/stu/collector/submitForm'.format(host=host)
r = session.post(url=submitForm, headers=headers, data=json.dumps(params))
msg = r.json()['message']
return msg


# 发送邮件通知
title_text = '今日校园信息收集填写结果通知'

# 发送Server酱通知
def sendMessage(send, msg):
if send != '':
log('正在发送邮件通知。。。')
res = requests.post(url='http://www.zimo.wiki:8080/mail-sender/sendMail',
data={'title': '今日校园疫情上报自动提交结果通知', 'content': getTimeStr() + str(msg), 'to': send})
code = res.json()['code']
if code == 0:
log('发送邮件通知成功。。。')
else:
log('发送邮件通知失败。。。')
log(res.json())
log('正在发送Server酱')
res = requests.post(url='https://sctapi.ftqq.com/{0}.send'.format(config['Info']['ServerChan']),
data={'text': title_text, 'desp': getTimeStr() + "\n" + str(msg)})
log('发送请求已发出')


# 腾讯云函数启动函数
def main_handler(event, context):
try:
user = config['user']
log('当前用户:' + str(user['username']))
log('脚本开始执行。。。')
log('正在查询最新待填写问卷。。。')
log('脚本开始执行')
log('正在查询最新待填写问卷')
params = queryForm()
if str(params) == 'None':
log('获取最新待填写问卷失败,可能是辅导员还没有发布。。。')
log('获取最新待填写问卷失败,可能是辅导员还没有发布')
exit(-1)
log('查询最新待填写问卷成功。。。')
log('正在自动填写问卷。。。')
log('查询最新待填写问卷成功')
log('正在自动填写问卷')
form = fillForm(params['form'])
log('填写问卷成功。。。')
log('正在自动提交。。。')
log('填写问卷成功')
log('正在自动提交')
msg = submitForm(params['formWid'], user['address'], params['collectWid'],
params['schoolTaskWid'], form)
if msg == 'SUCCESS':
Expand All @@ -196,18 +204,17 @@ def main_handler(event, context):
elif msg == '该收集已填写无需再次填写':
log('今日已提交!')
else:
log('自动提交失败。。。')
log('自动提交失败')
log('错误是' + msg)
sendMessage(user['email'], '自动提交失败!错误是' + msg)
exit(-1)
except:
return 'auto submit fail.'
except Exception as r:
return '未知错误 %s' %(r)
else:
return 'auto submit success.'



# 配合Windows计划任务等使用
if __name__ == '__main__':
print(main_handler({}, {}))
# for user in config['users']:
# log(getCpdailyApis(user))
Loading