From d896e46b1d2068ffc9add96a38d40de6a9fdd2b3 Mon Sep 17 00:00:00 2001 From: gituse4xxqg Date: Sat, 21 May 2022 16:13:53 +0800 Subject: [PATCH 01/16] =?UTF-8?q?add=20anno=20[bug=20fixed]=20=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E5=85=AD=E9=A1=B5=E5=AD=A6=E5=AE=8C=E4=BB=A5=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=AC=AC=E4=B8=83=E9=A1=B5=E7=9A=84=E4=B8=93=E9=A1=B9?= =?UTF-8?q?=E4=BC=9A=E6=89=BE=E4=B8=8D=E5=88=B0=EF=BC=8Cubuntu=2020.04?= =?UTF-8?q?=E7=BB=8F=E8=BF=87=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourcePackages/pdlearn/answer_question.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/SourcePackages/pdlearn/answer_question.py b/SourcePackages/pdlearn/answer_question.py index 690f9591..92971c1e 100644 --- a/SourcePackages/pdlearn/answer_question.py +++ b/SourcePackages/pdlearn/answer_question.py @@ -24,13 +24,21 @@ def generate_tiku_data(quiz_type=None, tip=None, option=None, answer=None, quest def find_available_quiz(quiz_type, driver_ans, uid): - pages = driver_ans.driver.find_elements_by_css_selector( - ".ant-pagination-item") - for p in range(0, len(pages), 1): # (从最后一页开始往前找做题)从前往后找题,专项答题等没有那么离谱 - time.sleep(0.5) - print('进入答题第' + str(p+1) + '页') - pages[p].click() - time.sleep(0.5) + # 这里有些问题,专项学习一开始会出现 1 2 3 4 5 10,一共6个button + # 第一次find_elements_by_css_selector以后只会学到前5页和最后一页,这6页学完以后就会找不到 + # 这里改动先找最后一个button的页码,然后每次点击,更新pages,模拟手动点击的过程 + prestr = ".ant-pagination-item" + pages = driver_ans.driver.find_elements_by_css_selector(prestr) + last = int(pages[len(pages)-1].text) + for p in range(0, last, 1): # (从最后一页开始往前找做题)从前往后找题,专项答题等没有那么离谱 + pages = driver_ans.driver.find_elements_by_css_selector(prestr) + for index in range(0, len(pages), 1): + if pages[index].text == str(p+1): + time.sleep(0.5) + print('进入答题第' + str(p+1) + '页') + pages[index].click() + time.sleep(0.5) + break dati = [] if quiz_type == "weekly": # 寻找可以做的题 dati = driver_ans.driver.find_elements_by_css_selector( From 11d3d4a607f69ebcdddaf53a63fb444d8eb6539b Mon Sep 17 00:00:00 2001 From: RobbieDragon233 <40767630+RobbieDragon233@users.noreply.github.com> Date: Sun, 22 May 2022 10:41:40 +0800 Subject: [PATCH 02/16] Update requirements.txt fix jinjia2 bug --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f2115b1b..06f0a2d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,6 @@ gunicorn==20.1.0 PySocks==1.7.1 urllib3==1.26.7 itsdangerous==2.0.1 -Flask==1.1.2 +Flask==2.1.0 Flask_SQLAlchemy==2.5.1 Flask_Cors==3.0.9 From 8f0b1170b365ade016076f57593140eed00d8000 Mon Sep 17 00:00:00 2001 From: johlanse Date: Mon, 23 May 2022 15:52:27 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E6=89=93=E5=BC=80=E6=B5=8F=E8=A7=88=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=8F=91=E9=80=81=E8=AF=B7=E6=B1=82=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourcePackages/pandalearning.py | 18 +-- SourcePackages/pdlearn/file.py | 2 +- .../pdlearn/historical/pandalearning.py | 9 +- SourcePackages/pdlearn/mydriver.py | 113 +++++++++++++++--- 4 files changed, 114 insertions(+), 28 deletions(-) diff --git a/SourcePackages/pandalearning.py b/SourcePackages/pandalearning.py index 8ef5f5e8..824b1a9f 100644 --- a/SourcePackages/pandalearning.py +++ b/SourcePackages/pandalearning.py @@ -14,7 +14,7 @@ from pdlearn.answer_question import daily, weekly, zhuanxiang from pdlearn.article_video import article, video from pdlearn.config import cfg_get - from pdlearn.mydriver import Mydriver + from pdlearn.mydriver import Mydriver, login from pdlearn.score import show_score, show_scorePush except ImportError as e: boot.try_pip_install(exception=e) @@ -69,9 +69,10 @@ def start_learn(uid, name): gl.pushprint("web模式跳过自动获取二维码,请手动点击添加按钮", chat_id=uid) print(color.red("【#️⃣】 若直接退出请运行:webserverListener.py")) return - driver_login = Mydriver() - cookies = driver_login.login() - driver_login.quit() + # driver_login = Mydriver() + # cookies = driver_login.login() + # driver_login.quit() + cookies = login() if not cookies: print("登录超时") return @@ -133,7 +134,7 @@ def start(nick_name=None): user_list.append(["", "新用户"]) for i in range(len(user_list)): try: - if nick_name == None or nick_name == user_list[i][1] or nick_name == user_list[i][0]: + if nick_name is None or nick_name == user_list[i][1] or nick_name == user_list[i][0]: _learn = threads.MyThread( user_list[i][0]+"开始学xi", start_learn, user_list[i][0], user_list[i][1], lock=Single) _learn.start() @@ -174,9 +175,10 @@ def get_all_user_name(): def add_user(chat_id=None): get_argv() gl.pushprint("请登录(登录方式请仔细阅读文档,如果觉得这是让你下载,就是你没仔细读文档):", chat_id=chat_id) - driver_login = Mydriver() - cookies = driver_login.login(chat_id) - driver_login.quit() + # driver_login = Mydriver() + # cookies = driver_login.login(chat_id) + # driver_login.quit() + cookies = login(chat_id=chat_id) if not cookies: gl.pushprint("登录超时。", chat_id=chat_id) return diff --git a/SourcePackages/pdlearn/file.py b/SourcePackages/pdlearn/file.py index 271e177f..74b7a4fe 100644 --- a/SourcePackages/pdlearn/file.py +++ b/SourcePackages/pdlearn/file.py @@ -58,7 +58,7 @@ def save_json_data(filename, object_to_save, sort_keys=True): def get_conf_file(filename, template_conf_str): check_directory(filename) - if(os.path.exists(filename) and os.path.getsize(filename) != 0): + if os.path.exists(filename) and os.path.getsize(filename) != 0: try: conf_obj = ConfigFactory.parse_file(filename) except Exception as e: diff --git a/SourcePackages/pdlearn/historical/pandalearning.py b/SourcePackages/pdlearn/historical/pandalearning.py index 666f8e81..9beeaf5d 100644 --- a/SourcePackages/pdlearn/historical/pandalearning.py +++ b/SourcePackages/pdlearn/historical/pandalearning.py @@ -1,5 +1,7 @@ from pdlearn import dingding from pdlearn import user +from pdlearn.mydriver import login + def user_flag(dd_status, uname): if False and dd_status: @@ -10,9 +12,10 @@ def user_flag(dd_status, uname): cookies = user.get_cookie(uname) if not cookies: print("未找到有效登录信息,需要登录") - driver_login = Mydriver(nohead=False) - cookies = driver_login.login() - driver_login.quit() + # driver_login = Mydriver(nohead=False) + # cookies = driver_login.login() + # driver_login.quit() + cookies = login() else: cookies = dingding.dd_login_status(uname) a_log = user.get_a_log(uname) diff --git a/SourcePackages/pdlearn/mydriver.py b/SourcePackages/pdlearn/mydriver.py index 78e05d5c..b78625e5 100644 --- a/SourcePackages/pdlearn/mydriver.py +++ b/SourcePackages/pdlearn/mydriver.py @@ -5,10 +5,12 @@ import re import string import time +import uuid from typing import Any, List from urllib.parse import quote, quote_plus import lxml +import qrcode import requests import selenium from bs4 import BeautifulSoup @@ -22,27 +24,105 @@ from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait + +from pdlearn.globalvar import web from webServerConf import WebMessage, WebQrUrl, web_db -from pdlearn import auto -from pdlearn import globalvar as gl +from pdlearn import globalvar as gl, auto from pdlearn import user, user_agent from pdlearn.web import WebHandler from pdlearn.config import cfg_get from pdlearn.dingding import DingDingHandler -# from pdlearn.qywx import WeChat # 使用微信发送二维码图片到手机 +# from pdlearn.qywx import WeChat # 使用微信发送二维码图片到手机 + def decode_img(data): if None == data: raise Exception('未获取到二维码,请检查网络并重试') - img_b64decode = base64.b64decode(data[data.index(';base64,')+8:]) + img_b64decode = base64.b64decode(data[data.index(';base64,') + 8:]) decoded = pyzbar.decode(Image.open(io.BytesIO(img_b64decode))) return decoded[0].data.decode("utf-8") +def login(chat_id=None): + client = requests.session() + # 1. 获取sign + sign: str = client.get(url="https://pc-api.xuexi.cn/open/api/sns/sign").json().get("data").get("sign") + # 2. 获取qr + qr_data: str = client.get("https://login.xuexi.cn/user/qrcode/generate").json().get("result") + # 3. 生成登录链接 + code_url = f"https://login.xuexi.cn/login/qrcommit?showmenu=false&code={qr_data}&appId=dingoankubyrfkttorhpou" + # 生成二维码 + qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=2) + qr.add_data(code_url) + qr.make(fit=True) + img = qr.make_image() + img.show() + # 二维码转base64 + output_buffer = io.BytesIO() + img.save(output_buffer, format='JPEG') + byte_data = output_buffer.getvalue() + qrbase64 = "data:image/png;base64," + base64.b64encode(byte_data).decode("utf-8") + + # 推送消息 + if gl.nohead or cfg_get("addition.SendLoginQRcode", 0) == 1: + print("二维码将发往机器人...\n" + "=" * 60) + # 发送二维码 + gl.send_qrbase64(qrbase64) + # 发送链接 + if gl.scheme: + qrurl = gl.scheme + quote_plus(code_url) + else: + qrurl = decode_img(qrbase64) + gl.pushprint(qrurl, chat_id) + + web_qr_url = "" + web_msg = "" + try: + web_qr_url = web_db.session.query( + WebQrUrl).filter_by(url=qrbase64).first() + web_msg = web_db.session.query( + WebMessage).filter_by(text=code_url).first() + except Exception as e: + print(str(e)) + print("web数据库添加失败") + web_db.session.rollback() + + secret = "" + print(f"sign: {sign}, data: {qr_data}") + for i in range(60): + resp = client.post(url="https://login.xuexi.cn/login/login_with_qr", + data={"qrCode": qr_data, "goto": "https://oa.xuexi.cn", "pdmToken": ""}, + ).json() + if resp.get("success"): + secret = resp.get("data") + break + else: + print("等待扫码中---") + print(resp) + time.sleep(5) + if secret == "": + if gl.islooplogin: + print("循环模式开启,即将重新获取二维码") + time.sleep(3) + return login(chat_id) + return None + client.get("https://pc-api.xuexi.cn/login/secure_check", + params={"code": secret.split("=")[1], "state": sign + str(uuid.uuid4())}) + + print("token ==> " + client.cookies.get("token")) + + cookies = [{"name": "token", "value": client.cookies.get("token")}] + user.save_cookies(cookies) + web_qr_url and web_db.session.delete(web_qr_url) + web_msg and web_db.session.delete(web_msg) + web_db.session.commit() + return cookies + + class title_of_login: def __call__(self, driver): """ 用来结合webDriverWait判断出现的title """ @@ -50,7 +130,7 @@ def __call__(self, driver): is_title1 = bool(EC.title_is(u'我的学习')(driver)) is_title2 = bool(EC.title_is(u'系统维护中')(driver)) except Exception as e: - print("chrome 开启失败。"+str(e)) + print("chrome 开启失败。" + str(e)) exit() if is_title1 or is_title2: return True @@ -110,27 +190,27 @@ def __init__(self, noimg=True, nohead=True): mydriver_log = '可找到 "/opt/google/chrome/chrome"' # ==================== 寻找 chromedriver ==================== chromedriver_paths = [ - "./chrome/chromedriver.exe", # win - "./chromedriver", # linux - "/usr/bin/chromedriver", # linux用户安装 + "./chrome/chromedriver.exe", # win + "./chromedriver", # linux + "/usr/bin/chromedriver", # linux用户安装 # raspberry linux (需要包安装chromedriver) "/usr/lib64/chromium-browser/chromedriver", # raspberry linux (需要包安装chromedriver) "/usr/lib/chromium-browser/chromedriver", - "/usr/local/bin/chromedriver", # linux 包安装chromedriver + "/usr/local/bin/chromedriver", # linux 包安装chromedriver ] have_find = False for one_path in chromedriver_paths: if os.path.exists(one_path): self.driver = self.webdriver.Chrome( executable_path=one_path, chrome_options=self.options) - mydriver_log = mydriver_log+'\r\n可找到 "' + one_path + '"' + mydriver_log = mydriver_log + '\r\n可找到 "' + one_path + '"' have_find = True break if not have_find: self.driver = self.webdriver.Chrome( chrome_options=self.options) - mydriver_log = mydriver_log+'\r\n未找到chromedriver,使用默认方法。' + mydriver_log = mydriver_log + '\r\n未找到chromedriver,使用默认方法。' except: print("=" * 60) print(" Chrome 浏览器初始化失败。信息:") @@ -170,7 +250,7 @@ def get_cookie_from_network(self, chat_id=None): print("当前网络缓慢...") else: self.driver.execute_script('arguments[0].remove()', remover) - #修改了适配新版本的二维码的滚动位置 + # 修改了适配新版本的二维码的滚动位置 self.driver.execute_script( 'window.scrollTo(document.body.scrollWidth/2 - 200 , 400)') qrurl = '' @@ -223,11 +303,11 @@ def get_cookie_from_network(self, chat_id=None): web_msg and web_db.session.delete(web_msg) web_db.session.commit() return cookies - + except Exception as e: print("扫描二维码超时... 错误信息:" + str(e)) self.web_log("扫描二维码超时... 错误信息:" + str(e)) - if(gl.islooplogin == True): + if (gl.islooplogin == True): print("循环模式开启,即将重新获取二维码") self.web_log("循环模式开启,即将重新获取二维码") time.sleep(3) @@ -254,7 +334,7 @@ def sendmsg(self, chat_id=None): # 发送链接 qrurl = '' if gl.scheme: - qrurl = gl.scheme+quote_plus(decode_img(qcbase64)) + qrurl = gl.scheme + quote_plus(decode_img(qcbase64)) else: qrurl = decode_img(qcbase64) gl.pushprint(qrurl, chat_id) @@ -408,7 +488,7 @@ def _view_tips(self): # by Sean display_tip = 0 # 页面上没有加载提示的内容 display_tip = self.driver.find_element_by_css_selector( ".ant-popover-hidden") # 关闭tip则为hidden - if(display_tip == 0): # 没有关闭tip + if (display_tip == 0): # 没有关闭tip tips_close = self.driver.find_element_by_xpath( '//*[@id="app"]/div/div[2]/div/div[4]/div[1]/div[1]') tips_close.click() @@ -475,6 +555,7 @@ def swiper_valid(self): builder.release().perform() time.sleep(5) self.swiper_valid() + # 鼠标移动 def move_mouse(self, distance): From 133f6a22eb321d476872ff530e48e80bf219774c Mon Sep 17 00:00:00 2001 From: yunxueyuan <103919051+yunxueyuan@users.noreply.github.com> Date: Tue, 24 May 2022 19:45:36 +0800 Subject: [PATCH 04/16] Update answer_question.py --- SourcePackages/pdlearn/answer_question.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SourcePackages/pdlearn/answer_question.py b/SourcePackages/pdlearn/answer_question.py index 92971c1e..887f821c 100644 --- a/SourcePackages/pdlearn/answer_question.py +++ b/SourcePackages/pdlearn/answer_question.py @@ -527,7 +527,7 @@ def daily(cookies, scores, driver_default=None): def weekly(cookies, scores, driver_default=None): quiz_type = "weekly" score_all = const.weekly_all - quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[6]/div[2]/div[2]/div' + quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[7]/div[2]/div[2]/div' category_xpath = '//*[@id="app"]/div/div[2]/div/div[4]/div[1]/div[1]' answer_question(quiz_type, cookies, scores, score_all, quiz_xpath, category_xpath, driver_default=driver_default) @@ -536,7 +536,7 @@ def weekly(cookies, scores, driver_default=None): def zhuanxiang(cookies, scores, driver_default=None): quiz_type = "zhuanxiang" score_all = const.zhuanxiang_all - quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[7]/div[2]/div[2]/div' + quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[6]/div[2]/div[2]/div' category_xpath = '//*[@id="app"]/div/div[2]/div/div[6]/div[1]/div[1]' answer_question(quiz_type, cookies, scores, score_all, quiz_xpath, category_xpath, driver_default=driver_default) From 9788c133279c44c8101e4dcd0b6c34d6921275ea Mon Sep 17 00:00:00 2001 From: gituse4xxqg Date: Mon, 6 Jun 2022 22:11:28 +0800 Subject: [PATCH 05/16] =?UTF-8?q?add=20anno=20=E6=AF=8F=E5=91=A8=E7=AD=94?= =?UTF-8?q?=E9=A2=98=E4=B8=8D=E7=BB=B4=E6=8A=A4=E4=BA=86=EF=BC=8C=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=AF=8F=E6=AC=A1=E5=81=9C=E4=B8=8B=E6=9D=A5?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E6=AF=8F=E5=91=A8=E7=AD=94=E9=A2=98=E7=9A=84?= =?UTF-8?q?=E5=9B=9E=E8=BD=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourcePackages/pdlearn/answer_question.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SourcePackages/pdlearn/answer_question.py b/SourcePackages/pdlearn/answer_question.py index 887f821c..f984ea60 100644 --- a/SourcePackages/pdlearn/answer_question.py +++ b/SourcePackages/pdlearn/answer_question.py @@ -500,9 +500,10 @@ def answer_question(quiz_type, cookies, scores, score_all, quiz_xpath, category_ if scores[quiz_type] >= score_all: print("检测到"+quiz_zh_CN[quiz_type]+"答题分数已满,退出学 xi ") else: - print( - "!!!!!没拿到满分,请收集日志反馈错误题目!!!!!https://github.com/TechXueXi/techxuexi-tiku/issues/1") - auto.prompt("完成后(或懒得弄)请在此按回车...") + if quiz_type != "weekly": + print( + "!!!!!没拿到满分,请收集日志反馈错误题目!!!!!https://github.com/TechXueXi/techxuexi-tiku/issues/1") + auto.prompt("完成后(或懒得弄)请在此按回车...") # log_daily("!!!!!没拿到满分!!!!!") if driver_default == None: try: From 901c6027a50495be98b6ab8a267a780957d3b760 Mon Sep 17 00:00:00 2001 From: Rerange <78526012+Quandong-Zhang@users.noreply.github.com> Date: Fri, 24 Jun 2022 22:34:25 +0800 Subject: [PATCH 06/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a5a9df07..f3dbf6ce 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ TechXueXi为python学 xi 交流的开源非营利项目,仅作为程序员之 win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装`Visual C++ Redistributable for Visual Studio 2015` -链接已失效,请自己百度下载 +[下载链接](https://www.microsoft.com/en-us/download/details.aspx?id=48145) **下载安装:** From e73c1d30041b8262294f60e34663b74240df5fff Mon Sep 17 00:00:00 2001 From: Rerange <78526012+Quandong-Zhang@users.noreply.github.com> Date: Fri, 24 Jun 2022 22:36:24 +0800 Subject: [PATCH 07/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3dbf6ce..d7c10be3 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ TechXueXi为python学 xi 交流的开源非营利项目,仅作为程序员之 win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装`Visual C++ Redistributable for Visual Studio 2015` -[下载链接](https://www.microsoft.com/en-us/download/details.aspx?id=48145) +[下载链接](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) **下载安装:** From e7f5a65c626d2e9bc590ce6b2763687f45eb4ac7 Mon Sep 17 00:00:00 2001 From: tencent-wechat Date: Fri, 8 Jul 2022 18:29:51 +0800 Subject: [PATCH 08/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7c10be3..ec6b211d 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ TechXueXi为python学 xi 交流的开源非营利项目,仅作为程序员之 win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装`Visual C++ Redistributable for Visual Studio 2015` -[下载链接](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) +[下载链接1](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) 下载链接2: https://github.com/TechXueXi/VC-REDIST **下载安装:** From 35880162b594ab0b6c8940ce85f5d20dc54be7b2 Mon Sep 17 00:00:00 2001 From: johlanse Date: Sun, 10 Jul 2022 14:34:10 +0800 Subject: [PATCH 09/16] fix buf #192 --- SourcePackages/pdlearn/mydriver.py | 11 +++++++++-- requirements.txt | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/SourcePackages/pdlearn/mydriver.py b/SourcePackages/pdlearn/mydriver.py index b78625e5..d832d2bd 100644 --- a/SourcePackages/pdlearn/mydriver.py +++ b/SourcePackages/pdlearn/mydriver.py @@ -61,6 +61,8 @@ def login(chat_id=None): qr.make(fit=True) img = qr.make_image() img.show() + img.save("qrcode.png") + print("二维码已保存到qrcode.png") # 二维码转base64 output_buffer = io.BytesIO() img.save(output_buffer, format='JPEG') @@ -114,8 +116,13 @@ def login(chat_id=None): params={"code": secret.split("=")[1], "state": sign + str(uuid.uuid4())}) print("token ==> " + client.cookies.get("token")) - - cookies = [{"name": "token", "value": client.cookies.get("token")}] + cookies = [ + {'domain': '.xuexi.cn', + "expiry": int(time.time())+12*3600, + 'httpOnly': False, + 'name': 'token', 'path': '/', + 'secure': False, + 'value': client.cookies.get("token")}] user.save_cookies(cookies) web_qr_url and web_db.session.delete(web_qr_url) web_msg and web_db.session.delete(web_msg) diff --git a/requirements.txt b/requirements.txt index 06f0a2d8..61d1dc95 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,4 @@ itsdangerous==2.0.1 Flask==2.1.0 Flask_SQLAlchemy==2.5.1 Flask_Cors==3.0.9 +qrcode=7.3.1 From d45265d1ec6985d214a692df4f2b2cd981012003 Mon Sep 17 00:00:00 2001 From: ByteDance-opensource Date: Mon, 11 Jul 2022 09:52:19 +0800 Subject: [PATCH 10/16] Revert "Merge branch 'developing' of https://github.com/TechXueXi/TechXueXi into developing" This reverts commit 96120054839b1256545467d8d753e348dfab8234, reversing changes made to 567d9b614fb417a50c2581d5109e18cd5f0b1631. --- README.md | 2 +- SourcePackages/pandalearning.py | 18 ++- SourcePackages/pdlearn/file.py | 2 +- .../pdlearn/historical/pandalearning.py | 9 +- SourcePackages/pdlearn/mydriver.py | 120 +++--------------- requirements.txt | 1 - 6 files changed, 29 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index ec6b211d..a5a9df07 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ TechXueXi为python学 xi 交流的开源非营利项目,仅作为程序员之 win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装`Visual C++ Redistributable for Visual Studio 2015` -[下载链接1](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) 下载链接2: https://github.com/TechXueXi/VC-REDIST +链接已失效,请自己百度下载 **下载安装:** diff --git a/SourcePackages/pandalearning.py b/SourcePackages/pandalearning.py index 824b1a9f..8ef5f5e8 100644 --- a/SourcePackages/pandalearning.py +++ b/SourcePackages/pandalearning.py @@ -14,7 +14,7 @@ from pdlearn.answer_question import daily, weekly, zhuanxiang from pdlearn.article_video import article, video from pdlearn.config import cfg_get - from pdlearn.mydriver import Mydriver, login + from pdlearn.mydriver import Mydriver from pdlearn.score import show_score, show_scorePush except ImportError as e: boot.try_pip_install(exception=e) @@ -69,10 +69,9 @@ def start_learn(uid, name): gl.pushprint("web模式跳过自动获取二维码,请手动点击添加按钮", chat_id=uid) print(color.red("【#️⃣】 若直接退出请运行:webserverListener.py")) return - # driver_login = Mydriver() - # cookies = driver_login.login() - # driver_login.quit() - cookies = login() + driver_login = Mydriver() + cookies = driver_login.login() + driver_login.quit() if not cookies: print("登录超时") return @@ -134,7 +133,7 @@ def start(nick_name=None): user_list.append(["", "新用户"]) for i in range(len(user_list)): try: - if nick_name is None or nick_name == user_list[i][1] or nick_name == user_list[i][0]: + if nick_name == None or nick_name == user_list[i][1] or nick_name == user_list[i][0]: _learn = threads.MyThread( user_list[i][0]+"开始学xi", start_learn, user_list[i][0], user_list[i][1], lock=Single) _learn.start() @@ -175,10 +174,9 @@ def get_all_user_name(): def add_user(chat_id=None): get_argv() gl.pushprint("请登录(登录方式请仔细阅读文档,如果觉得这是让你下载,就是你没仔细读文档):", chat_id=chat_id) - # driver_login = Mydriver() - # cookies = driver_login.login(chat_id) - # driver_login.quit() - cookies = login(chat_id=chat_id) + driver_login = Mydriver() + cookies = driver_login.login(chat_id) + driver_login.quit() if not cookies: gl.pushprint("登录超时。", chat_id=chat_id) return diff --git a/SourcePackages/pdlearn/file.py b/SourcePackages/pdlearn/file.py index 74b7a4fe..271e177f 100644 --- a/SourcePackages/pdlearn/file.py +++ b/SourcePackages/pdlearn/file.py @@ -58,7 +58,7 @@ def save_json_data(filename, object_to_save, sort_keys=True): def get_conf_file(filename, template_conf_str): check_directory(filename) - if os.path.exists(filename) and os.path.getsize(filename) != 0: + if(os.path.exists(filename) and os.path.getsize(filename) != 0): try: conf_obj = ConfigFactory.parse_file(filename) except Exception as e: diff --git a/SourcePackages/pdlearn/historical/pandalearning.py b/SourcePackages/pdlearn/historical/pandalearning.py index 9beeaf5d..666f8e81 100644 --- a/SourcePackages/pdlearn/historical/pandalearning.py +++ b/SourcePackages/pdlearn/historical/pandalearning.py @@ -1,7 +1,5 @@ from pdlearn import dingding from pdlearn import user -from pdlearn.mydriver import login - def user_flag(dd_status, uname): if False and dd_status: @@ -12,10 +10,9 @@ def user_flag(dd_status, uname): cookies = user.get_cookie(uname) if not cookies: print("未找到有效登录信息,需要登录") - # driver_login = Mydriver(nohead=False) - # cookies = driver_login.login() - # driver_login.quit() - cookies = login() + driver_login = Mydriver(nohead=False) + cookies = driver_login.login() + driver_login.quit() else: cookies = dingding.dd_login_status(uname) a_log = user.get_a_log(uname) diff --git a/SourcePackages/pdlearn/mydriver.py b/SourcePackages/pdlearn/mydriver.py index d832d2bd..78e05d5c 100644 --- a/SourcePackages/pdlearn/mydriver.py +++ b/SourcePackages/pdlearn/mydriver.py @@ -5,12 +5,10 @@ import re import string import time -import uuid from typing import Any, List from urllib.parse import quote, quote_plus import lxml -import qrcode import requests import selenium from bs4 import BeautifulSoup @@ -24,112 +22,27 @@ from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait - -from pdlearn.globalvar import web from webServerConf import WebMessage, WebQrUrl, web_db -from pdlearn import globalvar as gl, auto +from pdlearn import auto +from pdlearn import globalvar as gl from pdlearn import user, user_agent from pdlearn.web import WebHandler from pdlearn.config import cfg_get from pdlearn.dingding import DingDingHandler - - # from pdlearn.qywx import WeChat # 使用微信发送二维码图片到手机 + def decode_img(data): if None == data: raise Exception('未获取到二维码,请检查网络并重试') - img_b64decode = base64.b64decode(data[data.index(';base64,') + 8:]) + img_b64decode = base64.b64decode(data[data.index(';base64,')+8:]) decoded = pyzbar.decode(Image.open(io.BytesIO(img_b64decode))) return decoded[0].data.decode("utf-8") -def login(chat_id=None): - client = requests.session() - # 1. 获取sign - sign: str = client.get(url="https://pc-api.xuexi.cn/open/api/sns/sign").json().get("data").get("sign") - # 2. 获取qr - qr_data: str = client.get("https://login.xuexi.cn/user/qrcode/generate").json().get("result") - # 3. 生成登录链接 - code_url = f"https://login.xuexi.cn/login/qrcommit?showmenu=false&code={qr_data}&appId=dingoankubyrfkttorhpou" - # 生成二维码 - qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=2) - qr.add_data(code_url) - qr.make(fit=True) - img = qr.make_image() - img.show() - img.save("qrcode.png") - print("二维码已保存到qrcode.png") - # 二维码转base64 - output_buffer = io.BytesIO() - img.save(output_buffer, format='JPEG') - byte_data = output_buffer.getvalue() - qrbase64 = "data:image/png;base64," + base64.b64encode(byte_data).decode("utf-8") - - # 推送消息 - if gl.nohead or cfg_get("addition.SendLoginQRcode", 0) == 1: - print("二维码将发往机器人...\n" + "=" * 60) - # 发送二维码 - gl.send_qrbase64(qrbase64) - # 发送链接 - if gl.scheme: - qrurl = gl.scheme + quote_plus(code_url) - else: - qrurl = decode_img(qrbase64) - gl.pushprint(qrurl, chat_id) - - web_qr_url = "" - web_msg = "" - try: - web_qr_url = web_db.session.query( - WebQrUrl).filter_by(url=qrbase64).first() - web_msg = web_db.session.query( - WebMessage).filter_by(text=code_url).first() - except Exception as e: - print(str(e)) - print("web数据库添加失败") - web_db.session.rollback() - - secret = "" - print(f"sign: {sign}, data: {qr_data}") - for i in range(60): - resp = client.post(url="https://login.xuexi.cn/login/login_with_qr", - data={"qrCode": qr_data, "goto": "https://oa.xuexi.cn", "pdmToken": ""}, - ).json() - if resp.get("success"): - secret = resp.get("data") - break - else: - print("等待扫码中---") - print(resp) - time.sleep(5) - if secret == "": - if gl.islooplogin: - print("循环模式开启,即将重新获取二维码") - time.sleep(3) - return login(chat_id) - return None - client.get("https://pc-api.xuexi.cn/login/secure_check", - params={"code": secret.split("=")[1], "state": sign + str(uuid.uuid4())}) - - print("token ==> " + client.cookies.get("token")) - cookies = [ - {'domain': '.xuexi.cn', - "expiry": int(time.time())+12*3600, - 'httpOnly': False, - 'name': 'token', 'path': '/', - 'secure': False, - 'value': client.cookies.get("token")}] - user.save_cookies(cookies) - web_qr_url and web_db.session.delete(web_qr_url) - web_msg and web_db.session.delete(web_msg) - web_db.session.commit() - return cookies - - class title_of_login: def __call__(self, driver): """ 用来结合webDriverWait判断出现的title """ @@ -137,7 +50,7 @@ def __call__(self, driver): is_title1 = bool(EC.title_is(u'我的学习')(driver)) is_title2 = bool(EC.title_is(u'系统维护中')(driver)) except Exception as e: - print("chrome 开启失败。" + str(e)) + print("chrome 开启失败。"+str(e)) exit() if is_title1 or is_title2: return True @@ -197,27 +110,27 @@ def __init__(self, noimg=True, nohead=True): mydriver_log = '可找到 "/opt/google/chrome/chrome"' # ==================== 寻找 chromedriver ==================== chromedriver_paths = [ - "./chrome/chromedriver.exe", # win - "./chromedriver", # linux - "/usr/bin/chromedriver", # linux用户安装 + "./chrome/chromedriver.exe", # win + "./chromedriver", # linux + "/usr/bin/chromedriver", # linux用户安装 # raspberry linux (需要包安装chromedriver) "/usr/lib64/chromium-browser/chromedriver", # raspberry linux (需要包安装chromedriver) "/usr/lib/chromium-browser/chromedriver", - "/usr/local/bin/chromedriver", # linux 包安装chromedriver + "/usr/local/bin/chromedriver", # linux 包安装chromedriver ] have_find = False for one_path in chromedriver_paths: if os.path.exists(one_path): self.driver = self.webdriver.Chrome( executable_path=one_path, chrome_options=self.options) - mydriver_log = mydriver_log + '\r\n可找到 "' + one_path + '"' + mydriver_log = mydriver_log+'\r\n可找到 "' + one_path + '"' have_find = True break if not have_find: self.driver = self.webdriver.Chrome( chrome_options=self.options) - mydriver_log = mydriver_log + '\r\n未找到chromedriver,使用默认方法。' + mydriver_log = mydriver_log+'\r\n未找到chromedriver,使用默认方法。' except: print("=" * 60) print(" Chrome 浏览器初始化失败。信息:") @@ -257,7 +170,7 @@ def get_cookie_from_network(self, chat_id=None): print("当前网络缓慢...") else: self.driver.execute_script('arguments[0].remove()', remover) - # 修改了适配新版本的二维码的滚动位置 + #修改了适配新版本的二维码的滚动位置 self.driver.execute_script( 'window.scrollTo(document.body.scrollWidth/2 - 200 , 400)') qrurl = '' @@ -310,11 +223,11 @@ def get_cookie_from_network(self, chat_id=None): web_msg and web_db.session.delete(web_msg) web_db.session.commit() return cookies - + except Exception as e: print("扫描二维码超时... 错误信息:" + str(e)) self.web_log("扫描二维码超时... 错误信息:" + str(e)) - if (gl.islooplogin == True): + if(gl.islooplogin == True): print("循环模式开启,即将重新获取二维码") self.web_log("循环模式开启,即将重新获取二维码") time.sleep(3) @@ -341,7 +254,7 @@ def sendmsg(self, chat_id=None): # 发送链接 qrurl = '' if gl.scheme: - qrurl = gl.scheme + quote_plus(decode_img(qcbase64)) + qrurl = gl.scheme+quote_plus(decode_img(qcbase64)) else: qrurl = decode_img(qcbase64) gl.pushprint(qrurl, chat_id) @@ -495,7 +408,7 @@ def _view_tips(self): # by Sean display_tip = 0 # 页面上没有加载提示的内容 display_tip = self.driver.find_element_by_css_selector( ".ant-popover-hidden") # 关闭tip则为hidden - if (display_tip == 0): # 没有关闭tip + if(display_tip == 0): # 没有关闭tip tips_close = self.driver.find_element_by_xpath( '//*[@id="app"]/div/div[2]/div/div[4]/div[1]/div[1]') tips_close.click() @@ -562,7 +475,6 @@ def swiper_valid(self): builder.release().perform() time.sleep(5) self.swiper_valid() - # 鼠标移动 def move_mouse(self, distance): diff --git a/requirements.txt b/requirements.txt index 61d1dc95..06f0a2d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,4 +14,3 @@ itsdangerous==2.0.1 Flask==2.1.0 Flask_SQLAlchemy==2.5.1 Flask_Cors==3.0.9 -qrcode=7.3.1 From 9e30e8ae88d6d5bf200a0149a07b4a378965fd00 Mon Sep 17 00:00:00 2001 From: ByteDance-opensource Date: Mon, 11 Jul 2022 11:18:27 +0800 Subject: [PATCH 11/16] docker deploy check and fix docker deploy check and fix --- README.md | 4 +- SourcePackages/pandalearning.py | 20 +-- SourcePackages/pdlearn/file.py | 4 +- .../pdlearn/historical/pandalearning.py | 9 +- SourcePackages/pdlearn/mydriver.py | 122 +++++++++++++++--- requirements.txt | 1 + 6 files changed, 127 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index a5a9df07..465925c8 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ TechXueXi为python学 xi 交流的开源非营利项目,仅作为程序员之 win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装`Visual C++ Redistributable for Visual Studio 2015` -链接已失效,请自己百度下载 +[下载链接1](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) 下载链接2: https://github.com/TechXueXi/VC-REDIST **下载安装:** @@ -194,4 +194,4 @@ https://github.com/TechXueXi/TechXueXi/issues/2 [![](https://github.com/TechXueXi/TechXueXi/blob/master/img_folder/1920px-LGPLv3_Logo.svg.png?raw=true)](https://github.com/TechXueXi/TechXueXi/blob/master/LICENSE) -# **我们不接受任何捐赠。** +# **我们不接受任何捐赠。** \ No newline at end of file diff --git a/SourcePackages/pandalearning.py b/SourcePackages/pandalearning.py index 8ef5f5e8..bfae15dc 100644 --- a/SourcePackages/pandalearning.py +++ b/SourcePackages/pandalearning.py @@ -14,7 +14,7 @@ from pdlearn.answer_question import daily, weekly, zhuanxiang from pdlearn.article_video import article, video from pdlearn.config import cfg_get - from pdlearn.mydriver import Mydriver + from pdlearn.mydriver import Mydriver, login from pdlearn.score import show_score, show_scorePush except ImportError as e: boot.try_pip_install(exception=e) @@ -69,9 +69,10 @@ def start_learn(uid, name): gl.pushprint("web模式跳过自动获取二维码,请手动点击添加按钮", chat_id=uid) print(color.red("【#️⃣】 若直接退出请运行:webserverListener.py")) return - driver_login = Mydriver() - cookies = driver_login.login() - driver_login.quit() + # driver_login = Mydriver() + # cookies = driver_login.login() + # driver_login.quit() + cookies = login() if not cookies: print("登录超时") return @@ -133,7 +134,7 @@ def start(nick_name=None): user_list.append(["", "新用户"]) for i in range(len(user_list)): try: - if nick_name == None or nick_name == user_list[i][1] or nick_name == user_list[i][0]: + if nick_name is None or nick_name == user_list[i][1] or nick_name == user_list[i][0]: _learn = threads.MyThread( user_list[i][0]+"开始学xi", start_learn, user_list[i][0], user_list[i][1], lock=Single) _learn.start() @@ -174,9 +175,10 @@ def get_all_user_name(): def add_user(chat_id=None): get_argv() gl.pushprint("请登录(登录方式请仔细阅读文档,如果觉得这是让你下载,就是你没仔细读文档):", chat_id=chat_id) - driver_login = Mydriver() - cookies = driver_login.login(chat_id) - driver_login.quit() + # driver_login = Mydriver() + # cookies = driver_login.login(chat_id) + # driver_login.quit() + cookies = login(chat_id=chat_id) if not cookies: gl.pushprint("登录超时。", chat_id=chat_id) return @@ -202,4 +204,4 @@ def add_user(chat_id=None): print("=" * 60, '''\nTechXueXi 现支持以下模式(答题时请值守电脑旁处理少部分不正常的题目):''') print(cfg_get('base.ModeText', "") + '\n' + "=" * 60) # 模式提示文字请在 ./config/default_template.conf 处修改。 - start() + start() \ No newline at end of file diff --git a/SourcePackages/pdlearn/file.py b/SourcePackages/pdlearn/file.py index 271e177f..797dcd33 100644 --- a/SourcePackages/pdlearn/file.py +++ b/SourcePackages/pdlearn/file.py @@ -58,7 +58,7 @@ def save_json_data(filename, object_to_save, sort_keys=True): def get_conf_file(filename, template_conf_str): check_directory(filename) - if(os.path.exists(filename) and os.path.getsize(filename) != 0): + if os.path.exists(filename) and os.path.getsize(filename) != 0: try: conf_obj = ConfigFactory.parse_file(filename) except Exception as e: @@ -74,4 +74,4 @@ def get_conf_file(filename, template_conf_str): def save_text_file(filename, text): check_directory(filename) with open(filename, 'w', encoding='utf-8') as o: - o.write(text) + o.write(text) \ No newline at end of file diff --git a/SourcePackages/pdlearn/historical/pandalearning.py b/SourcePackages/pdlearn/historical/pandalearning.py index 666f8e81..9beeaf5d 100644 --- a/SourcePackages/pdlearn/historical/pandalearning.py +++ b/SourcePackages/pdlearn/historical/pandalearning.py @@ -1,5 +1,7 @@ from pdlearn import dingding from pdlearn import user +from pdlearn.mydriver import login + def user_flag(dd_status, uname): if False and dd_status: @@ -10,9 +12,10 @@ def user_flag(dd_status, uname): cookies = user.get_cookie(uname) if not cookies: print("未找到有效登录信息,需要登录") - driver_login = Mydriver(nohead=False) - cookies = driver_login.login() - driver_login.quit() + # driver_login = Mydriver(nohead=False) + # cookies = driver_login.login() + # driver_login.quit() + cookies = login() else: cookies = dingding.dd_login_status(uname) a_log = user.get_a_log(uname) diff --git a/SourcePackages/pdlearn/mydriver.py b/SourcePackages/pdlearn/mydriver.py index 78e05d5c..7a5ae7a1 100644 --- a/SourcePackages/pdlearn/mydriver.py +++ b/SourcePackages/pdlearn/mydriver.py @@ -5,10 +5,12 @@ import re import string import time +import uuid from typing import Any, List from urllib.parse import quote, quote_plus import lxml +import qrcode import requests import selenium from bs4 import BeautifulSoup @@ -22,27 +24,112 @@ from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait + +from pdlearn.globalvar import web from webServerConf import WebMessage, WebQrUrl, web_db -from pdlearn import auto -from pdlearn import globalvar as gl +from pdlearn import globalvar as gl, auto from pdlearn import user, user_agent from pdlearn.web import WebHandler from pdlearn.config import cfg_get from pdlearn.dingding import DingDingHandler -# from pdlearn.qywx import WeChat # 使用微信发送二维码图片到手机 +# from pdlearn.qywx import WeChat # 使用微信发送二维码图片到手机 + def decode_img(data): if None == data: raise Exception('未获取到二维码,请检查网络并重试') - img_b64decode = base64.b64decode(data[data.index(';base64,')+8:]) + img_b64decode = base64.b64decode(data[data.index(';base64,') + 8:]) decoded = pyzbar.decode(Image.open(io.BytesIO(img_b64decode))) return decoded[0].data.decode("utf-8") +def login(chat_id=None): + client = requests.session() + # 1. 获取sign + sign: str = client.get(url="https://pc-api.xuexi.cn/open/api/sns/sign").json().get("data").get("sign") + # 2. 获取qr + qr_data: str = client.get("https://login.xuexi.cn/user/qrcode/generate").json().get("result") + # 3. 生成登录链接 + code_url = f"https://login.xuexi.cn/login/qrcommit?showmenu=false&code={qr_data}&appId=dingoankubyrfkttorhpou" + # 生成二维码 + qr = qrcode.QRCode(version=None, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=2) + qr.add_data(code_url) + qr.make(fit=True) + img = qr.make_image() + img.show() + img.save("qrcode.png") + print("二维码已保存到qrcode.png") + # 二维码转base64 + output_buffer = io.BytesIO() + img.save(output_buffer, format='JPEG') + byte_data = output_buffer.getvalue() + qrbase64 = "data:image/png;base64," + base64.b64encode(byte_data).decode("utf-8") + + # 推送消息 + if gl.nohead or cfg_get("addition.SendLoginQRcode", 0) == 1: + print("二维码将发往机器人...\n" + "=" * 60) + # 发送二维码 + gl.send_qrbase64(qrbase64) + # 发送链接 + if gl.scheme: + qrurl = gl.scheme + quote_plus(code_url) + else: + qrurl = decode_img(qrbase64) + gl.pushprint(qrurl, chat_id) + + web_qr_url = "" + web_msg = "" + try: + web_qr_url = web_db.session.query( + WebQrUrl).filter_by(url=qrbase64).first() + web_msg = web_db.session.query( + WebMessage).filter_by(text=code_url).first() + except Exception as e: + print(str(e)) + print("web数据库添加失败") + web_db.session.rollback() + + secret = "" + print(f"sign: {sign}, data: {qr_data}") + for i in range(60): + resp = client.post(url="https://login.xuexi.cn/login/login_with_qr", + data={"qrCode": qr_data, "goto": "https://oa.xuexi.cn", "pdmToken": ""}, + ).json() + if resp.get("success"): + secret = resp.get("data") + break + else: + print("等待扫码中---") + print(resp) + time.sleep(5) + if secret == "": + if gl.islooplogin: + print("循环模式开启,即将重新获取二维码") + time.sleep(3) + return login(chat_id) + return None + client.get("https://pc-api.xuexi.cn/login/secure_check", + params={"code": secret.split("=")[1], "state": sign + str(uuid.uuid4())}) + + print("token ==> " + client.cookies.get("token")) + cookies = [ + {'domain': '.xuexi.cn', + "expiry": int(time.time())+12*3600, + 'httpOnly': False, + 'name': 'token', 'path': '/', + 'secure': False, + 'value': client.cookies.get("token")}] + user.save_cookies(cookies) + web_qr_url and web_db.session.delete(web_qr_url) + web_msg and web_db.session.delete(web_msg) + web_db.session.commit() + return cookies + + class title_of_login: def __call__(self, driver): """ 用来结合webDriverWait判断出现的title """ @@ -50,7 +137,7 @@ def __call__(self, driver): is_title1 = bool(EC.title_is(u'我的学习')(driver)) is_title2 = bool(EC.title_is(u'系统维护中')(driver)) except Exception as e: - print("chrome 开启失败。"+str(e)) + print("chrome 开启失败。" + str(e)) exit() if is_title1 or is_title2: return True @@ -110,27 +197,27 @@ def __init__(self, noimg=True, nohead=True): mydriver_log = '可找到 "/opt/google/chrome/chrome"' # ==================== 寻找 chromedriver ==================== chromedriver_paths = [ - "./chrome/chromedriver.exe", # win - "./chromedriver", # linux - "/usr/bin/chromedriver", # linux用户安装 + "./chrome/chromedriver.exe", # win + "./chromedriver", # linux + "/usr/bin/chromedriver", # linux用户安装 # raspberry linux (需要包安装chromedriver) "/usr/lib64/chromium-browser/chromedriver", # raspberry linux (需要包安装chromedriver) "/usr/lib/chromium-browser/chromedriver", - "/usr/local/bin/chromedriver", # linux 包安装chromedriver + "/usr/local/bin/chromedriver", # linux 包安装chromedriver ] have_find = False for one_path in chromedriver_paths: if os.path.exists(one_path): self.driver = self.webdriver.Chrome( executable_path=one_path, chrome_options=self.options) - mydriver_log = mydriver_log+'\r\n可找到 "' + one_path + '"' + mydriver_log = mydriver_log + '\r\n可找到 "' + one_path + '"' have_find = True break if not have_find: self.driver = self.webdriver.Chrome( chrome_options=self.options) - mydriver_log = mydriver_log+'\r\n未找到chromedriver,使用默认方法。' + mydriver_log = mydriver_log + '\r\n未找到chromedriver,使用默认方法。' except: print("=" * 60) print(" Chrome 浏览器初始化失败。信息:") @@ -170,7 +257,7 @@ def get_cookie_from_network(self, chat_id=None): print("当前网络缓慢...") else: self.driver.execute_script('arguments[0].remove()', remover) - #修改了适配新版本的二维码的滚动位置 + # 修改了适配新版本的二维码的滚动位置 self.driver.execute_script( 'window.scrollTo(document.body.scrollWidth/2 - 200 , 400)') qrurl = '' @@ -223,11 +310,11 @@ def get_cookie_from_network(self, chat_id=None): web_msg and web_db.session.delete(web_msg) web_db.session.commit() return cookies - + except Exception as e: print("扫描二维码超时... 错误信息:" + str(e)) self.web_log("扫描二维码超时... 错误信息:" + str(e)) - if(gl.islooplogin == True): + if (gl.islooplogin == True): print("循环模式开启,即将重新获取二维码") self.web_log("循环模式开启,即将重新获取二维码") time.sleep(3) @@ -254,7 +341,7 @@ def sendmsg(self, chat_id=None): # 发送链接 qrurl = '' if gl.scheme: - qrurl = gl.scheme+quote_plus(decode_img(qcbase64)) + qrurl = gl.scheme + quote_plus(decode_img(qcbase64)) else: qrurl = decode_img(qcbase64) gl.pushprint(qrurl, chat_id) @@ -408,7 +495,7 @@ def _view_tips(self): # by Sean display_tip = 0 # 页面上没有加载提示的内容 display_tip = self.driver.find_element_by_css_selector( ".ant-popover-hidden") # 关闭tip则为hidden - if(display_tip == 0): # 没有关闭tip + if (display_tip == 0): # 没有关闭tip tips_close = self.driver.find_element_by_xpath( '//*[@id="app"]/div/div[2]/div/div[4]/div[1]/div[1]') tips_close.click() @@ -475,6 +562,7 @@ def swiper_valid(self): builder.release().perform() time.sleep(5) self.swiper_valid() + # 鼠标移动 def move_mouse(self, distance): @@ -612,4 +700,4 @@ def _search(self, content, options, exclude=''): _, i = random.choice(counts) print(f'搜索结果全0,随机一个 {i}') print(f'根据搜索结果: {i} 很可能是正确答案') - return i + return i \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 06f0a2d8..8db321d7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,4 @@ itsdangerous==2.0.1 Flask==2.1.0 Flask_SQLAlchemy==2.5.1 Flask_Cors==3.0.9 +qrcode==7.3.1 \ No newline at end of file From 24fd05a8abe0cae3e60df25ffdc161a59d7595f9 Mon Sep 17 00:00:00 2001 From: tencent-wechat Date: Mon, 11 Jul 2022 18:32:08 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourcePackages/pdlearn/mydriver.py | 4 ++-- SourcePackages/pdlearn/version_info.json | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/SourcePackages/pdlearn/mydriver.py b/SourcePackages/pdlearn/mydriver.py index 7a5ae7a1..a8729826 100644 --- a/SourcePackages/pdlearn/mydriver.py +++ b/SourcePackages/pdlearn/mydriver.py @@ -223,9 +223,9 @@ def __init__(self, noimg=True, nohead=True): print(" Chrome 浏览器初始化失败。信息:") print(mydriver_log) print('您可以检查下:') - print("1. 是否存在./chrome/chromedriver.exe 或 PATH 中是否存在 chromedriver.exe") + print("1. 是否存在./chrome/chromedriver 或 PATH 中是否存在 chromedriver") print( - "2. 浏览器地址栏输入 chrome://version 看到的chrome版本 和 运行 chromedriver.exe 显示的版本整数部分是否相同") + "2. 浏览器地址栏输入 chrome://version 看到的chrome版本 和 运行 chromedriver 显示的版本整数部分是否相同") print("针对上述问题,请在 https://registry.npmmirror.com/binary.html?path=chromedriver/ 下载对应版本程序并放在合适的位置") print("3. 如不是以上问题,请提issue,附上报错信息和您的环境信息") print("=" * 60) diff --git a/SourcePackages/pdlearn/version_info.json b/SourcePackages/pdlearn/version_info.json index 8be8d496..1b2dfcb3 100644 --- a/SourcePackages/pdlearn/version_info.json +++ b/SourcePackages/pdlearn/version_info.json @@ -1,9 +1,12 @@ { - "techxuexi_version": "v20220411", + "techxuexi_version": "v20220711", "notice": "欢迎使用 TechXueXi", "least_version": "v20211020", "old_version_warning": "您的版本太旧,请立即更新", "techxuexi_update_log": [{ + "version": "v20220711", + "info": "修复qrcode的问题" + },{ "version": "v20220411", "info": "修复Linux or macOS上Pillow的问题" },{ From b0b7167b8e9d095142ec5421fa8a6fbab9753805 Mon Sep 17 00:00:00 2001 From: johlanse Date: Mon, 8 Aug 2022 12:01:22 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E5=9B=A0=E6=A3=80=E6=B5=8B=E5=88=B0?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=A4=A7=E9=87=8F=E6=BB=91=E5=9D=97=EF=BC=8C?= =?UTF-8?q?=E5=9B=9E=E9=80=80=E7=99=BB=E5=BD=95=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourcePackages/pandalearning.py | 18 +++++++++--------- .../pdlearn/historical/pandalearning.py | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/SourcePackages/pandalearning.py b/SourcePackages/pandalearning.py index bfae15dc..977e385b 100644 --- a/SourcePackages/pandalearning.py +++ b/SourcePackages/pandalearning.py @@ -14,7 +14,7 @@ from pdlearn.answer_question import daily, weekly, zhuanxiang from pdlearn.article_video import article, video from pdlearn.config import cfg_get - from pdlearn.mydriver import Mydriver, login + from pdlearn.mydriver import Mydriver from pdlearn.score import show_score, show_scorePush except ImportError as e: boot.try_pip_install(exception=e) @@ -69,10 +69,10 @@ def start_learn(uid, name): gl.pushprint("web模式跳过自动获取二维码,请手动点击添加按钮", chat_id=uid) print(color.red("【#️⃣】 若直接退出请运行:webserverListener.py")) return - # driver_login = Mydriver() - # cookies = driver_login.login() - # driver_login.quit() - cookies = login() + driver_login = Mydriver() + cookies = driver_login.login() + driver_login.quit() + # cookies = login() if not cookies: print("登录超时") return @@ -175,10 +175,10 @@ def get_all_user_name(): def add_user(chat_id=None): get_argv() gl.pushprint("请登录(登录方式请仔细阅读文档,如果觉得这是让你下载,就是你没仔细读文档):", chat_id=chat_id) - # driver_login = Mydriver() - # cookies = driver_login.login(chat_id) - # driver_login.quit() - cookies = login(chat_id=chat_id) + driver_login = Mydriver() + cookies = driver_login.login(chat_id) + driver_login.quit() + # cookies = login(chat_id=chat_id) if not cookies: gl.pushprint("登录超时。", chat_id=chat_id) return diff --git a/SourcePackages/pdlearn/historical/pandalearning.py b/SourcePackages/pdlearn/historical/pandalearning.py index 9beeaf5d..532e8215 100644 --- a/SourcePackages/pdlearn/historical/pandalearning.py +++ b/SourcePackages/pdlearn/historical/pandalearning.py @@ -1,6 +1,6 @@ from pdlearn import dingding from pdlearn import user -from pdlearn.mydriver import login +from pdlearn.mydriver import Mydriver def user_flag(dd_status, uname): @@ -12,10 +12,10 @@ def user_flag(dd_status, uname): cookies = user.get_cookie(uname) if not cookies: print("未找到有效登录信息,需要登录") - # driver_login = Mydriver(nohead=False) - # cookies = driver_login.login() - # driver_login.quit() - cookies = login() + driver_login = Mydriver(nohead=False) + cookies = driver_login.login() + driver_login.quit() + # cookies = login() else: cookies = dingding.dd_login_status(uname) a_log = user.get_a_log(uname) From 0c04f89013bdc0df4896fa8d9c7efaa2b0419c12 Mon Sep 17 00:00:00 2001 From: Rerange <78526012+Quandong-Zhang@users.noreply.github.com> Date: Sun, 15 Jan 2023 09:37:49 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E2=80=9C=E5=B8=B8?= =?UTF-8?q?=E8=A7=81=E9=97=AE=E9=A2=98=E2=80=9D=E9=83=A8=E5=88=86=E6=8E=92?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 465925c8..7d8655b3 100644 --- a/README.md +++ b/README.md @@ -129,11 +129,9 @@ TechXueXi为python学 xi 交流的开源非营利项目,仅作为程序员之 # 📑常见问题 -win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装`Visual C++ Redistributable for Visual Studio 2015` +win平台可能提示`无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll`等缺失dll文件的问题而无法使用,尝试安装[`Visual C++ Redistributable for Visual Studio 2015`](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) -[下载链接1](https://www.microsoft.com/zh-CN/download/details.aspx?id=48145) 下载链接2: https://github.com/TechXueXi/VC-REDIST - -**下载安装:** +**下载链接:** [![](https://img.shields.io/badge/download-vc_redist.x64-blue.svg?style=for-the-badge&logo=visualstudiocode)](https://raw.fastgit.org/TechXueXi/VC-REDIST/master/vc_redist.x64.exe) @@ -194,4 +192,4 @@ https://github.com/TechXueXi/TechXueXi/issues/2 [![](https://github.com/TechXueXi/TechXueXi/blob/master/img_folder/1920px-LGPLv3_Logo.svg.png?raw=true)](https://github.com/TechXueXi/TechXueXi/blob/master/LICENSE) -# **我们不接受任何捐赠。** \ No newline at end of file +# **我们不接受任何捐赠。** From 6953104e5ff941bf7ca56b69595deda94fdf4f82 Mon Sep 17 00:00:00 2001 From: dadudu-peng <59424893+dadudu-peng@users.noreply.github.com> Date: Sun, 21 May 2023 15:39:15 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SourcePackages/pandalearning.py | 6 +-- SourcePackages/pdlearn/answer_question.py | 62 ++++++++++++++++------- SourcePackages/pdlearn/const.py | 2 +- SourcePackages/pdlearn/get_links.py | 28 +++++----- SourcePackages/pdlearn/score.py | 7 ++- SourcePackages/pdlearn/version_info.json | 5 +- 6 files changed, 71 insertions(+), 39 deletions(-) diff --git a/SourcePackages/pandalearning.py b/SourcePackages/pandalearning.py index 977e385b..510ccf57 100644 --- a/SourcePackages/pandalearning.py +++ b/SourcePackages/pandalearning.py @@ -99,8 +99,8 @@ def start_learn(uid, name): article_thread.join() video_thread.join() if TechXueXi_mode in ["2", "3"]: - print('开始每日答题……') - daily(cookies, scores) +# print('开始每日答题……') +# daily(cookies, scores) print('开始每周答题……') weekly(cookies, scores) if nohead != True or gl.zhuanxiang == True: @@ -204,4 +204,4 @@ def add_user(chat_id=None): print("=" * 60, '''\nTechXueXi 现支持以下模式(答题时请值守电脑旁处理少部分不正常的题目):''') print(cfg_get('base.ModeText', "") + '\n' + "=" * 60) # 模式提示文字请在 ./config/default_template.conf 处修改。 - start() \ No newline at end of file + start() diff --git a/SourcePackages/pdlearn/answer_question.py b/SourcePackages/pdlearn/answer_question.py index f984ea60..a3a0bc81 100644 --- a/SourcePackages/pdlearn/answer_question.py +++ b/SourcePackages/pdlearn/answer_question.py @@ -24,21 +24,16 @@ def generate_tiku_data(quiz_type=None, tip=None, option=None, answer=None, quest def find_available_quiz(quiz_type, driver_ans, uid): - # 这里有些问题,专项学习一开始会出现 1 2 3 4 5 10,一共6个button - # 第一次find_elements_by_css_selector以后只会学到前5页和最后一页,这6页学完以后就会找不到 - # 这里改动先找最后一个button的页码,然后每次点击,更新pages,模拟手动点击的过程 - prestr = ".ant-pagination-item" - pages = driver_ans.driver.find_elements_by_css_selector(prestr) - last = int(pages[len(pages)-1].text) - for p in range(0, last, 1): # (从最后一页开始往前找做题)从前往后找题,专项答题等没有那么离谱 - pages = driver_ans.driver.find_elements_by_css_selector(prestr) - for index in range(0, len(pages), 1): - if pages[index].text == str(p+1): - time.sleep(0.5) - print('进入答题第' + str(p+1) + '页') - pages[index].click() - time.sleep(0.5) - break + all_pages = driver_ans.driver.find_elements_by_css_selector( + ".ant-pagination-item") + pages=int(all_pages[-1].get_attribute('title')) + # page_next= driver_ans.driver.find_elements_by_css_selector('ant-pagination-item-link') + print('总页数'+str(pages)) + for p in range(0, pages, 1): # (从最后一页开始往前找做题)从前往后找题,专项答题等没有那么离谱 + time.sleep(0.5) + print('进入答题第' + str(p+1) + '页') + # page_next[0].click() + time.sleep(0.5) dati = [] if quiz_type == "weekly": # 寻找可以做的题 dati = driver_ans.driver.find_elements_by_css_selector( @@ -55,6 +50,39 @@ def find_available_quiz(quiz_type, driver_ans, uid): to_click = j # auto.prompt("wait for Enter press...") return to_click + page_next= driver_ans.driver.find_elements_by_css_selector('.ant-pagination-next') + page_next[0].click() +# # 这里有些问题,专项学习一开始会出现 1 2 3 4 5 10,一共6个button +# # 第一次find_elements_by_css_selector以后只会学到前5页和最后一页,这6页学完以后就会找不到 +# # 这里改动先找最后一个button的页码,然后每次点击,更新pages,模拟手动点击的过程 +# prestr = ".ant-pagination-item" +# pages = driver_ans.driver.find_elements_by_css_selector(prestr) +# last = int(pages[len(pages)-1].text) +# for p in range(0, last, 1): # (从最后一页开始往前找做题)从前往后找题,专项答题等没有那么离谱 +# pages = driver_ans.driver.find_elements_by_css_selector(prestr) +# for index in range(0, len(pages), 1): +# if pages[index].text == str(p+1): +# time.sleep(0.5) +# print('进入答题第' + str(p+1) + '页') +# pages[index].click() +# time.sleep(0.5) +# break +# dati = [] +# if quiz_type == "weekly": # 寻找可以做的题 +# dati = driver_ans.driver.find_elements_by_css_selector( +# "#app .month .week button") +# elif quiz_type == "zhuanxiang": # 寻找可以做的题 +# # 可以使用 #app .items .item button:not(.ant-btn-background-ghost) 选择器,但会遗漏掉”继续答题“的部分 +# dati = driver_ans.driver.find_elements_by_css_selector( +# "#app .items .item button") +# for i in range(len(dati)-1, -1, -1): # 从最后一个遍历到第一个 +# j = dati[i] +# if ("重新" in j.text or "满分" in j.text): +# continue +# else: +# to_click = j +# # auto.prompt("wait for Enter press...") +# return to_click @exception_catcher() @@ -528,7 +556,7 @@ def daily(cookies, scores, driver_default=None): def weekly(cookies, scores, driver_default=None): quiz_type = "weekly" score_all = const.weekly_all - quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[7]/div[2]/div[2]/div' + quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[6]/div[2]/div[2]/div' category_xpath = '//*[@id="app"]/div/div[2]/div/div[4]/div[1]/div[1]' answer_question(quiz_type, cookies, scores, score_all, quiz_xpath, category_xpath, driver_default=driver_default) @@ -537,7 +565,7 @@ def weekly(cookies, scores, driver_default=None): def zhuanxiang(cookies, scores, driver_default=None): quiz_type = "zhuanxiang" score_all = const.zhuanxiang_all - quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[6]/div[2]/div[2]/div' + quiz_xpath = '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[7]/div[2]/div[2]/div' category_xpath = '//*[@id="app"]/div/div[2]/div/div[6]/div[1]/div[1]' answer_question(quiz_type, cookies, scores, score_all, quiz_xpath, category_xpath, driver_default=driver_default) diff --git a/SourcePackages/pdlearn/const.py b/SourcePackages/pdlearn/const.py index df059f66..b308b495 100644 --- a/SourcePackages/pdlearn/const.py +++ b/SourcePackages/pdlearn/const.py @@ -6,4 +6,4 @@ class const: login_all = 1 # 每日登陆 daily_all = 5 # 每日答题 weekly_all = 5 # 每周答题 - zhuanxiang_all = 10 # 专项答题 \ No newline at end of file + zhuanxiang_all = 5 # 专项答题 diff --git a/SourcePackages/pdlearn/get_links.py b/SourcePackages/pdlearn/get_links.py index 4f1cf713..7446bde7 100644 --- a/SourcePackages/pdlearn/get_links.py +++ b/SourcePackages/pdlearn/get_links.py @@ -25,23 +25,21 @@ def get_article_links(): def get_video_links(): try: - video_json = requests.get("https://www.xuexi.cn/lgdata/4426aa87b0b64ac671c96379a3a8bd26/db086044562a57b441c24f2af1c8e101.json").content.decode("utf8") - video=json.loads(video_json)["DataSet"] + # 解决视频不能正常学习的问题 + video_json = requests.get( + "https://www.xuexi.cn/lgdata/4426aa87b0b64ac671c96379a3a8bd26/db086044562a57b441c24f2af1c8e101.json").content.decode( + "utf8") + video = json.loads(video_json)["DataSet"] json_urls = [] - link = [] for i in video: - json_urls.append("https://www.xuexi.cn/lgdata/"+i.split('!')[1]) - while len(link) < 20: - choose_json_url = random.choice(json_urls) - choose_json_str = requests.get(choose_json_url).content.decode("utf8") - pattern = r'https://www.xuexi.cn/[^,"]*' - choose_links = re.findall(pattern, choose_json_str, re.I) - if(len(choose_links) >= 5): - choose_sample = random.sample(choose_links, 5) - for c in choose_sample: - link.append(c) - random.shuffle(link) - return link + json_urls.append("https://www.xuexi.cn/lgdata/" + i.split('!')[1]) + + all_video_object = [] + for url in json_urls: + choose_json_str = requests.get(url).content.decode("utf8") + all_video_object.extend(json.loads(choose_json_str)) + new_list = sorted(all_video_object, key=lambda x: x.get("publishTime", "0"), reverse=False) + return [news["url"] for news in new_list] except: print("=" * 60) print("get_video_links获取失败") diff --git a/SourcePackages/pdlearn/score.py b/SourcePackages/pdlearn/score.py index f4c1fc59..245b11bb 100644 --- a/SourcePackages/pdlearn/score.py +++ b/SourcePackages/pdlearn/score.py @@ -7,6 +7,8 @@ from pdlearn import file from pdlearn.const import const import threading +import time +import datetime # 总积分 @@ -63,7 +65,8 @@ def get_score(cookies): jar = RequestsCookieJar() for cookie in cookies: jar.set(cookie['name'], cookie['value']) - total_json = requests.get("https://pc-api.xuexi.cn/open/api/score/get", cookies=jar, + t = time.time() + total_json = requests.get("https://pc-proxy-api.xuexi.cn/delegate/score/get?_t=%d"%(int(round(t * 1000))), cookies=jar, headers={'Cache-Control': 'no-cache'}).content.decode("utf8") if not json.loads(total_json)["data"]: globalvar.pushprint("cookie过期,请重新登录", chat_id) @@ -83,7 +86,7 @@ def get_score(cookies): # headers={'Cache-Control': 'no-cache'}).content.decode("utf8") today = 0 # today = int(json.loads(today_json)["data"]["score"]) - score_json = requests.get("https://pc-proxy-api.xuexi.cn/api/score/days/listScoreProgress?sence=score&deviceType=2", cookies=jar, + score_json = requests.get("https://pc-proxy-api.xuexi.cn/delegate/score/days/listScoreProgress?sence=score&deviceType=2", cookies=jar, headers={'Cache-Control': 'no-cache'}).content.decode("utf8") dayScoreDtos = json.loads(score_json)["data"] today = dayScoreDtos["totalScore"] diff --git a/SourcePackages/pdlearn/version_info.json b/SourcePackages/pdlearn/version_info.json index 1b2dfcb3..fe5ab3ec 100644 --- a/SourcePackages/pdlearn/version_info.json +++ b/SourcePackages/pdlearn/version_info.json @@ -1,9 +1,12 @@ { - "techxuexi_version": "v20220711", + "techxuexi_version": "v20230521", "notice": "欢迎使用 TechXueXi", "least_version": "v20211020", "old_version_warning": "您的版本太旧,请立即更新", "techxuexi_update_log": [{ + "version": "v20230521", + "info": "修复若干问题" + },{ "version": "v20220711", "info": "修复qrcode的问题" },{ From 74d8b04ec87e3abb09c9ce99d6d4859260447651 Mon Sep 17 00:00:00 2001 From: moruoxian <794997265moruoxian@gmail.com> Date: Thu, 23 Nov 2023 16:45:18 +0800 Subject: [PATCH 16/16] add chromdriver default without proxy option --- SourcePackages/pdlearn/mydriver.py | 4 ++++ requirements.txt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/SourcePackages/pdlearn/mydriver.py b/SourcePackages/pdlearn/mydriver.py index a8729826..8e9c8f29 100644 --- a/SourcePackages/pdlearn/mydriver.py +++ b/SourcePackages/pdlearn/mydriver.py @@ -186,6 +186,10 @@ def __init__(self, noimg=True, nohead=True): self.options.add_argument("--disable-blink-features") self.options.add_argument( "--disable-blink-features=AutomationControlled") + # 设置为不走代理 + self.options.add_argument('--proxy-server="direct://"') + self.options.add_argument('--proxy-bypass-list=*') + self.webdriver = webdriver # ==================== 寻找 chrome ==================== diff --git a/requirements.txt b/requirements.txt index 8db321d7..9e037529 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ gunicorn==20.1.0 PySocks==1.7.1 urllib3==1.26.7 itsdangerous==2.0.1 -Flask==2.1.0 +Flask==2.1.3 Flask_SQLAlchemy==2.5.1 Flask_Cors==3.0.9 qrcode==7.3.1 \ No newline at end of file