EcnYou微信小程序,华东师范大学校园辅助服务。
为了开源不暴露敏感信息,设置了某些配置文件不被Git管理。
添加cloudfunctions/sendEmail2/config.js
和cloudfunctions/mainTrigger/config.js
,以如下格式:
module.exports = {
//邮件配置
email: {
service: '邮件服务,如QQ',
user: '发送方邮件地址',
pass: '权限密码',
}
}
还需在邮箱设置中开启SMTP等服务,同时可以获取到权限密码在此填入。
其它需补充的配置文件,见.gitignore
文件中的描述。
npm install
对于使用了爬虫的云函数(如webCrawler
和crawInNextTable
),还应:
npm install superagent
npm install cheerio
对于使用了邮箱服务的云函数(如mainTrigger
和sendEmail2
),还应:
npm install nodemailer
以生成package-lock.json
,这样上传后云端才知道安装哪些包。
集合有:academy
、codes
、metaData
、reportMsgA
、reportMsgB
、users
、diffMsg
。
在metaData
中补充运行所需的元信息,具体是:
{
"_id": "1",
"email_num": 0,
"lastTable": "reportMsgA",
"nextTable": "reportMsgB",
"start": -1
}
在微信开发者工具中右键上传即可。另外在云开发中设置各个云函数的超时时间,批量发邮件和爬取信息需要较长时间,最多可以设置20秒。
-
breakBinding
用户解除绑定邮箱 -
crawInNextTable
实际是个触发器。爬取数据,写入next集合(见metaData集合) -
diffTrigger
从新旧集合生成每个学院的更新HTML,写入diffMsg集合并返回 -
exchangeTrigger
交换在metaData中的AB表 -
getAcademy
获取新表中学院id->[{name:"讲座标题",url:"完整url"},...]的映射信息 -
getDataOrigin
获取数据源数字并解析成['sei','cs']的形式 -
mainTrigger
形成邮件并按订阅发给用户 -
sendEmail2
向用户发送邮件,传入主题、收件人、内容HTML -
sendVerifyCode
用户尝试提交验证码,以完成邮箱绑定(用户向服务器send验证码) -
sendVerifyEmail
用户尝试绑定邮箱,输入了邮箱,生成并向用户发送一个4位验证码邮件(向用户邮箱send邮件) -
setDataOrigin
用户保存设置的订阅数据源 -
webCrawler
用于测试爬取效果、首次爬取数据源信息、数据源当前信息,仅用于本地执行的云函数
页面均在pages
目录下,每个页面占有一个子目录。
-
academic-report
学术报告 -
index
主页面 -
settings
设置 -
settings/data-origin
数据源设置 -
settings/notice
邮件设置 -
todo-list
计划任务
由于云开发服务器的性能非常非常差,且超时时间最多只有20秒,且每次查询最多100条,不得不将业务分开写,并用多次随机执行的方式保证爬取效果
-
一次
resetTrigger
,重置所有学院为未爬取(crawed:false
),未diff(diffed:false
),重置metaData中邮件发送编号为0(email_num: 0
)。 时机:每天19:00 -
一次
exchangeTrigger
,交换在metaData中的AB表。 时机:每天19:01 -
若干次
crawInNextTable
爬取新信息,对于为crawed:true
状态的学院不再爬取。 时机:每天19:03-19:23,每25秒运行一次(最坏情况:33个数据源每个都失效,卡25秒) -
若干次
diffTrigger
,将diff信息写入diffMsg表,对于为diffed:true
的学院不再做此操作。 时机:每天19:27-19:29,每25秒运行一次 -
若干次
mainTrigger
向用户发邮件,每次发送uid
在max_num
小区间内(email_num<=uid<email_num+max_num
)的用户,发送后设置email_num+=max_num
。 时机:每天19:30-19:59,每25秒运行一次(如max_num=5
这样至少可以服务300个用户,视用户数目延后结束时间)
-
个人用户不能在小程序中使用链接。
-
云开发取数据,小程序端每次最多返回20条,云函数中最多返回100条。
-
在云函数中,无法使用
success
和fail
的方式回调,必须用then=>res{}
。 -
云函数默认超时时间为3秒,在云开发控制台中,云函数一栏下可以修改最多至20秒。