Python编写自动化脚本(无验证码)
一、模擬登陸
打開登陸界面,F12,打開開發(fā)者工具(大部分瀏覽器都自帶),選擇Network,如果沒有顯示,就把該頁面刷新一下
我這里登陸的網(wǎng)站是 http://x.x.x.x/?q=custom_user_login
輸入賬號(hào),密碼(這里我的密碼填寫的1,用做測(cè)試),原本很短的密碼卻變得很長(zhǎng),這里我們就有一個(gè)猜想,這里的password值在客戶端進(jìn)行了加密,所以我們右鍵審查該password表單元素
由上圖可知這里果然進(jìn)行了加密,于是我們把下圖中type="password"的password刪除,查看密碼明文,看看他究竟是怎么進(jìn)行加密的
由上圖看出1被加密成了32位16進(jìn)制數(shù),并且根據(jù)上圖中的hex_md5,于是猜想他是md5加密,以hex(16進(jìn)制)顯示,在 https://www.cmd5.com/ 進(jìn)行驗(yàn)證
由上圖可知,他果然是在前端進(jìn)行了一次md5加密
隨后我們進(jìn)行一次正確的登陸,獲取賬號(hào)密的變量名,如下圖:
現(xiàn)在開始編寫第一段代碼,登陸賬號(hào):
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author:1stPeakimport requests import hashlib import rerequest = requests.Session() #requests庫的session對(duì)象能夠幫我們跨請(qǐng)求保持某些參數(shù),也會(huì)在同一個(gè)session實(shí)例發(fā)出的所有請(qǐng)求之間保持cookiesdef login(username,password):login_url = "http://x.x.x.x/?q=custom_user_login"md = hashlib.md5()md.update(password.encode('utf-8'))password = md.hexdigest()data = {"username": username,"password": password}try:req = request.post(login_url,data=data,headers=header)req.encoding = 'utf-8'#print(req.text) #這個(gè)用來測(cè)試是否登陸成功(查看登陸前與登錄后的源代碼有何差別)if "請(qǐng)輸入注冊(cè)時(shí)填寫的手機(jī)號(hào)" not in req.text:print("登陸成功")else:print("登錄失敗")except:print("未知錯(cuò)誤")if __name__ == '__main__':username="你的用戶名"password="你的密碼"header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}login(username,password)二、申請(qǐng)課程
-
打開burpsuite,開始抓包,再點(diǎn)擊報(bào)名學(xué)習(xí)
-
抓到下圖的POST請(qǐng)求(申請(qǐng)課程請(qǐng)求)
請(qǐng)求url為/?q=node/75827/people/apply
-
輸入url后打開
-
再打開 http://x.x.x.x/?q=node/75827, 檢驗(yàn)是否申請(qǐng)成功
申請(qǐng)課程代碼段:
為了可以申請(qǐng)更多的課程,我們修改一下代碼:
def apply():for i in range(75926,75927):apply_url = "http://x.x.x.x/?q=node/"+str(i)+"/people/apply"try:req = request.get(apply_url,headers=header)if "success" in req.text:print(str(i)+"課程申請(qǐng)成功")return iexcept:print(str(i) + "申請(qǐng)失敗")三、刷課程
study = "http://x.x.x.x/?q=items/student/study/75926"try:req = request.get(study, headers=header)req.encoding = 'utf-8'G = r'<a score=".*?" uid=".*?" title=".*?" class="itemtitle" nid=".*?" module_id=".*?" item_id=".*?" href="/(.*?)">.*?</a>'study = re.findall(G,req.text)for study_url_last in study:study_url_all = "http://39.106.4.51/" + study_url_lasttry:request.get(study_url_all,headers=header,timeout=4)print(study_url_all+"刷課成功")except:print(study_url_all+"刷課失敗")except:pass為了可以刷更多的課程,我們來完善一下代碼:
def study():study_url = "http://x.x.x.x/?q=items/student/study/"+str(apply())try:req = request.get(study_url,headers=header)req.encoding='utf-8'G = r'<a score=".*?" uid=".*?" title=".*?" class="itemtitle" nid=".*?" module_id=".*?" item_id=".*?" href="/(.*?)">.*?</a>'study_url_list = re.findall(G,req.text,re.M|re.S)for study_url_last in study_url_list:study_url_all = "http://39.106.4.51/" + study_url_lasttry:req = request.get(study_url_all,headers=header,timeout=4)print(study_url_all+"學(xué)習(xí)完成")except:print(study_url_all+"學(xué)習(xí)失敗")except:pass四、完整代碼:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author:1stPeakimport requests import hashlib import rerequest = requests.Session() #requests庫的session對(duì)象能夠幫我們跨請(qǐng)求保持某些參數(shù),也會(huì)在同一個(gè)session實(shí)例發(fā)出的所有請(qǐng)求之間保持cookiesdef login(username,password):login_url = "http://x.x.x.x/?q=custom_user_login"md = hashlib.md5()md.update(password.encode('utf-8'))password = md.hexdigest()data = {"username": username,"password": password}try:req = request.post(login_url,data=data,headers=header)req.encoding = 'utf-8'#print(req.text) #這個(gè)用來測(cè)試是否登陸成功(查看登陸前與登錄后的源代碼有何差別)if "請(qǐng)輸入注冊(cè)時(shí)填寫的手機(jī)號(hào)" not in req.text:print("登陸成功")else:print("登錄失敗")except:print("未知錯(cuò)誤")def apply():for i in range(75926,75927):apply_url = "http://x.x.x.x/?q=node/"+str(i)+"/people/apply"try:req = request.get(apply_url,headers=header)if "success" in req.text:print(str(i)+"課程申請(qǐng)成功")return iexcept:print(str(i) + "申請(qǐng)失敗")def study():study_url = "http://x.x.x.x/?q=items/student/study/"+str(apply())try:req = request.get(study_url,headers=header)req.encoding = 'utf-8'G = r'<a score=".*?" uid=".*?" title=".*?" class="itemtitle" nid=".*?" module_id=".*?" item_id=".*?" href="/(.*?)">.*?</a>'study_url_list = re.findall(G,req.text,re.M|re.S)for study_url_last in study_url_list:study_url_all = "http://39.106.4.51/" + study_url_lasttry:request.get(study_url_all, headers=header, timeout=6)print(study_url_all + "學(xué)習(xí)完成")except:print(study_url_all + "學(xué)習(xí)失敗")except:passif __name__ == '__main__':username="你的用戶名"password="你的密碼"header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}login(username,password)study() #運(yùn)行study函數(shù)的時(shí)候會(huì)自動(dòng)運(yùn)行apply函數(shù),所以不需要再寫apply()注:視頻文件無法刷成功,電腦自己看一遍還是不能完成任務(wù)點(diǎn),不知其原因,如有知道或解決辦法,請(qǐng)?jiān)u論留言,Thank you~
更新:此次文章僅供學(xué)習(xí)參考,不再更新。
其他圖片:
總結(jié)
以上是生活随笔為你收集整理的Python编写自动化脚本(无验证码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉男人的特点
- 下一篇: Python3爬虫之中文乱码问题分析与解