Browse Source

add pdlearn

liuyuqi-dellpc 4 years ago
parent
commit
200b6c4cd4

+ 191 - 0
pdlearn/pandalearning.py

@@ -0,0 +1,191 @@
+import time
+from sys import argv
+import random
+from pdlearn import version
+from pdlearn import user
+from pdlearn import dingding
+from pdlearn import mydriver
+from pdlearn import score
+from pdlearn import threads
+from pdlearn import get_links
+
+
+def user_flag(dd_status, uname):
+    if dd_status:
+        cookies = dingding.dd_login_status(uname, has_dd=True)
+    else:
+        if (input("是否保存钉钉帐户密码,保存后可后免登陆学习(Y/N) ")) not in ["y", "Y"]:
+            driver_login = mydriver.Mydriver(nohead=False)
+            cookies = driver_login.login()
+        else:
+            cookies = dingding.dd_login_status(uname)
+    a_log = user.get_a_log(uname)
+    v_log = user.get_v_log(uname)
+
+    return cookies, a_log, v_log
+
+
+def get_argv():
+    nohead = True
+    lock = False
+    stime = False
+    if len(argv) > 2:
+        if argv[2] == "hidden":
+            nohead = True
+        elif argv[2] == "show":
+            nohead = False
+    if len(argv) > 3:
+        if argv[3] == "single":
+            lock = True
+        elif argv[3] == "multithread":
+            lock = False
+    if len(argv) > 4:
+        if argv[4].isdigit():
+            stime = argv[4]
+    return nohead, lock, stime
+
+
+def show_score(cookies):
+    total, each = score.get_score(cookies)
+    print("当前学习总积分:" + str(total))
+    print("阅读文章:{}/6,观看视频:{}/6,登陆:{}/1,文章时长:{}/6,视频时长:{}/6".format(*each))
+    return total, each
+
+
+def article(cookies, a_log, each):
+    if each[0] < 6 or each[3] < 8:
+        driver_article = mydriver.Mydriver(nohead=nohead)
+        driver_article.get_url("https://www.xuexi.cn/notFound.html")
+        driver_article.set_cookies(cookies)
+        links = get_links.get_article_links()
+        try_count = 0
+        while True:
+            if each[0] < 6 and try_count < 10:
+                a_num = 6 - each[0]
+                for i in range(a_log, a_log + a_num):
+                    driver_article.get_url(links[i])
+                    time.sleep(random.randint(5, 15))
+                    for j in range(120):
+                        if random.random() > 0.5:
+                            driver_article.go_js('window.scrollTo(0, document.body.scrollHeight/120*{})'.format(j))
+                        print("\r文章学习中,文章剩余{}篇,本篇剩余时间{}秒".format(a_log + a_num - i, 120 - j), end="")
+                        time.sleep(1)
+                    driver_article.go_js('window.scrollTo(0, document.body.scrollHeight)')
+                    total, each = show_score(cookies)
+                    if each[0] >= 6:
+                        print("检测到文章数量分数已满,退出学习")
+                        break
+                a_log += a_num
+            else:
+                with open("./user/{}/a_log".format(uname), "w", encoding="utf8") as fp:
+                    fp.write(str(a_log))
+                break
+        try_count = 0
+        while True:
+            if each[3] < 6 and try_count < 10:
+                num_time = 60
+                driver_article.get_url(links[a_log-1])
+                time.sleep(random.randint(5, 15))
+                remaining = (6 - each[3]) * 4 * num_time
+                for i in range(remaining):
+                    if random.random() > 0.5:
+                        driver_article.go_js(
+                            'window.scrollTo(0, document.body.scrollHeight/{}*{})'.format(remaining, i))
+                    print("\r文章时长学习中,文章总时长剩余{}秒".format(remaining - i), end="")
+                    time.sleep(1)
+                    if i % (120) == 0 and i != remaining:
+                        total, each = show_score(cookies)
+                        if each[3] >= 6:
+                            print("检测到文章时长分数已满,退出学习")
+                            break
+                driver_article.go_js('window.scrollTo(0, document.body.scrollHeight)')
+                total, each = show_score(cookies)
+            else:
+                break
+        if try_count < 10:
+            print("文章学习完成")
+        else:
+            print("文章学习出现异常,请检查用户名下a_log文件记录数")
+        driver_article.quit()
+    else:
+        print("文章之前学完了")
+
+
+def video(cookies, v_log, each):
+    if each[1] < 6 or each[4] < 10:
+        driver_video = mydriver.Mydriver(nohead=nohead)
+        driver_video.get_url("https://www.xuexi.cn/notFound.html")
+        driver_video.set_cookies(cookies)
+        links = get_links.get_video_links()
+        try_count = 0
+        while True:
+            if each[1] < 6 and try_count < 10:
+                v_num = 6 - each[1]
+                for i in range(v_log, v_log + v_num):
+                    driver_video.get_url(links[i])
+                    time.sleep(random.randint(5, 15))
+                    for j in range(180):
+                        if random.random() > 0.5:
+                            driver_video.go_js('window.scrollTo(0, document.body.scrollHeight/180*{})'.format(j))
+                        print("\r视频学习中,视频剩余{}个,本次剩余时间{}秒".format(v_log + v_num - i, 180 - j), end="")
+                        time.sleep(1)
+                    driver_video.go_js('window.scrollTo(0, document.body.scrollHeight)')
+                    total, each = show_score(cookies)
+                    if each[1] >= 6:
+                        print("检测到视频数量分数已满,退出学习")
+                        break
+                v_log += v_num
+            else:
+                with open("./user/{}/v_log".format(uname), "w", encoding="utf8") as fp:
+                    fp.write(str(v_log))
+                break
+        try_count = 0
+        while True:
+            if each[4] < 6 and try_count < 10:
+                num_time = 60
+                driver_video.get_url(links[v_log-1])
+                time.sleep(random.randint(5, 15))
+                remaining = (6 - each[4]) * 3 * num_time
+                for i in range(remaining):
+                    if random.random() > 0.5:
+                        driver_video.go_js(
+                            'window.scrollTo(0, document.body.scrollHeight/{}*{})'.format(remaining, i))
+                    print("\r视频学习中,视频总时长剩余{}秒".format(remaining - i), end="")
+                    time.sleep(1)
+                    if i % (180) == 0 and i != remaining:
+                        total, each = show_score(cookies)
+                        if each[4] >= 6:
+                            print("检测到视频时长分数已满,退出学习")
+                            break
+                driver_video.go_js('window.scrollTo(0, document.body.scrollHeight)')
+                total, each = show_score(cookies)
+            else:
+                break
+        if try_count < 10:
+            print("视频学习完成")
+        else:
+            print("视频学习出现异常,请检查用户名下v_log文件记录数")
+        driver_video.quit()
+    else:
+        print("视频之前学完了")
+
+
+if __name__ == '__main__':
+    #  0 读取版本信息
+    start_time = time.time()
+    info_shread = threads.MyThread("获取更新信息...", version.up_info)
+    info_shread.start()
+    #  1 创建用户标记,区分多个用户历史纪录
+    dd_status, uname = user.get_user()
+    cookies, a_log, v_log = user_flag(dd_status, uname)
+    total, each = show_score(cookies)
+
+    nohead, lock, stime = get_argv()
+    article_thread = threads.MyThread("文章学习", article, cookies, a_log, each, lock=lock)
+    video_thread = threads.MyThread("视频学习", video, cookies, v_log, each, lock=lock)
+    article_thread.start()
+    video_thread.start()
+    article_thread.join()
+    video_thread.join()
+    print("总计用时" + str(int(time.time() - start_time) / 60) + "分钟")
+    user.shutdown(stime)

+ 0 - 0
pdlearn/pdlearn/__init__.py


+ 45 - 0
pdlearn/pdlearn/dingding.py

@@ -0,0 +1,45 @@
+import re
+from pdlearn import mydriver
+import sys
+
+
+def get_dd():
+    while True:
+        dname = input('请输入正确的学习强国帐号(钉钉手机号):')
+        ret = re.match(r"^1[3-9]\d{9}$", dname)
+        if ret:
+            pwd = input("请输入学习强国密码:")
+            break
+    return dname, pwd
+
+
+def dd_login_status(uname, has_dd=False):
+    while True:
+        if has_dd:
+            dname, pwd = load_dingding("./user/{}/dingding".format(uname))
+            print("读取用户信息成功")
+        else:
+            dname, pwd = get_dd()
+        driver_login = mydriver.Mydriver(noimg=False)
+        login_status = driver_login.dd_login(dname, pwd)
+        if login_status:
+            save_dingding("./user/{}/dingding".format(uname), dname, pwd)
+            cookies = driver_login.get_cookies()
+            break
+    return cookies
+
+
+def save_dingding(user_path, dname, pwd):
+    with open(user_path, "w", encoding="utf8") as fp:
+        fp.write(dname + "," + pwd)
+
+
+def load_dingding(user_path):
+    with open(user_path, "r", encoding="utf8") as fp:
+        try:
+            dname, pwd = fp.read().split(",")
+            return dname, pwd
+        except:
+            print("钉钉记录文件损坏,错误代码3程序退出")
+            sys.exit(3)
+

+ 26 - 0
pdlearn/pdlearn/get_links.py

@@ -0,0 +1,26 @@
+import requests
+import re
+
+def get_article_links():
+    article = requests.get(
+        "https://www.xuexi.cn/c06bf4acc7eef6ef0a560328938b5771/data9a3668c13f6e303932b5e0e100fc248b.js").content.decode(
+        "utf8")
+    pattern = r"list\"\:(.+),\"count\"\:"
+    links = []
+    list = eval(re.search(pattern, article).group(1))[:20000]
+    list.reverse()
+    for i in range(len(list)):
+        links.append(list[i]["static_page_url"])
+    return links
+
+
+def get_video_links():
+    video = requests.get(
+        "https://www.xuexi.cn/4426aa87b0b64ac671c96379a3a8bd26/datadb086044562a57b441c24f2af1c8e101.js").content.decode(
+        "utf8")
+    pattern = r'https://www.xuexi.cn/[^,"]*html'
+    link = re.findall(pattern, video, re.I)
+    link.reverse()
+    return link
+
+

+ 115 - 0
pdlearn/pdlearn/mydriver.py

@@ -0,0 +1,115 @@
+from selenium import webdriver
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.common import exceptions
+from selenium.webdriver.chrome.options import Options
+from pdlearn import user_agent
+import os
+
+
+class Mydriver:
+
+    def __init__(self, noimg=True, nohead=True):
+        self.options = Options()
+        if os.path.exists("./chrome/chrome.exe"):  # win
+            self.options.binary_location = "./chrome/chrome.exe"
+        elif os.path.exists("/opt/google/chrome/chrome"):  # linux
+            self.options.binary_location = "/opt/google/chrome/chrome"
+        if noimg:
+            self.options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
+        if nohead:
+            self.options.add_argument('--headless')
+            self.options.add_argument('--disable-extensions')
+            self.options.add_argument('--disable-gpu')
+            self.options.add_argument('--no-sandbox')
+        self.options.add_argument('--mute-audio')  # 关闭声音
+        self.options.add_argument('--window-size=400,500')
+        self.options.add_argument('--window-position=800,0')
+        self.options.add_argument('--log-level=3')
+
+        self.options.add_argument('--user-agent={}'.format(user_agent.getheaders()))
+
+        self.webdriver = webdriver
+        if os.path.exists("./chrome/chromedriver.exe"):  # win
+            self.driver = self.webdriver.Chrome(executable_path="./chrome/chromedriver.exe",
+                                                chrome_options=self.options)
+        elif os.path.exists("./chromedriver"):  # linux
+            self.driver = self.webdriver.Chrome(executable_path="./chromedriver",
+                                                chrome_options=self.options)
+        elif os.path.exists("/usr/lib64/chromium-browser/chromedriver"):  # linux 包安装chromedriver
+            self.driver = self.webdriver.Chrome(executable_path="/usr/lib64/chromium-browser/chromedriver",
+                                                chrome_options=self.options)
+        else:
+            self.driver = self.webdriver.Chrome(chrome_options=self.options)
+
+    def login(self):
+        print("正在打开二维码登陆界面,请稍后")
+        self.driver.get("https://pc.xuexi.cn/points/login.html")
+        try:
+            remover = WebDriverWait(self.driver, 30, 0.2).until(
+                lambda driver: driver.find_element_by_class_name("redflagbox"))
+        except exceptions.TimeoutException:
+            print("网络缓慢,请重试")
+        else:
+            self.driver.execute_script('arguments[0].remove()', remover)
+        try:
+            remover = WebDriverWait(self.driver, 30, 0.2).until(
+                lambda driver: driver.find_element_by_class_name("header"))
+        except exceptions.TimeoutException:
+            print("当前网络缓慢...")
+        else:
+            self.driver.execute_script('arguments[0].remove()', remover)
+        try:
+            remover = WebDriverWait(self.driver, 30, 0.2).until(
+                lambda driver: driver.find_element_by_class_name("footer"))
+        except exceptions.TimeoutException:
+            print("当前网络缓慢...")
+        else:
+            self.driver.execute_script('arguments[0].remove()', remover)
+            self.driver.execute_script('window.scrollTo(document.body.scrollWidth/2 - 200 , 0)')
+        try:
+            WebDriverWait(self.driver, 270).until(EC.title_is(u"我的学习"))
+            cookies = self.get_cookies()
+            return cookies
+        except:
+            print("扫描二维码超时")
+
+    def dd_login(self, d_name, pwd):
+        __login_status = False
+        self.driver.get(
+            "https://login.dingtalk.com/login/index.htm?"
+            "goto=https%3A%2F%2Foapi.dingtalk.com%2Fconnect%2Foauth2%2Fsns_authorize"
+            "%3Fappid%3Ddingoankubyrfkttorhpou%26response_type%3Dcode%26scope%3Dsnsapi"
+            "_login%26redirect_uri%3Dhttps%3A%2F%2Fpc-api.xuexi.cn%2Fopen%2Fapi%2Fsns%2Fcallback"
+        )
+        self.driver.find_elements_by_id("mobilePlaceholder")[0].click()
+        self.driver.find_element_by_id("mobile").send_keys(d_name)
+        self.driver.find_elements_by_id("mobilePlaceholder")[1].click()
+        self.driver.find_element_by_id("pwd").send_keys(pwd)
+        self.driver.find_element_by_id("loginBtn").click()
+        try:
+            print("登陆中...")
+            WebDriverWait(self.driver, 2, 0.1).until(lambda driver: driver.find_element_by_class_name("modal"))
+            print(self.driver.find_element_by_class_name("modal").find_elements_by_tag_name("div")[0].text)
+            self.driver.quit()
+            __login_status = False
+        except:
+            __login_status = True
+        return __login_status
+
+    def get_cookies(self):
+        cookies = self.driver.get_cookies()
+        return cookies
+
+    def set_cookies(self, cookies):
+        for cookie in cookies:
+            self.driver.add_cookie({k: cookie[k] for k in cookie.keys()})
+
+    def get_url(self, url):
+        self.driver.get(url)
+
+    def go_js(self, js):
+        self.driver.execute_script(js)
+
+    def quit(self):
+        self.driver.quit()

+ 15 - 0
pdlearn/pdlearn/score.py

@@ -0,0 +1,15 @@
+import requests
+from requests.cookies import RequestsCookieJar
+import json
+
+
+def get_score(cookies):
+    jar = RequestsCookieJar()
+    for cookie in cookies:
+        jar.set(cookie['name'], cookie['value'])
+    total = requests.get("https://pc-api.xuexi.cn/open/api/score/get", cookies=jar).content.decode("utf8")
+    total = int(json.loads(total, encoding="utf8")["data"]["score"])
+    each = requests.get("https://pc-api.xuexi.cn/open/api/score/today/queryrate", cookies=jar).content.decode("utf8")
+    each = json.loads(each, encoding="utf8")["data"]
+    each = [int(i["currentScore"]) for i in each if i["ruleId"] in [1, 2, 9, 1002, 1003]]
+    return total, each

+ 23 - 0
pdlearn/pdlearn/threads.py

@@ -0,0 +1,23 @@
+from threading import Thread
+from threading import Lock
+
+threadLock = Lock()
+threads = []
+
+
+class MyThread(Thread):
+    def __init__(self, name, func, *args, lock=False):
+        Thread.__init__(self)
+        self.name = name
+        self.func = func
+        self.args = args
+        self.lock = lock
+
+    def run(self):
+        print("开启: " + self.name)
+        if self.lock:
+            threadLock.acquire()
+            self.func(*self.args)
+            threadLock.release()
+        else:
+            self.func(*self.args)

+ 64 - 0
pdlearn/pdlearn/user.py

@@ -0,0 +1,64 @@
+import os
+from time import sleep
+from sys import argv
+
+
+def get_user():
+    if len(argv) > 1:
+        uname = argv[1]
+    else:
+        uname = input("输入用户标记名:")
+    if check_uname(uname):
+        dd = check_dd(uname)
+    else:
+        os.makedirs("./user/{}".format(uname))
+        dd = False
+    return dd, uname
+
+
+def check_uname(uname):
+    __check_status = False
+    if os.path.exists("./user/{}".format(uname)):
+        __check_status = True
+    return __check_status
+
+
+def check_dd(uname):
+    __dd_status = False
+    if os.path.exists("./user/{}/dingding".format(uname)):
+        __dd_status = True
+    return __dd_status
+
+
+def get_a_log(uname):
+    __a_log = 0
+    if os.path.exists("./user/{}/a_log".format(uname)):
+        with open("./user/{}/a_log".format(uname), "r", encoding="utf8") as fp:
+            __a_log = int(fp.read())
+    else:
+        with open("./user/{}/a_log".format(uname), "w", encoding="utf8") as fp:
+            fp.write(str(__a_log))
+    return __a_log
+
+
+def get_v_log(uname):
+    __v_log = 0
+    if os.path.exists("./user/{}/v_log".format(uname)):
+        with open("./user/{}/v_log".format(uname), "r", encoding="utf8") as fp:
+            __v_log = int(fp.read())
+    else:
+        with open("./user/{}/v_log".format(uname), "w", encoding="utf8") as fp:
+            fp.write(str(__v_log))
+    return __v_log
+
+
+def shutdown(stime):
+    if stime:
+        stime = int(stime)
+        os.system('shutdown -s -t {}'.format(stime))
+        for i in range(stime):
+            print("\r{}秒后关机".format(stime-i), end="")
+            sleep(1)
+    else:
+        print("无自动关机任务,已程序释放内存,00分钟后窗口将自动关闭")
+        sleep(600)

+ 101 - 0
pdlearn/pdlearn/user_agent.py

@@ -0,0 +1,101 @@
+# -*-coding:utf-8 -*-
+
+import random
+
+
+# 返回一个随机的请求头 headers
+def getheaders():
+    # 各种PC端
+    user_agent_list_2 = [
+        # Opera
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60",
+        "Opera/8.0 (Windows NT 5.1; U; en)",
+        "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50",
+        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50",
+        # Firefox
+        "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
+        "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
+        # Safari
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
+        # chrome
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
+        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
+        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
+        # 360
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36",
+        "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
+        # 淘宝浏览器
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
+        # 猎豹浏览器
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
+        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
+        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
+        # QQ浏览器
+        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
+        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
+        # sogou浏览器
+        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0",
+        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)",
+        # maxthon浏览器
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36",
+        # UC浏览器
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36",
+    ]
+    # 各种移动端
+    user_agent_list_3 = [
+        # IPhone
+        "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
+        # IPod
+        "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
+        # IPAD
+        "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+        "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
+        # Android
+        "Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+        "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+        # QQ浏览器 Android版本
+        "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+        # Android Opera Mobile
+        "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
+        # Android Pad Moto Xoom
+        "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+        # BlackBerry
+        "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
+        # WebOS HP Touchpad
+        "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
+        # Nokia N97
+        "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
+        # Windows Phone Mango
+        "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
+        # UC浏览器
+        "UCWEB7.0.2.37/28/999",
+        "NOKIA5700/ UCWEB7.0.2.37/28/999",
+        # UCOpenwave
+        "Openwave/ UCWEB7.0.2.37/28/999",
+        # UC Opera
+        "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999"
+    ]
+    # 一部分 PC端的
+    user_agent_list_1 = [
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
+        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
+        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
+        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
+        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
+        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
+        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
+        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
+        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
+        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
+    ]
+    UserAgent = random.choice(user_agent_list_1) # 这里只用list1
+    headers = {'User-Agent': UserAgent}
+    return headers

+ 29 - 0
pdlearn/pdlearn/version.py

@@ -0,0 +1,29 @@
+import requests
+
+
+def up_info():
+    print("\n正在联网获取更新信息...")
+    __Version = "v2.4"
+    __INFO = "熊猫学习唯一下载地址为 https://github.com/Alivon/Panda-Learning"
+    try:
+        updata_log = requests.get(
+        "https://raw.githubusercontent.com/Alivon/Panda-Learning/master/Update%20log").content.decode(
+        "utf8")
+        updata_log = updata_log.split("\n")
+        print(__INFO)
+        print("程序版本为:{},\n最新版本为:{}".format(__Version, updata_log[1].split("=")[1]))
+        print("="*120)
+        if __Version != updata_log[1].split("=")[1]:
+            print("当前不是最新版本,建议更新")
+        print("=" * 120)
+        print("更新提要:")
+        for i in updata_log[2:]:
+            print(i)
+        print("=" * 120)
+        print("更新显示不会打断之前输入操作,请继续...")
+    except:
+        print("版本信息网络错误")
+
+
+if __name__ == '__main__':
+    up_info()