騰訊雲實現網課自動簽到

傲天居士 2021-08-15 22:34:21 阅读数:681

本文一共[544]字,预计阅读时长:1分钟~

1. 學習通自動簽到的需求與分析

疫情期間大家也在認真上網課。網課通常需要簽到,並以此作為課程考核標准。很多時候大家也在認真聽課,但是總會因為特殊原因忘記簽到,造成考核不過關。因此考慮編寫一個脚本實現學習通自動簽到。

使用Python實現學習通自動簽到首先需要登陸網頁,登陸函數代碼如下:

import requests
requests.packages.urllib3.disable_warnings()

s = requests.Session()
s.headers.update({'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'})
activates = []

def login():
    global uid,username,password
    if(username == "" or password == ""):
        username = input("登錄賬號:")
        password = input("登錄密碼:")
    #舊接口,已失效
    #url="http://i.chaoxing.com/vlogin?passWord="+str(password)+"&userName="+str(username)
    url = f'https://passport2-api.chaoxing.com/v11/loginregister?uname='+str(username)+'&code='+str(password)
    res= s.get(url)
    if("驗證通過" in str(res.text)):
        print('Login success!')
        for key, value in res.cookies.items():
            if key=="_uid":
                uid=value
        return s
    else:
        print(username,password)
        print('賬號密碼有誤,請重試。')
        username = ""
        password = ""
        login()

獲取用戶信息的函數代碼如下:

import requests
requests.packages.urllib3.disable_warnings()
from lxml import etree
from urllib.parse import urlparse, parse_qs

s = requests.Session()
s.headers.update({'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'})
activates = []

def getuserdata():
    web = s.get('http://mooc1-1.chaoxing.com/visit/courses')
    h1 = etree.HTML(web.text)
    name = h1.xpath('//h3[@class = "clearfix"]/a/text()')
    print("-----------課程名稱-----------")
    print(name)
    print("------------------------------")
    global count
    try:
        count
    except NameError:
        count_exist = False
    else:
        count_exist = True
    if(count_exist):
        pass
    else:
        if(len(name) == 1):
            count = 0
        else:
            #count = 0
            count = int(input("請用數字選擇要簽到的課程(從0開始):"))
    geturl = h1.xpath('//div[@class = "Mcon1img httpsClass"]/a/@href')
    i = 0
    courseurl = []
    for temp in range(0,len(geturl)):
        if("/mycourse/studentcourse" in geturl[i]):
            courseurl.append(geturl[i])
        i += 1
    url = 'https://mooc1-1.chaoxing.com' + courseurl[count]
    url_query = urlparse(url).query
    userdata = dict([(k, v[0]) for k, v in parse_qs(url_query).items()])
    global courseId, classId
    courseId = userdata["courseId"]
    classId = userdata["clazzid"]

執行簽到的函數代碼如下:

import requests
requests.packages.urllib3.disable_warnings()

sckey = ""      #Server醬推送提醒key

s = requests.Session()
s.headers.update({'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'})
activates = []

def sign(aid, uid):
    global activates
    url = "https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId=" + aid + "&uid=" + uid + "&clientip=&latitude=-1&longitude=-1&appType=15&fid=0"
    res = s.get(url,verify=False)
    if (res.text == "success"):
        print(" 簽到成功!")
        if sckey != "":
            data = {
                "text" : "簽到成功",
                "desp" : "aid" + str(aid)
                }
            sckeyurl = "http://sc.ftqq.com/"+str(sckey)+".send"
            web = s.post(sckeyurl, data=data, verify=False)
        activates.append(aid)
    elif(res.text == "您已簽到過了"):
        print(res.text)
        activates.append(aid)
    else:
        if sckey != "":
            data = {
                "text" : "簽到失敗",
                "desp" : "aid" + str(aid)
                }
            sckeyurl = "http://sc.ftqq.com/"+str(sckey)+".send"
            web = s.post(sckeyurl, data=data, verify=False)
        print("簽到失敗")

2. 學習通自動簽到的Python脚本

有了上述分析與自定義函數,我們不難著手自動簽到脚本的編寫。完整的Python代碼如下:

import requests,time,json
requests.packages.urllib3.disable_warnings()
from lxml import etree
from urllib.parse import urlparse, parse_qs

username = ""   #登錄賬號
password = ""   #登錄密碼
sckey = ""      #Server醬推送提醒key

s = requests.Session()
s.headers.update({'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'})
activates = []

def sign(aid, uid):
    global activates
    url = "https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId=" + aid + "&uid=" + uid + "&clientip=&latitude=-1&longitude=-1&appType=15&fid=0"
    res = s.get(url,verify=False)
    if (res.text == "success"):
        print(" 簽到成功!")
        if sckey != "":
            data = {
                "text" : "簽到成功",
                "desp" : "aid" + str(aid)
                }
            sckeyurl = "http://sc.ftqq.com/"+str(sckey)+".send"
            web = s.post(sckeyurl, data=data, verify=False)
        activates.append(aid)
    elif(res.text == "您已簽到過了"):
        print(res.text)
        activates.append(aid)
    else:
        if sckey != "":
            data = {
                "text" : "簽到失敗",
                "desp" : "aid" + str(aid)
                }
            sckeyurl = "http://sc.ftqq.com/"+str(sckey)+".send"
            web = s.post(sckeyurl, data=data, verify=False)
        print("簽到失敗")



def login():
    global uid,username,password
    if(username == "" or password == ""):
        username = input("登錄賬號:")
        password = input("登錄密碼:")
    #舊接口,已失效
    #url="http://i.chaoxing.com/vlogin?passWord="+str(password)+"&userName="+str(username)
    url = f'https://passport2-api.chaoxing.com/v11/loginregister?uname='+str(username)+'&code='+str(password)
    res= s.get(url)
    if("驗證通過" in str(res.text)):
        print('Login success!')
        for key, value in res.cookies.items():
            if key=="_uid":
                uid=value
        return s
    else:
        print(username,password)
        print('賬號密碼有誤,請重試。')
        username = ""
        password = ""
        login()




def getuserdata():
    web = s.get('http://mooc1-1.chaoxing.com/visit/courses')
    h1 = etree.HTML(web.text)
    name = h1.xpath('//h3[@class = "clearfix"]/a/text()')
    print("-----------課程名稱-----------")
    print(name)
    print("------------------------------")
    global count
    try:
        count
    except NameError:
        count_exist = False
    else:
        count_exist = True
    if(count_exist):
        pass
    else:
        if(len(name) == 1):
            count = 0
        else:
            #count = 0
            count = int(input("請用數字選擇要簽到的課程(從0開始):"))
    geturl = h1.xpath('//div[@class = "Mcon1img httpsClass"]/a/@href')
    i = 0
    courseurl = []
    for temp in range(0,len(geturl)):
        if("/mycourse/studentcourse" in geturl[i]):
            courseurl.append(geturl[i])
        i += 1
    url = 'https://mooc1-1.chaoxing.com' + courseurl[count]
    url_query = urlparse(url).query
    userdata = dict([(k, v[0]) for k, v in parse_qs(url_query).items()])
    global courseId, classId
    courseId = userdata["courseId"]
    classId = userdata["clazzid"]

def main():
    getuserdata()
    while 1:
        url = f'https://mobilelearn.chaoxing.com/ppt/activeAPI/taskactivelist?courseId='+courseId+'&classId='+classId+'&uid='+str(uid)
        web = s.get(url,verify=False)
        activeList = json.loads(web.text)["activeList"]
        for item in activeList:
            if ("nameTwo" not in item):
                continue
            if (item['activeType'] == 2 and item['status'] == 1):
                signurl = item['url']
                var = signurl.split("&")
                for var1 in var:
                    var2 = var1.split("=")
                    if(var2[0] == "activePrimaryId"):
                        aid = var2[1]
                if (aid not in activates):
                    print("查詢到簽到 名稱:%s 活動時間:%s aid:%s" % (
                        item['nameOne'], item['nameFour'], aid))
                    sign(aid, uid)
            else:
                time.sleep(3)
                print("簽到暫未開通")    

if __name__ == "__main__":
    print("登錄成功後等待簽到開始")
    try:
        #captchalogin(username,password)
        login()
        main()
    except Exception as e:
        print('repr(e):', repr(e))

用戶只需要輸入自己的學習通登陸賬號與密碼即可(分別將登陸賬號和登陸密碼填入代碼username = "" #登錄賬號password = "" #登錄密碼)。這裏采用了server醬。server醬是一款程序員和服務器之間的通信軟件,它可以用於提醒是否簽到成功。用戶首先需要在瀏覽器打開網址:https://sct.ftqq.com/upgrade?fr=sc,使用微信掃碼登陸即可獲取SendKey,然後將填入代碼sckey = "" #Server醬推送提醒key,就可以將簽到信息推送到微信消息。

3. 騰訊雲部署函數

然而每次都要啟動Python脚本也很麻煩,往往大家會發現“啟動IDE-執行Python脚本-簽到成功”的工作流程也很繁瑣,有這個時間直接自己手動簽到不香嗎?這時候就可以將代碼部署到騰訊雲。用戶打開騰訊元進入控制臺,新建函數。創建方式選擇自定義創建,函數類型選擇事件函數,函數名稱隨意(當然要符號命名規則),部署方式選擇代碼部署,運行環境選擇Python3.6,提交方法選擇在線編輯,然後將代碼粘貼進去。不要忘記設置觸發器,選擇定時觸發並自定義觸發周期。在Cron錶達式中進行輸入。不理解Cron錶達式的可以點擊下圖的鏈接: 隨後跳出彈窗,即可查閱幫助文檔: 根據幫助文檔,我們很容易明白。比如對於每周五上午8:00的課程,我們只需要輸入錶達式“0 0 8 ** 5 *” 即可。當然,如果這比特老師提前10分鐘上課,並在8:00之前關閉了簽到系統,這種方法就會造成漏簽。解决辦法是設置觸發周期為每5分鐘,這樣每5分鐘的0秒就會執行一次函數,從而規避了絕大多數風險。(還不放心可以設置觸發周期為每一分鐘,不過一般情况每5分鐘就足够了)

至此,騰訊雲+Python實現學習通自動簽到的工作就完成了。由於函數部署在騰訊雲,因此電腦是否打開、是否聯網都不影響自動簽到的執行。

版权声明:本文为[傲天居士]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815223358015E.html