protected async override Task <int> OnExecuteAsync(CommandLineApplication app) { Log.Information("User: {username}", Username); Log.Information("School: {school}", SchoolName); CpdailyCore cpdaily = new CpdailyCore(); string cookies = null; SchoolDetails schoolDetails = null; try { Log.Information("正在获取 {info} ...", "SecretKey"); var secretKeyTask = cpdaily.GetSecretKeyAsync(); Log.Information("正在获取 {info} ...", "学校列表"); var schools = await cpdaily.GetSchoolsAsync(); Log.Information("正在获取 {info} ...", "学校ID"); var school = schools.Where(x => x.Name == SchoolName).FirstOrDefault(); var schoolDetailsTask = cpdaily.GetSchoolDetailsAsync(school, await secretKeyTask); Type loginWorkerType = Utils.GetLoginWorkerByName(SchoolName); ILoginWorker loginWorker = null; if (loginWorkerType != null) { Log.Information("使用专门登录适配器 <{LoginWorkerTypeName}>", loginWorkerType.Name); loginWorker = (ILoginWorker)Activator.CreateInstance(loginWorkerType); } else { Log.Information("使用通用登录适配器 <{LoginWorkerTypeName}>", "DefaultLoginWorker"); loginWorker = new DefaultLoginWorker(); } Log.Information("正在获取登录所需参数..."); schoolDetails = await schoolDetailsTask; var parameter = await loginWorker.GetLoginParameter(Username, Password, schoolDetails.GetIdsLoginUrl()); if (parameter.NeedCaptcha) { Log.Information("需要验证码!"); throw new Exception("需要验证码!暂时无法处理!"); } Log.Information("正在登录..."); cookies = await loginWorker.IdsLogin(parameter); Log.Information("登录成功, Cookie: {cookie}", cookies); // remove before adding to avoid duplication. AppConfig.Users.RemoveAll(x => x.Username == Username); AppConfig.Users.Add(new User() { Username = Username, Password = Password }); AppConfig.SchoolName = SchoolName; SaveAppConfig(); } catch (Exception ex) { Log.Error("登录过程中出现异常!"); Log.Error(ex.Message); Log.Error(ex.StackTrace); return(1); } try { Log.Warning("下面进行表单向导,模拟完成一次历史表单,让程序学习如何填写表单。"); Log.Information("获取历史表单..."); var forms = await cpdaily.GetFormItemsHistoryAsync(schoolDetails.GetAmpUrl(), cookies); if (forms.Length == 0) { throw new Exception("没有获取到历史表单,表单向导无法继续!"); } Log.Information("获取到 {count} 条历史表单记录,请选择其中一条(输入序号):", forms.Length); for (int i = 0; i < forms.Length; i++) { Log.Information("{No}. {Title}", i + 1, forms[i].Title); } int index = Convert.ToInt32(Console.ReadLine()) - 1; FormItem form = forms[index]; var formFields = await cpdaily.GetFormFieldsAsync(schoolDetails.GetAmpUrl(), cookies, form.WId, form.FormWId); var requiredFields = formFields.Where(x => x.IsRequired == true).ToArray(); Log.Information("获取到 {count} 条必填字段", requiredFields.Length); List <FormFieldChange> result = new List <FormFieldChange>(); for (int i = 0; i < requiredFields.Length; i++) { FormField field = requiredFields[i]; var typeString = field.FieldType switch { 1 => "填空", 2 => "单选", 3 => "多选", 4 => "图片", _ => "未知", }; Log.Information("{No}. {Title} ({type}):", i + 1, field.Title, typeString); Log.Information("描述: {Description}", string.IsNullOrEmpty(field.Description) ? "无" : field.Description); if (field.FieldType == 1) { Log.Information("请输入文本:"); string value = Console.ReadLine(); var c = new FormFieldChange() { FieldType = field.FieldType, Title = field.Title, Value = value }; result.Add(c); } else if (field.FieldType == 2) { for (int t = 0; t < field.FieldItems.Count; t++) { FieldItem item = field.FieldItems[t]; Log.Information("\t{No}.{Title}", t + 1, item.Content); } Log.Information("请输入选项序号:"); int value = Convert.ToInt32(Console.ReadLine()) - 1; var c = new FormFieldChange() { FieldType = field.FieldType, Title = field.Title, Value = field.FieldItems[value].Content }; result.Add(c); } else { throw new Exception("暂不支持这种类型,请到 Github 提出 issues!"); } } Log.Information("表单向导完成!"); AppConfig.FormFields = result; SaveAppConfig(); } catch (Exception ex) { Log.Error("表单向导过程中出现异常!"); Log.Error(ex.Message); Log.Error(ex.StackTrace); return(1); } return(await base.OnExecuteAsync(app)); }
protected async override Task <int> OnExecuteAsync(CommandLineApplication app) { if (string.IsNullOrEmpty(AppConfig.SchoolName) || AppConfig.Users.Count == 0) { Log.Error("学校名称或账号列表为空! 请先执行 init 指令初始化配置文件。"); return(1); } CpdailyCore cpdaily = new CpdailyCore(); string SchoolName = AppConfig.SchoolName; string cookies = null; SchoolDetails schoolDetails = null; try { Log.Information("正在获取 {info} ...", "SecretKey"); var secretKeyTask = cpdaily.GetSecretKeyAsync(); Log.Information("正在获取 {info} ...", "学校列表"); var schools = await cpdaily.GetSchoolsAsync(); Log.Information("正在获取 {info} ...", "学校ID"); var school = schools.Where(x => x.Name == SchoolName).FirstOrDefault(); var schoolDetailsTask = cpdaily.GetSchoolDetailsAsync(school, await secretKeyTask); Type loginWorkerType = Utils.GetLoginWorkerByName(SchoolName); ILoginWorker loginWorker = null; if (loginWorkerType != null) { Log.Information("使用专门登录适配器 <{LoginWorkerTypeName}>", loginWorkerType.Name); loginWorker = (ILoginWorker)Activator.CreateInstance(loginWorkerType); } else { Log.Information("使用通用登录适配器 <{LoginWorkerTypeName}>", "DefaultLoginWorker"); loginWorker = new DefaultLoginWorker(); } Log.Information("正在获取登录所需参数..."); schoolDetails = await schoolDetailsTask; var parameter = await loginWorker.GetLoginParameter(Username, Password, schoolDetails.GetIdsLoginUrl()); if (parameter.NeedCaptcha) { Log.Information("需要验证码!"); throw new Exception("需要验证码!暂时无法处理!"); } Log.Information("正在登录..."); cookies = await loginWorker.IdsLogin(parameter); Log.Information("登录成功, Cookie: {cookie}", cookies); // remove before adding to avoid duplication. AppConfig.Users.RemoveAll(x => x.Username == Username); AppConfig.Users.Add(new User() { Username = Username, Password = Password }); SaveAppConfig(); } catch (Exception ex) { Log.Error("登录过程中出现异常!"); Log.Error(ex.Message); Log.Error(ex.StackTrace); return(1); } return(await base.OnExecuteAsync(app)); }
protected async override Task <int> OnExecuteAsync(CommandLineApplication app) { if (AppConfig.Users.Count == 0) { Log.Error("没有找到任何用户,请执行 init 指令初始化配置文件。"); return(1); } if (string.IsNullOrEmpty(AppConfig.SchoolName)) { Log.Error("学校名称字段不可为空!请检查配置文件或执行 init 指令初始化配置文件!"); return(1); } if (AppConfig.FormFields.Count == 0) { Log.Error("没有找到任何表单字段!请检查配置文件或执行 init 指令初始化配置文件!"); return(1); } CpdailyCore cpdaily = new CpdailyCore(); string SchoolName = AppConfig.SchoolName; SchoolDetails schoolDetails = null; ILoginWorker loginWorker = null; try { Log.Information("正在获取 {info} ...", "SecretKey"); var secretKeyTask = cpdaily.GetSecretKeyAsync(); Log.Information("正在获取 {info} ...", "学校列表"); var schools = await cpdaily.GetSchoolsAsync(); Log.Information("正在获取 {info} ...", "学校ID"); var school = schools.Where(x => x.Name == SchoolName).FirstOrDefault(); schoolDetails = await cpdaily.GetSchoolDetailsAsync(school, await secretKeyTask); Type loginWorkerType = Utils.GetLoginWorkerByName(SchoolName); if (loginWorkerType != null) { Log.Information("使用专门登录适配器 <{LoginWorkerTypeName}>", loginWorkerType.Name); loginWorker = (ILoginWorker)Activator.CreateInstance(loginWorkerType); } else { Log.Information("使用通用登录适配器 <{LoginWorkerTypeName}>", "DefaultLoginWorker"); loginWorker = new DefaultLoginWorker(); } } catch (Exception ex) { Log.Error("获取基本参数时出现异常!"); Log.Error(ex.Message); Log.Error(ex.StackTrace); return(1); } for (int i = 0; i < AppConfig.Users.Count; i++) { string Username = AppConfig.Users[i].Username; string Password = AppConfig.Users[i].Password; string cookies = null; try { Log.Information("正在登录 {username} ...", Username); Log.Information("正在获取登录所需参数..."); var parameter = await loginWorker.GetLoginParameter(Username, Password, schoolDetails.GetIdsLoginUrl()); if (parameter.NeedCaptcha) { Log.Information("需要验证码!"); throw new Exception("需要验证码!暂时无法处理!"); } Log.Information("正在登录..."); cookies = await loginWorker.IdsLogin(parameter); Log.Information("登录成功, Cookie: {cookie}", cookies); } catch (Exception ex) { Log.Error("登录过程中出现异常!"); Log.Error(ex.Message); Log.Error(ex.StackTrace); } try { var formItems = await cpdaily.GetFormItemsAsync(schoolDetails.GetAmpUrl(), cookies); Log.Information("找到了 {count} 个未填表单!", formItems.Length); foreach (var form in formItems) { Log.Information("正在获取表单的字段..."); var formFields = await cpdaily.GetFormFieldsAsync(schoolDetails.GetAmpUrl(), cookies, form.WId, form.FormWId); var requiredFields = formFields.Where(x => x.IsRequired == true).ToArray(); if (requiredFields.Length != AppConfig.FormFields.Count) { var desc = $"配置文件中的表单字段数量({AppConfig.FormFields.Count})与需要的表单字段数量({requiredFields.Length})不一样!"; throw new Exception(desc); } for (int t = 0; t < requiredFields.Length; ++t) { requiredFields[t] = CpdailyCore.MergeToFormField(requiredFields[t], AppConfig.FormFields[t]); } Log.Information("提交表单中..."); await cpdaily.SubmitForm(schoolDetails.GetAmpUrl(), cookies, form, requiredFields, AppConfig.Address, AppConfig.Latitude, AppConfig.Longitude); Log.Information("表单提交成功!"); } } catch (Exception ex) { Log.Error("提交表单时出现异常!"); Log.Error(ex.Message); Log.Error(ex.StackTrace); } } return(await base.OnExecuteAsync(app)); }