From 66d5c70ca85767a9c249b02776034fb3ee6cbbee Mon Sep 17 00:00:00 2001 From: UnknownObject Date: Tue, 1 Oct 2024 23:26:39 +0800 Subject: [PATCH] first commit --- .idea/.gitignore | 10 + .idea/AnQuanWeiBan.iml | 8 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/inspectionProfiles/Project_Default.xml | 16 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + captcha_img.py | 87 ++++++++ exam.py | 165 ++++++++++++++ main.py | 89 ++++++++ weibanapi.py | 208 ++++++++++++++++++ 12 files changed, 615 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/AnQuanWeiBan.iml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 captcha_img.py create mode 100644 exam.py create mode 100644 main.py create mode 100644 weibanapi.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..89b9b56 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# 屏蔽图片 +.png \ No newline at end of file diff --git a/.idea/AnQuanWeiBan.iml b/.idea/AnQuanWeiBan.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/AnQuanWeiBan.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..a421212 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a6218fe --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a04f8ed --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/captcha_img.py b/captcha_img.py new file mode 100644 index 0000000..9168148 --- /dev/null +++ b/captcha_img.py @@ -0,0 +1,87 @@ +import cv2 +import requests +import os +import json + +# 全局变量,用来存储点击的坐标和次数 +clicks = [] +count = 0 +max_clicks = 0 + + +def download_image(url): + try: + # 获取图片的内容 + response = requests.get(url, stream=True) + response.raise_for_status() # 检查请求是否成功 + + # 从URL中提取图片文件名 + filename = url.split("/")[-1] + + # 确定保存路径 + filepath = os.path.join(os.getcwd(), filename) + + # 检查文件是否已经存在,若存在则删除旧文件 + if os.path.exists(filepath): + os.remove(filepath) + print(f"文件 '{filename}' 已存在,旧文件已删除。") + + # 以二进制写入方式保存图片 + with open(filepath, 'wb') as file: + for chunk in response.iter_content(1024): # 分块下载 + file.write(chunk) + + return filepath # 返回保存的文件路径 + except Exception as e: + print(f"Error: {e}") + return None + +# 鼠标点击事件的回调函数 +def mouse_callback(event, x, y, flags, param): + global count, max_clicks, clicks + + # 如果检测到左键点击事件 + if event == cv2.EVENT_LBUTTONDOWN: + if count < max_clicks: + count += 1 + clicks.append((x, y)) + # 在点击的位置绘制点击次数 + cv2.putText(img, str(count), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2) + cv2.imshow('Image', img) + + # 当达到指定的点击次数时,关闭窗口 + if count >= max_clicks: + cv2.destroyAllWindows() + +# 主函数,接受图片路径和点击次数 +def captcha_main(image_path, num_clicks): + global img, max_clicks, clicks, count + clicks = [] + count = 0 + max_clicks = num_clicks + + # 读取图像 + img = cv2.imread(image_path) + if img is None: + print("Error: Could not load image.") + return + + # 创建一个窗口并显示图片 + cv2.namedWindow('Image') + cv2.imshow('Image', img) + + # 设置鼠标点击回调函数 + cv2.setMouseCallback('Image', mouse_callback) + + # 等待用户关闭窗口 + cv2.waitKey(0) + + # 返回点击的坐标 + pos_list = [{'x': x, 'y': y} for x, y in clicks] + return json.dumps(pos_list) + +# if __name__ == "__main__": +# image_path = "G:\\Users\\15819\\Desktop\\14_3.png" # 替换为你的图片路径 +# num_clicks = 3 # 替换为你需要的点击次数 +# click_coordinates = captcha_main(image_path, num_clicks) +# print("点击的坐标: ", click_coordinates) \ No newline at end of file diff --git a/exam.py b/exam.py new file mode 100644 index 0000000..f7e2e8d --- /dev/null +++ b/exam.py @@ -0,0 +1,165 @@ +import requests +import json + + +# 随手写的 目前只针对2024版 + + +def get_tenantCode(schoolName): + url = 'https://weiban.mycourse.cn/pharos/login/getTenantListWithLetter.do?timestamp=1713318535.868' + + headers = { + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36', + 'x-token': f'{x_token}' + } + + schoolList = [] + Code = '' + + r = requests.post(url, headers=headers) + data = json.loads(r.text)['data'] + for i in data: + l = i['list'] + schoolList = schoolList + l + for school in schoolList: + if school['name'] == schoolName: + Code = school['code'] + break + return Code + + +# 懒得写了 F12吧 后续有时间再完善 +# def get_userID_token(): +# url = 'https://weiban.mycourse.cn/pharos/login/login.do?timestamp=1713319251.071' + + +# 获取已完成考试题目答案 +def get_questions_answers(): + url = 'https://weiban.mycourse.cn/pharos/exam/reviewPaper.do' + data = { + 'tenantCode': f'{tenantCode}', + 'userId': f'{userId}', + 'userExamId': f'{userExamId}', + 'isRetake': 2 + } + + r = requests.post(url, data=data, headers=headers) + + content = json.loads(r.text)['data']['questions'] + + questions_answers = {} + + for question in content: + answers = [] + optionList = question['optionList'] + for i in optionList: + if i['isCorrect'] == 1: + answers.append(i['content']) + questions_answers[question['title']] = answers + + return questions_answers + + +# 获取当前考试题目列表 +def get_questions_List(): + url = 'https://weiban.mycourse.cn/pharos/exam/startPaper.do' + data = { + 'tenantCode': f'{tenantCode}', + 'userId': f'{userId}', + 'userExamPlanId': f'{userExamPlanId}' + } + + r = requests.post(url, data=data, headers=headers) + + content = json.loads(r.text)['data']['questionList'] + + questions = {} + + for question in content: + key = (question['id'], question['title']) + optionList = question['optionList'] + answers = [] + for i in optionList: + id,content = i['id'],i['content'] + answers.append((id,content)) + questions[key] = answers + + return questions + + +# 答题 +def recordQuestion(questionId, answerIds): + url = 'https://weiban.mycourse.cn/pharos/exam/recordQuestion.do?timestamp=1713258614.138' + + data = { + 'tenantCode': f'{tenantCode}', + 'userId': f'{userId}', + 'userExamPlanId': f'{userExamPlanId}', + + 'questionId': f'{questionId}', + 'useTime': 3600, + 'answerIds': f'{answerIds}', + + 'examPlanId': f'{examPlanId}' + } + + r = requests.post(url, data=data, headers=headers) + content = json.loads(r.text) + print(content) + + +# 提交 +def submit(): + url = 'https://weiban.mycourse.cn/pharos/exam/submitPaper.do?timestamp=1713262229.987' + data = { + 'tenantCode': f'{tenantCode}', + 'userId': f'{userId}', + 'userExamPlanId': f'{userExamPlanId}' + } + + r = requests.post(url, data=data, headers=headers) + content = json.loads(r.text) + print(content) + + +if __name__ == '__main__': + # 运行之前一定填写好下面的参数 + userId = 'eec6b514-93d6-4516-9e6a-e45cc3ce980c' # 用户ID + x_token = '57ba12f6-8ef6-4d62-8103-cb97a1bd4bbe' # 校验 + examPlanId = '64df03f5-55b5-47f6-a4cc-c63f42a63d49' # 考试项目ID + + userExamId = '8f4eecda-cbbf-42fd-8af5-7d6ba6c5366a' # 已完成考试ID + userExamPlanId = '12c76711-e7ed-475f-8b3c-0c03354c420d' # 开始考试后当前考试ID + + headers = { + 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36', + 'x-token': f'{x_token}' # 关键参数token + } + + #tenantCode = get_tenantCode('烟台大学') # 学校Code + tenantCode = '4137011066' # 学校Code + + questions_answers = get_questions_answers() + # questions_answers = {'使用安全锤打开车窗的话,敲打哪里好呢?': ['车窗的角落。'], '关于发展心理咨询,下面说法正确的是:': ['发展心理咨询是心理健康的人对未来发展有困惑时做的咨询。'], '如果真的压力太大,放弃或者暂时放弃也是可以的,放过自己,让自己舒服一些更重要。可以选择一些自己喜欢的方式继续生活。旅游,工作,休息,不要强迫自己继续,也不要放弃自己。': ['正确'], '下列不属于研究生遇到的常见就业压力是:': ['缺乏专业相关经验'], '“京东金融客服来电,要求进行操作变更,否则会影响征信。”这样的诈骗方式利用了人的什么弱点呢?': ['恐惧'], '在古代,人们对江湖行骗种类进行了总结,其中最常见的四类是:': ['蜂麻燕雀'], '有网友给你推荐了一个可以超低价购买游戏装备的网站,你应该?': ['直接拒绝'], '如果你接到电话,对面说“我是省公安厅的,你的身份证号是XXX,你涉嫌洗钱”,你觉得这句话哪里有问题?': ['在公安系统中,省公安厅和市公安局的民警一般是不办案的'], '赌博的人是否也容易陷入校园贷?': ['是'], '根据《刑法》规定,编造虚假险情造成严重后果的,会被判处?': ['三年以上七年以下有期徒刑'], '网络赌博总是输的原因是?': ['有内幕'], '小A在网络上认识了一位未成年人,见未成年人对性不了解,骗对方给自己拍私密照片,并视频聊天自慰。你认为小A:': ['可能涉嫌强制猥亵罪'], '负有危险化学品安全监督管理职责的部门依法进行监督检查,监督检查人员不得少于()人,并应当出示执法证件;有关单位和个人对依法进行的监督检查应当予以配合,不得拒绝、阻碍。': ['2'], '帮骗子发送病毒文件,是违法犯罪行为吗?': ['是'], '根据《中华人民共和国刑法修正案(九)》规定,明知他人利用信息网络实施犯罪,为其犯罪提供互联网接入、服务器托管、网络存储、通讯传输等技术支持,或者提供广告推广、支付结算等帮助,情节严重的行为,处( )有期徒刑或者拘役,并处或者单处罚金。': ['三年以下'], '一次性打火机,只晒多长时间就会爆炸呢?': ['12分钟。'], '小A求复合失败后,在网络上发布前女友隐私视频,可能会涉嫌?': ['侮辱罪'], '如果购物网站的客服要加你微信沟通退款,你应该?': ['拒绝'], '如果患者还有意识和反应,不要实施CPR,不要挪动被施救人员,应立刻拨打120。': ['正确'], '大一新生文文突然接到社保局电话,说自己的社保卡被锁了,可以按照电话里的提示解锁。这时文文警惕的说,是不是可以到社保局去解锁。对方慌忙地挂断了电话。文文的这个做法对吗?为什么?': ['对。为了防止被骗,可以到社保局询问,或打官方电话询问。如果真的被锁了,可以到社保局解锁。'], '我们的发展目标是在( ),国家安全体系和能力全面加强。': ['二O三五年'], '研究生的人际关系压力通常有:': ['很多时候会觉得孤独', '与寝室、同学有矛盾', '与同学之间的恶意竞争氛围', '和导师有矛盾'], '要预防AI换脸诈骗,我们应该怎么做?': ['自己回拨手机存储的电话确认', '多重验证,确认身份,比如问一些没有在网络聊天中提过的信息', '关注社会新闻,了解最新诈骗手段'], '灭火器的厂家钢印和生产日期,一般在哪里?': ['灭火器的底圈', '灭火器的颈圈'], '以下哪些行为属于学术不端?': ['买卖论文', '伪造数据、文献', '剽窃、抄袭、侵占他人学术成果', '虚构他人共同署名'], '网贷诈骗怎么“赚钱”的?': ['高额手续费、违约金、保证金', '用各种理由骗你续费进去', '质押合同', '骗取银行卡验证码等信息'], '抑郁症患者的症状可能有?': ['心情低落,与处境不相符', '悲痛欲绝,甚至木僵', '明显的焦虑和运动性激越', '自伤、自杀'], '小张在施工项目实习时,在施工楼下行走,被楼上掉下来的小零件砸伤脚趾,以下哪些是可能导致小张受伤的原因?': ['施工楼没有正在施工的提醒标识', '小张缺乏安全意识', '施工队安全管理疏漏,没有按期检查隐患', '小张穿了露趾凉鞋'], '以下哪些属于新兴领域安全?': ['太空', '深海', '极地', '生物'], '网贷诈骗常用的宣传词有:': ['“低门槛”', '“秒放款”', '“无抵押”', '“无担保”'], '“挖矿”的危害有哪些?': ['加速计算机老化', '消耗大量的电力资源、碳排放量大', '容易引发网络安全问题', '成为违法犯罪活动的工具'], '断卡行动打击“两卡”买卖链条上的所有人,包括:': ['开卡团伙', '带队团伙', '收卡团伙', '贩卡团伙'], '当我们面对陌生来电时,应该怎么办呢?': ['陌生来电最好不接', '如果对方自称公检法,一律挂掉找官方号码拨打求证', '有任何疑问向警方求助', '转账多思考,不听对方催促'], '遭遇到关系欺凌后,正确应对的方法是?': ['转移注意力,尝试新的朋友圈', '找到信赖的朋友,进行倾诉', '寻求心理咨询'], '以下哪种行为不属于性骚扰?': ['夸赞对方:“你的肌肉练得真好!怎么练的能告诉我秘诀吗?”', '对女友讲个荤段子,女友害羞的锤了我一拳'], '下面哪些可以作为火场逃生装备,在家中常备?': ['防烟面罩', '灭火毯'], '研究生学业可能遇到的难题包括:': ['枯燥的文献看不懂', '完全不了解/不擅长做实验', '学习安排与大学变化较大', '遇到问题孤立无援,只能自己想办法解决', '论文投稿总是被拒绝'], '研究生生活和大学生活会有什么不同?': ['有更高的学业压力', '缺少丰富的社交活动', '对自我管理能力的要求更高', '更接近社会人情百态'], '为什么研究生与本科生相比,适合的岗位反而更少呢?': ['大部分的岗位职责会更适合大学学历人群', '研究生的自我要求会比大学学历的更高', '企业出于成本的考虑', '简单的工作对于研究生会缺乏积极性,增加离职风险'], '以下哪些行为属于妨碍安全疏散的违法行为?': ['将杂物堆在楼梯处', '学生宿舍楼安装防盗窗网', '在家门口楼道里堆放物品', '安全通道门上锁'], '深海安全是指和平探索和利用国际深海区域,增强( )的能力,维护我国国际深海区域的活动、资产的安全,以及深海发展利益相对处于没有危险和不受内外威胁的状态。': ['安全进出', '科学考察', '开发利用'], '宿舍禁止行为有哪些?': ['使用热得快', '使用大功率吹风机', '吃火锅'], '对欺凌说“不”,我们要做到:': ['自尊', '自爱', '自信'], '总体国家安全观的重大意义有哪些?': ['总体国家安全观是中国国家安全理论的最新成果', '总体国家安全观是指导国家安全工作的强大思想武器', '总体国家安全观是保障实现中华民族伟大复兴的新理念'], '自杀前,一般会有哪些行为上的征兆?': ['出现突然的、明显的行为改变', '有过自伤行为', '急性的性格改变', '饮酒或吸毒量的增加'], '以下哪些是心理咨询的特点?': ['求助者和心理咨询师之间是陌生的。', '职业保密原则。', '价值中立原则。', '不解决实际问题,让求助者自己做决定。'], '安全生产监督管理部门和其他负有安全生产监督管理职责的部门对生产经营单位实施监督管理职责时,遵循()基本原则。': ['坚持“有法必依、执法必严、违法必究”的原则', '坚持以事实为依据,以法律为准绳的原则', '坚持行为监察与技术监察相结合的原则', '坚持预防为主、教育与惩罚、监察与服务相结合的原则'], '我们应该如何做,才能避免网络暴力的悲剧一再发生呢?': ['要学会辨识信息,不权威不轻信', '发言前多考虑是否会对他人产生影响、伤害他人', '看到不良言论及时向平台举报', '不去过度追逐“热点事件”,不发表带有强烈主观色彩、抨击他人的评论'], '网络不良信息的危害有哪些?': ['扰乱社会秩序', '影响社会稳定', '降低道德水平', '诱发违法犯罪'], '以下哪些手机充电行为存在安全隐患?': ['手机放在被子里充电', '手机放在大太阳下充电', '手机充满电后,插头没有拔下,电源也未关闭'],'当在网络上遇到需要进行现金交易,并要求不断增加数额时,你应该': ['想到止损线,停顿犹豫'], '溺水的时候浮上水面应该怎么做:': ['让口鼻露出水面,鼻子呼气嘴吸气,大声呼救。'], '如果真的压力太大,放弃或者暂时放弃也是可以的,放过自己,让自己舒服一些更重要。可以选择一些自己喜欢的方式继续生活。旅游,工作,休息,不要强迫自己继续,也不要放弃自己。': ['正确'], '如果看到听到黄谣,我们不应该做的是:': ['求资源求视频,求八卦'], '大一新生小蕊接到电话,对方说她可以领取助学金,让她提供银行卡号,身份证和密码,直接把钱汇到她的账户上。小蕊这时应该怎么做呢?': ['任何时候都不能同时提供重要的“三信息”(银行卡号、身份证和密码)给陌生人。'], '随意将别人的裸照发到网上,会违法吗?': ['会'], '是不是所有的负面情绪都应该被抑制?': ['不,负面情绪也有存在的意义'], '刘某与谭某恋爱并发生了性关系,刘某偷拍了性爱视频以及裸照。谭某提出分手后,刘某一直用裸照相威胁。 \r\n刘某以裸照威胁谭某上车,后欲发生性关系,谭某借口上厕所,给同学发了求助信息。回到车上后,刘某还想强行发生性关系,谭某仍然不肯,因有人路过,刘某怕被发现并未成功。\r\n你觉得刘某属于:': ['强奸未遂,按强奸罪论'], '电动自行车可以搭载一个12周岁以下的未成年人,电动轻便摩托车也可以搭载一个12周岁的未成年人——此说法正确吗?': ['错误'], '作为中华民族的一员,作为当代大学生,我们要有铸牢中华民族共同体的意识 ,并且要为之行动,我们应当做到:': ['“五个认同” “四个自信”'], '根据《刑法》规定,编造虚假险情造成严重后果的,会被判处?': ['三年以上七年以下有期徒刑'], '《数据安全法》中的数据指的是:': ['任何以电子或者其他方式对信息的记录'], '面对林林总总的网络谣言,正确的做法是?': ['不理睬、不传播'], '以下哪种措施可以保护终端安全?': ['使用强密码'], '防范挖矿病毒,下列做法不正确的是?': ['已经不再使用的电脑也每天打开做备用机'], '所有专业的研究生生活都是一样的,只要好好学习,不管其他事情,写完论文就可以毕业了。': ['错误'], '喝酒后不能开车,但是骑电动自行车和自行车是可以的。': ['错误'], '我国的“全民国家安全教育日”是哪一天?': ['4.15'], '安全生产五要素包括安全文化、安全法制、安全责任、()、和安全投入。': ['安全科技'], '不具有爆炸性的粉尘有()。': ['血液'], '“紫菜都是塑料做的”属于哪种类型的谣言?': ['食品及产品谣言'], '科学研究标明,跑步能提高人的心理健康程度。': ['正确'], '以下哪个选项与“亡羊补牢”意思最接近?': ['往者不可谏,来者犹可追'], '网络赌博总是输的原因是?': ['有内幕'], '根据《中华人民共和国刑法修正案(九)》规定,明知他人利用信息网络实施犯罪,为其犯罪提供互联网接入、服务器托管、网络存储、通讯传输等技术支持,或者提供广告推广、支付结算等帮助,情节严重的行为,处( )有期徒刑或者拘役,并处或者单处罚金。': ['三年以下'], '海姆立克急救法有腹部冲击法和胸部冲击法,腹部冲击法适用于大众体型,胸部冲击法适用于体型较大人员或孕妇。': ['对'], '学生宿舍突然停电时,宿舍管理规定会要求你怎么做?': ['切断处于使用状态的电器电源'], '赌博的人是否也容易陷入校园贷?': ['是'], '如果某网站客服给你发送不明链接,并要求你填写银行卡信息,你应该?': ['拒绝'], '具有C2驾驶证,就可以骑电动摩托车,因为电动摩托车也是机动车。——这种说法正确吗?': ['错误'], '对方给你发来一个逮捕令,看起来非常正规,你觉得这个逮捕令是否有威慑力?': ['不。还是嫌疑人的情况下,就可以看到“密函”,难道穿越回了古代?'], '以下哪些是心理咨询的特点?': ['求助者和心理咨询师之间是陌生的。', '职业保密原则。', '价值中立原则。', '不解决实际问题,让求助者自己做决定。'], '以下哪些不是利用受害者“恐惧”心理进行诈骗的?': ['兼职诈骗', '投资诈骗'], '高等学校实验室安全项目检查表中关于“个人防护”说法正确的是()。': ['实验人员需配备合适的个人防护用具', '个人防护用具分散存放,并有明显标识', '各类个人防护器具的使用有培训及定期检查维护记录'], '小张在施工项目实习时,在施工楼下行走,被楼上掉下来的小零件砸伤脚趾,以下哪些是可能导致小张受伤的原因?': ['施工楼没有正在施工的提醒标识', '小张缺乏安全意识', '施工队安全管理疏漏,没有按期检查隐患', '小张穿了露趾凉鞋'], '下列属于释放压力的好办法的是:': ['运动', '给自己设立小目标,尽力去完成', '多参加社交活动/实践活动', '做一些自己喜欢/感兴趣的事情'], '帮信罪的常见方式有:': ['把电话卡、银行卡出售给诈骗分子', '帮诈骗分子拉群', '帮诈骗分子解决技术问题方便实施诈骗', '给诈骗提供广告推广'], '为什么研究生与本科生相比,适合的岗位反而更少呢?': ['大部分的岗位职责会更适合大学学历人群', '研究生的自我要求会比大学学历的更高', '企业出于成本的考虑', '简单的工作对于研究生会缺乏积极性,增加离职风险'], '心肺复苏术操作步骤有哪些?': ['确定现场环境是否安全', '确定患者意识', '拨打120急救电话', '检查呼吸', '无反应+无呼吸或仅喘息=实施CPR'], '对欺凌说“不”,我们要做到:': ['自尊', '自爱', '自信'], '以下哪些属于新兴领域安全?': ['太空', '深海', '极地', '生物'], '过度的消极情绪会造成?': ['破坏人际关系', '影响学习和工作效率', '引发心理疾病', '引发生理疾病'], '以下哪些是心理危机的正确应对措施?': ['自我转化', '自我宣泄', '自我慰藉'], '如果遭遇偷拍该怎么办呢?': ['及时保留证据', '第一时间报警', '积极配合警方或学校惩罚偷拍者'], '考上研究生,要想顺利度过研究生与大学的过渡期,不仅需要做好学业方面的准备,还需要做好:': ['心理准备', '了解研究生生活的准备'], '宿舍禁止行为有哪些?': ['使用热得快', '使用大功率吹风机', '吃火锅'], '网贷诈骗怎么“赚钱”的?': ['高额手续费、违约金、保证金', '用各种理由骗你续费进去', '质押合同', '骗取银行卡验证码等信息'], '研究生造成学业压力的原因可以大致分为两类,分别是:': ['内在压力', '外在压力'], '网贷诈骗常用的宣传词有:': ['“低门槛”', '“秒放款”', '“无抵押”', '“无担保”'], '以下哪些是“黑恶势力”?': ['利用家族、宗族势力横行乡里、称霸一方、欺压残害百姓的“村霸”', '在征地、租地、拆迁、工程项目建设等过程中煽动闹事的', '在商贸集市、批发市场、车站码头、旅游景区等场所欺行霸市、强买强卖、收保护费的市霸、行霸', '网络上的裸聊敲诈、套路贷、“水军”滋事犯罪、网络“软暴力”催收犯罪、恶意索赔、舆情敲诈、暴力传销等'],'一次性打火机,只晒多长时间就会爆炸呢?': ['12分钟。'], '随意将别人的裸照发到网上,会违法吗?': ['会'], '经验和经验主义有差别吗?': ['有差别'], '《数据安全法》中的数据指的是:': ['任何以电子或者其他方式对信息的记录'], '下列不属于研究生遇到的常见就业压力是:': ['缺乏专业相关经验'], '根据《刑法》规定,编造虚假险情造成严重后果的,会被判处?': ['三年以上七年以下有期徒刑'], '赌博的人是否也容易陷入校园贷?': ['是'], '当天降暴雨,车被水淹时,下面做法正确的是:': ['立刻打开车门逃跑。'], '我们要坚持以( )为宗旨。': ['人民安全'], '如果你接到电话,对面说“我是省公安厅的,你的身份证号是XXX,你涉嫌洗钱”,你觉得这句话哪里有问题?': ['在公安系统中,省公安厅和市公安局的民警一般是不办案的'], '如果你讨厌的上司给你发送了色情短信,您应该怎么办?': ['置之不理、严重时报警'], '刘某与谭某恋爱并发生了性关系,刘某偷拍了性爱视频以及裸照。谭某提出分手后,刘某一直用裸照相威胁。 \r\n刘某以裸照威胁谭某上车,后欲发生性关系,谭某借口上厕所,给同学发了求助信息。回到车上后,刘某还想强行发生性关系,谭某仍然不肯,因有人路过,刘某怕被发现并未成功。\r\n你觉得刘某属于:': ['强奸未遂,按强奸罪论'], '使用安全锤敲碎钢化玻璃的时候,正确的顺序是?': ['先敲击四角,在敲击中间'], '下列关于终端安全,正确的说法是:': ['终端安全是保护计算机和其他移动设备免受恶意软件、病毒、黑客攻击和其他网络威胁的一种安全措施'], '寻找家教兼职时,当你来到一个男性雇主的家中,发现家里的女主人和孩子都不在,怎么做更恰当?': ['找理由在外面的公共场所等候,让家长等孩子回来时联系你。'], '在古代,人们对江湖行骗种类进行了总结,其中最常见的四类是:': ['蜂麻燕雀'], '安全起见,独居女性尽量不要和陌生男子同乘一部电梯。': ['正确'], '面对林林总总的网络谣言,正确的做法是?': ['不理睬、不传播'], '与经验主义相对立的是什么?': ['理性主义'], '如果患者还有意识和反应,不要实施CPR,不要挪动被施救人员,应立刻拨打120。': ['正确'], '游泳时脚被水草缠住怎么办?': ['憋气钻进水里用手解开。'], '有网友给你推荐了一个可以超低价购买游戏装备的网站,你应该?': ['直接拒绝'], '根据《中华人民共和国刑法修正案(九)》规定,明知他人利用信息网络实施犯罪,为其犯罪提供互联网接入、服务器托管、网络存储、通讯传输等技术支持,或者提供广告推广、支付结算等帮助,情节严重的行为,处( )有期徒刑或者拘役,并处或者单处罚金。': ['三年以下'], '具有C2驾驶证,就可以骑电动摩托车,因为电动摩托车也是机动车。——这种说法正确吗?': ['错误'], '“紫菜都是塑料做的”属于哪种类型的谣言?': ['食品及产品谣言'], '以下哪个选项不能体现盲人点灯的“三不伤害”原则?': ['电动车进电梯'], '“京东金融客服来电,要求进行操作变更,否则会影响征信。”这样的诈骗方式利用了人的什么弱点呢?': ['恐惧'], '以下哪个选项与“亡羊补牢”意思最接近?': ['往者不可谏,来者犹可追'], '小A求复合失败后,在网络上发布前女友隐私视频,可能会涉嫌?': ['侮辱罪'], '动动手指,给商家发文件,即可获得丰厚报酬,这样的兼职:': ['一定有问题,不能做'], '独居女性在家,如何做好安全防范?': ['门口放男士鞋,在阳台上晾挂男士衣服', '有人敲门,不要随意开门', '快递地址不要太详细,最好是放在快递柜'], '以下哪些不是利用受害者“恐惧”心理进行诈骗的?': ['兼职诈骗', '投资诈骗'], '文明上网应遵守哪些行为?': ['选择官方网站', '不在网上谩骂攻击他人', '不通过网络泄露他人隐私', '发现不良信息及时举报'], '谣言一般是怎么来的?': ['凭空杜撰', '夸大其词', '断章取义', '拼凑剪接'], '对欺凌说“不”,我们要做到:': ['自尊', '自爱', '自信'], '处在心理危机中的人会有哪些表现?': ['谈论自杀,有自杀倾向', '有明显的攻击性行为或暴力倾向', '有严重的心理疾病,如抑郁或焦虑'], '面对劫匪,应该掌握哪些原则?': ['保持冷静', '假意配合', '保命为主', '记住对方特征'], '下面哪些可以作为火场逃生装备,在家中常备?': ['防烟面罩', '灭火毯'], '考试作弊的处罚可能有哪些?': ['学校按照校规校纪进行处分', '在国家级的考试中,构成违反治安管理行为的,会被追究行政责任', '在国家级的考试中,构成犯罪的,依法追究刑事责任'], '黄谣为什么总是难以洗白呢?': ['因为难以证明莫须有的事情不存在', '比起真相,人们更在意这件事的娱乐性', '人们对于性的双重标准,会导致更多人对“黄谣”事件里的人持批判态度'], '喜欢网络游戏的同学,需要注意哪些安全事项?': ['警惕网络游戏装备交易的钓鱼网站', '不轻易打开网友发来的网站', '去官方网站购买游戏装备'], '以下哪些是“冒充公检法”诈骗的常见套路?': ['让你找个安静的地方,一个人完成操作,避免连累家人', '电话通知你犯法,再给你转接其他公安人员处理', '和你视频,亮出警徽和警号', '发送带有你照片和名字的逮捕令链接或图片'], '遭遇到关系欺凌后,正确应对的方法是?': ['转移注意力,尝试新的朋友圈', '找到信赖的朋友,进行倾诉', '寻求心理咨询'], '研究生的人际关系压力通常有:': ['很多时候会觉得孤独', '与寝室、同学有矛盾', '与同学之间的恶意竞争氛围', '和导师有矛盾'], '选购和使用充电宝时有哪些注意事项?': ['充电宝要放在通风、干燥的环境', '避免过充或过放', '充电宝有无合格证'], '下列属于释放压力的好办法的是:': ['运动', '给自己设立小目标,尽力去完成', '多参加社交活动/实践活动', '做一些自己喜欢/感兴趣的事情'], '研究生生活和大学生活会有什么不同?': ['有更高的学业压力', '缺少丰富的社交活动', '对自我管理能力的要求更高', '更接近社会人情百态'], '“挖矿”的危害有哪些?': ['加速计算机老化', '消耗大量的电力资源、碳排放量大', '容易引发网络安全问题', '成为违法犯罪活动的工具'], '以下哪种行为不属于性骚扰?': ['夸赞对方:“你的肌肉练得真好!怎么练的能告诉我秘诀吗?”', '对女友讲个荤段子,女友害羞的锤了我一拳'], '气管梗阻迹象有哪些?': ['双手紧握喉咙,无法咳嗽', '说不出话', '严重呼吸困难,且喘息声音大', '嘴唇和皮肤出现青紫色'],'使用安全锤敲碎钢化玻璃的时候,正确的顺序是?': ['先敲击四角,在敲击中间'], '寻找家教兼职时,当你来到一个男性雇主的家中,发现家里的女主人和孩子都不在,怎么做更恰当?': ['找理由在外面的公共场所等候,让家长等孩子回来时联系你。'], '在工作中,如果你的异性同事在你旁边故意讲色情玩笑,你应该?': ['严厉制止'], '“这件事我有经验,我来帮你,照我说的做没错。”——这句话是经验主义的表现吗?': ['不一定,要分析客观情况'], '暴雨天气,如果开车经过涉水路面,且越开感觉水深时应当?': ['弃车逃生'], '以下哪个选项不能体现盲人点灯的“三不伤害”原则?': ['电动车进电梯'], '根据《刑法》规定,以赌博为业的,将会受到什么处罚?': ['处3年以下有期徒刑、拘役或者管制,并处罚金。'], '香水的爆炸临界点是:': ['49℃'], '夜跑应选择什么时间进行?': ['餐后一小时。'], '出门时,下面哪种情况最不容易遭遇抢劫:': ['结伴去热闹的夜市。'], '喝酒后不能开车,但是骑电动自行车和自行车是可以的。': ['错误'], '游泳时发现身边有漩涡,怎么逃离?': ['放平身体俯卧浮于水面上,沿着漩涡边,用爬泳的方法借力顺势快速摆脱漩涡。'], '无论你是否会做海姆立克急救法,都要拨打120急救电话。': ['对'], '电子烟里不含尼古丁。': ['错'], '电动自行车可以搭载一个12周岁以下的未成年人,电动轻便摩托车也可以搭载一个12周岁的未成年人——此说法正确吗?': ['错误'], '是否男性大学生也应该提防家教性骚扰?': ['是'], '在古代,人们对江湖行骗种类进行了总结,其中最常见的四类是:': ['蜂麻燕雀'], '小A求复合失败后,在网络上发布前女友隐私视频,可能会涉嫌?': ['侮辱罪'], '面对林林总总的网络谣言,正确的做法是?': ['不理睬、不传播'], '随意将别人的裸照发到网上,会违法吗?': ['会'], '以下哪种措施可以保护终端安全?': ['使用强密码'], '如果患者还有意识和反应,不要实施CPR,不要挪动被施救人员,应立刻拨打120。': ['正确'], '经验和经验主义有差别吗?': ['有差别'], '我们的发展目标是在( ),国家安全体系和能力全面加强。': ['二O三五年'], '赌博的人是否也容易陷入校园贷?': ['是'], '安全起见,独居女性尽量不要和陌生男子同乘一部电梯。': ['正确'], '灭火器的压力阀,正常状态时应该指向:': ['绿色区域'], '在火场中逃生,需要注意的事项有哪些?': ['用湿毛巾捂住口鼻', '切忌喊叫', '低姿态快速爬行', '有序逃生'], '做好时间管理为什么可以帮助我们缓解压力?': ['拖延症会让人增加压力', '有计划的做事会让人有“一切尽在掌控”的感觉', '完成一个个小目标会获得“满足感”,缓解压力', '提高效率,获得成就感'], '网购退款骗局中,骗子一般的手段有?': ['冒充购物网站客服', '添加微信、QQ好友', '发送木马网站'], '故意散播谣言的意图一般有哪些?': ['别有用心', '有利可图', '闲极无聊', '报复泄愤', '博眼球、求关注'], '深海安全是指和平探索和利用国际深海区域,增强( )的能力,维护我国国际深海区域的活动、资产的安全,以及深海发展利益相对处于没有危险和不受内外威胁的状态。': ['安全进出', '科学考察', '开发利用'], '抑郁症患者的症状可能有?': ['心情低落,与处境不相符', '悲痛欲绝,甚至木僵', '明显的焦虑和运动性激越', '自伤、自杀'], '总体国家安全观的思想基础有哪些?': ['我国传统国家安全战略思想', '新中国成立以来的国家安全战略思想'], '选购和使用充电宝时有哪些注意事项?': ['充电宝要放在通风、干燥的环境', '避免过充或过放', '充电宝有无合格证'], '为什么研究生与本科生相比,适合的岗位反而更少呢?': ['大部分的岗位职责会更适合大学学历人群', '研究生的自我要求会比大学学历的更高', '企业出于成本的考虑', '简单的工作对于研究生会缺乏积极性,增加离职风险'], 'AI骗局可能有哪些形式?': ['盗用熟人账号,换脸进行视频,装作熟人借钱', '通过技术转发语音,伪装身份借钱', '通过骚扰电话录音等来提取某人声音,进行声音合成,之后再打电话行骗'], '我们应该如何做,才能避免网络暴力的悲剧一再发生呢?': ['要学会辨识信息,不权威不轻信', '发言前多考虑是否会对他人产生影响、伤害他人', '看到不良言论及时向平台举报', '不去过度追逐“热点事件”,不发表带有强烈主观色彩、抨击他人的评论'], '以下哪些是“冒充公检法”诈骗的常见套路?': ['让你找个安静的地方,一个人完成操作,避免连累家人', '电话通知你犯法,再给你转接其他公安人员处理', '和你视频,亮出警徽和警号', '发送带有你照片和名字的逮捕令链接或图片'], '对欺凌说“不”,我们要做到:': ['自尊', '自爱', '自信'], '以下哪些是“黑恶势力”?': ['利用家族、宗族势力横行乡里、称霸一方、欺压残害百姓的“村霸”', '在征地、租地、拆迁、工程项目建设等过程中煽动闹事的', '在商贸集市、批发市场、车站码头、旅游景区等场所欺行霸市、强买强卖、收保护费的市霸、行霸', '网络上的裸聊敲诈、套路贷、“水军”滋事犯罪、网络“软暴力”催收犯罪、恶意索赔、舆情敲诈、暴力传销等'], '考上研究生,要想顺利度过研究生与大学的过渡期,不仅需要做好学业方面的准备,还需要做好:': ['心理准备', '了解研究生生活的准备'], '《反有组织犯罪法》重拳出击,严惩黑恶犯罪,表现在:': ['网络实施的犯罪也会查处', '对犯罪嫌疑人采取限制出境措施', '区别于普通犯罪的羁押手段', '慎重减刑假释'], '黄谣为什么总是难以洗白呢?': ['因为难以证明莫须有的事情不存在', '比起真相,人们更在意这件事的娱乐性', '人们对于性的双重标准,会导致更多人对“黄谣”事件里的人持批判态度'], '以下哪些不是利用受害者“恐惧”心理进行诈骗的?': ['兼职诈骗', '投资诈骗'], '下面哪些可以作为火场逃生装备,在家中常备?': ['防烟面罩', '灭火毯'], '以下哪种夜跑方式是正确的?': ['有N条路线,每天随机选择路线夜跑。', '三五成群、不戴耳机夜跑。', '穿着颜色鲜艳的跑鞋和荧光运动装夜跑。', '夜跑前进行15分钟左右热身拉伸。'], '如果遭遇偷拍该怎么办呢?': ['及时保留证据', '第一时间报警', '积极配合警方或学校惩罚偷拍者'], '网贷诈骗常用的宣传词有:': ['“低门槛”', '“秒放款”', '“无抵押”', '“无担保”'], '以下属于网暴事件中常见言论的是?': ['人身攻击,说他外貌丑陋长得吓人', '贴标签,指责对方“炒作”“不检点”“吃人血馒头“等', '挑起对立,不相关的事情非要“地域黑”“性别对立”“群体对立”', '窥探隐私,在热点事件中互相分享“高清”“未打码”视频', '恶意怂恿,在网络中恶意怂恿对方做出伤害自己的举动']} + + + print(len(questions_answers), questions_answers) + + questions = get_questions_List() + print(len(questions), questions) + + # 题库有答案数量 + print(len(set(questions_answers.keys()) & set(question[1] for question in questions.keys()))) + + for question,options in questions.items(): + questionid = question[0] + if question[1] not in questions_answers: + continue + else: + answersids = [] + for option in options: + if option[1] in questions_answers[question[1]]: + answersids.append(option[0]) + recordQuestion(questionid, ','.join(answersids)) + submit() \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..5e9704b --- /dev/null +++ b/main.py @@ -0,0 +1,89 @@ +import time +import json + +import weibanapi + +x_token = '57ba12f6-8ef6-4d62-8103-cb97a1bd4bbe' +user_id = 'eec6b514-93d6-4516-9e6a-e45cc3ce980c' +user_project_id = '5fc7738e-f98c-4890-8ce8-d3b06d2649da' +tenant_code = '4137011066' +#jq_id = '3410029753790258616464' + + + +# 1. showProgess 获取课程进度 +# 2. listCategory 获取课程分类 传入userprojectid +# 3. listCourse 获取课程 传入categorycode +# 4. study 传入courseid(上一步获取的resourceid) +# 5. getCourseUrl 获取methodToken +# 6. checkFinish(验证码用的,直接跳过) +# 7. getNear(获取最近学习,没啥用,直接跳过) +# 8. 调用methodToken完成学习 参数callback(341+16位随机数+时间戳) _(时间戳) + +def wait(text: str, ti: int): + while ti: + print(text % ti, end='') + time.sleep(1) + print('\r', end='') + ti = ti - 1 + print(' \r', end='') + + +def main(): + try: + w = weibanapi.WeibanAPI(x_token, user_id, user_project_id, tenant_code) + + except Exception: + print('请检查初始化参数是否正确!') + exit(-1) + + courseInfo = [] + + required, finished = w.showProgress() + print('共{}, 已完成{}'.format(required, finished)) + + # 获取课程分类 + categorys = w.listCategory() + for c in categorys: + print("{}[{}/{}]".format(c["categoryName"], c["finishedNum"], c["totalNum"])) + # 如果该类课程学习数 < 总数 加入到courseInfo列表中 + if c["totalNum"] > c["finishedNum"]: + courses = w.listCourse(c["categoryCode"]) + for course in courses: + if course["finished"] == 2: # 根据观察 1是学了 2是没学 + courseInfo.append(course) + + for c in courseInfo: + userCourseId = c["userCourseId"] + resourceName = c["resourceName"] + categoryName = c["categoryName"] + resourceId = c["resourceId"] + print('开始学习{}-{}'.format(categoryName, resourceName)) + code = w.study(resourceId) + if code != '0': + print('开始学习失败') + exit(-1) + # 学太快好像有可能学不上 + wait('等待中.......%02d', 15) + retry_cnt = 0 + captcha_id = w.DoCaptcha(userCourseId) + while (captcha_id is None) and (retry_cnt < 5): + retry_cnt = retry_cnt + 1 + print(f'验证码未通过,正在重试第 {retry_cnt} 次') + captcha_id = w.DoCaptcha(userCourseId) + if (retry_cnt >= 5): + print('验证码重试次数达到上限,系统自动退出') + exit(-1) + tmp = w.MakeCourseFinish(captcha_id, userCourseId) + res = tmp[tmp.find('({') + 1:len(tmp) - 1] + print(f'tmp = [{tmp}], res = [{res}]') + j = json.loads(res) + if j["msg"] != "ok": + print('调用MakeCourseFinish失败!') + exit(-1) + wait('通过! %02d s后继续', 3) + + +if __name__ == '__main__': + print('免责声明: \n此程序仅供学习使用,由于个人操作引发的一系列后果与作者无关') + main() \ No newline at end of file diff --git a/weibanapi.py b/weibanapi.py new file mode 100644 index 0000000..0469e1b --- /dev/null +++ b/weibanapi.py @@ -0,0 +1,208 @@ +import datetime +import json +import random +import requests +import time +import captcha_img + + +def get_timestamp(): + return str(round(datetime.datetime.now().timestamp(), 3)) + + +def parseMethodToken(test: str): + return test[test.find('methodToken=') + 12:test.find('&csComm')] + +#https://mcwk.mycourse.cn/course/A22002/A22002.html?userCourseId57051d99-434f-4814-81e7-84deee2128bb\u0026tenantCode\u003d4137011066\u0026type\u003d1\u0026csComm\u003dtrue\u0026csCapt\u003dtrue +#https://mcwk.mycourse.cn/course/A22002/A22002.html?userCourseId=57051d99-434f-4814-81e7-84deee2128bb&tenantCode=4137011066&type=1&csComm=true&csCapt=true +#https://mcwk.mycourse.cn/course/A22002/A22002.html?userCourseId=57051d99-434f-4814-81e7-84deee2128bb&tenantCode=4137011066&type=1&csComm=true&csCapt=true&userProjectId=5fc7738e-f98c-4890-8ce8-d3b06d2649da&userId=eec6b514-93d6-4516-9e6a-e45cc3ce980c&courseId=dd85f614-d32f-11eb-9a88-d4ae52bad611&projectType=special&projectId=undefined&protocol=true&link=34415&weiban=weiban&userName=f61f3acc85f34ae5802675ac194a5c38 +#https://weiban.mycourse.cn/#/course/detail?courseId=dd85f614-d32f-11eb-9a88-d4ae52bad611&userProjectId=5fc7738e-f98c-4890-8ce8-d3b06d2649da&courseName=%E5%8F%8D%E6%81%90%E4%B9%8B%E3%80%8A%E5%8F%8D%E6%81%90%E6%B3%95%E3%80%8B%E7%AF%87&userCourseId=57051d99-434f-4814-81e7-84deee2128bb&link=34415&projectType=special + +def GetTimeStampMS(): + return str(int(round(time.time() * 1000))) + + +class WeibanAPI: + tenantCode = '' + x_token = ' ' + userId = ' ' + userProjectId = ' ' + headers = None + captcha_headers = None + + def __init__(self, token, user_id, user_project_id, tenant_code): + self.x_token = token + self.tenantCode = tenant_code + self.userId = user_id + self.userProjectId = user_project_id + self.headers = { + 'X-Token': self.x_token, + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203' + } + self.captcha_headers = { + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203', + 'Referer': 'https://mcwk.mycourse.cn/' + } + res = self._showProgress() + if len(res) == 0: + raise Exception('failed to get course info') + + def showProgress(self): + res = self._showProgress() + j = json.loads(res) + return j["data"]["requiredNum"], j["data"]["requiredFinishedNum"] + + def _showProgress(self): + url = 'https://weiban.mycourse.cn/pharos/project/showProgress.do?timestamp=' + get_timestamp() + data = { + 'tenantCode': self.tenantCode, + 'userId': self.userId, + 'userProjectId': self.userProjectId + } + return self.process_url(url, data) + + def _process_url(self, url, param, method): + if method == 'POST': + re = requests.post(url=url, data=param, headers=self.headers) + elif method == 'GET': + url += '?' + for key, item in param.items(): + url = url + ('' if url.endswith('?') else '&') + str(key) + '=' + str(item) + re = requests.get(url=url, headers=self.headers) + else: + raise ValueError('WRONG METHOD') + return re.text + + def process_url(self, url, param, method='POST'): + return self._process_url(url, param, method) + + def _listCategory(self): + url = 'https://weiban.mycourse.cn/pharos/usercourse/listCategory.do?timestamp=' + get_timestamp() + data = { + 'tenantCode': self.tenantCode, + 'userId': self.userId, + 'userProjectId': self.userProjectId, + 'chooseType': 3 + } + return self.process_url(url, data) + + def listCategory(self): + ret = self._listCategory() + try: + j = json.loads(ret) + return j["data"] + except json.decoder.JSONDecodeError as e: + print(e.msg) + + def _listCourse(self, category_code): + url = 'https://weiban.mycourse.cn/pharos/usercourse/listCourse.do?timestamp=' + get_timestamp() + data = { + 'tenantCode': self.tenantCode, + 'userId': self.userId, + 'userProjectId': self.userProjectId, + 'chooseType': 3, + 'categoryCode': category_code + } + return self.process_url(url, data) + + def listCourse(self, category_code): + ret = self._listCourse(category_code) + try: + j = json.loads(ret) + return j["data"] + except json.decoder.JSONDecodeError as e: + print(e.msg) + + def _getCourseUrl(self, resource_id): + url = 'https://weiban.mycourse.cn/pharos/usercourse/getCourseUrl.do?timestamp=' + get_timestamp() + data = { + 'tenantCode': self.tenantCode, + 'userId': self.userId, + 'userProjectId': self.userProjectId, + 'courseId': resource_id + } + return self.process_url(url, data) + + def getCourseUrl(self, resource_id): + ret = self._getCourseUrl(resource_id) + try: + j = json.loads(ret) + return j["data"] + except json.decoder.JSONDecodeError as e: + print(e.msg) + + def methodToken(self, method_token, user_course_id): + url = 'https://weiban.mycourse.cn/pharos/usercourse/v1/{}.do'.format(method_token) + t = get_timestamp().replace('.', '') + param = { + 'callback': 'jQuery341' + str(random.random()).replace('.', '') + '_' + t, + 'userCourseId': user_course_id, + 'tenantCode': self.tenantCode, + '_': int(t) + 1 + } + return self.process_url(url, param, 'GET') + + def CheckCaptcha(self, url, answer): + payload = {"coordinateXYs": answer} + return requests.post(url, data=payload, headers=self.captcha_headers).text + + def DoCaptcha(self, user_course_id): + get_url = 'https://weiban.mycourse.cn/pharos/usercourse/getCaptcha.do' + check_url = 'https://weiban.mycourse.cn/pharos/usercourse/checkCaptcha.do' + #?userCourseId={}&userProjectId={}&userId={}&tenantCode={} + param = { + 'userCourseId': user_course_id, + 'userProjectId': self.userProjectId, + 'userId': self.userId, + 'tenantCode': self.tenantCode + } + try: + captcha_data = json.loads(self.process_url(get_url, param, 'GET')) + captcha_num = captcha_data["captcha"]["num"] + captcha_id = captcha_data["captcha"]["questionId"] + captcha_image = captcha_img.download_image(captcha_data["captcha"]["imageUrl"]) + if(captcha_image is None): + print('【错误】无法下载验证码') + return None + answer_pos = captcha_img.captcha_main(captcha_image, captcha_num) + full_check_url = f'{check_url}?userCourseId={user_course_id}&userProjectId={self.userProjectId}&userId={self.userId}&tenantCode={self.tenantCode}&questionId={captcha_id}' + captcha_result = json.loads(self.CheckCaptcha(full_check_url, answer_pos)) + if((captcha_result["code"] != "0") or (captcha_result["data"]["checkResult"] != 1)): + print('【错误】验证码未通过') + return None + return captcha_result["data"]["methodToken"] + except json.decoder.JSONDecodeError as e: + print(f'JSON Error: {e.msg}') + return None + + def MakeCourseFinish(self, captcha_token, user_course_id): + url = 'https://weiban.mycourse.cn/pharos/usercourse/v2/{}.do'.format(captcha_token) + t = GetTimeStampMS() + param = { + 'callback': 'jQuery341' + str(random.random()).replace('.', '') + '_' + t, + 'userCourseId': user_course_id, + 'tenantCode': self.tenantCode, + '_': int(t) + 1 + } + return self.process_url(url, param, 'GET') + + def study(self, resource_id): + res = self._study(resource_id) + try: + j = json.loads(res) + return j["code"] + except json.decoder.JSONDecodeError as e: + print(e.msg) + + def _study(self, resource_id): + url = 'https://weiban.mycourse.cn/pharos/usercourse/study.do?timestamp=' + get_timestamp() + data = { + 'tenantCode': self.tenantCode, + 'userId': self.userId, + 'userProjectId': self.userProjectId, + 'courseId': resource_id + } + return self.process_url(url, data) \ No newline at end of file