標籤:mit div 異常 erro usr 發郵件 可變 sub reg
用python實現自動玩Npubits的21點遊戲21點的首頁面
https://---
(此處不提供連結,使用者直接在網站首頁點擊21點後,地址欄的連結便是。)
需要知道的關鍵點
(寫代碼時用來抓取資料的關鍵點)
1. 等待開局
若之前的21點還沒有結束(暫時沒有對手上線),那麼不能開局,需等待之前的結束。若需等待,首頁麵包含以下內容
<button type="submit" class="btn btn-default">重新整理</button>
2. 可以開始
若可以開始遊戲,首頁麵包含以下內容
<button type="submit" class="btn btn-primary">開始遊戲!</button>
3. 開始21點
向首頁面post資料
game: hit,start: yes
4. 判斷點數
判斷每次操作後,首頁面返回的網頁內容。點數的html樣式如下:
<b>點數 = 16</b>
5. 繼續摸牌
向首頁面post資料
game: hit
6. 停止摸牌
向首頁面post資料
game: stop
Python指令碼思路
- 等待開局。
- 開始21點。
- 判斷點數。
- 若點數大於20,回到第1步。
- 若點數大於17,則去到第8步。(17可變,只是我認為17點夠大了)
- 若點數小於等於17,則去到第7步。
- 繼續摸牌,回到第3步。
- 停止摸牌,回到第1步。
toulanboy - http://www.cnblogs.com/toulanboy/
代碼實現1. 關鍵邏輯:開始-摸牌-停止
#(**此處不提供連結,使用者直接在網站首頁點擊21點後,地址欄的連結便是。**)url = ‘https://----‘ #不停地玩21點while True: #先看之前的是否結束了 result = getData(url) time.sleep(5) # toulanboy - http://www.cnblogs.com/toulanboy/ if result == 0: #如果還沒結束,則繼續重新整理 print "之前的尚沒結束,等待中" elif result == 1:#如果結束了,則開始遊戲 point = postData(url, startValues)#發出“開始遊戲”請求 print "已開局,當前點數 = %d" % point #大於20點,系統會自動結束,故在這裡我只需在小於21點的情況下摸牌 while point <= 20: if point >= 17:#我認為只要大於17點我滿足了,所以大於17點就停止摸牌 time.sleep(1) postData(url, stopValues)#發出“停止摸牌”請求 print "停止摸牌了,當前點數 = %d" % point break else:#小於17點則繼續摸牌 time.sleep(1) point = postData(url, hitValues)#發出“繼續摸牌”請求 print "又摸牌了,當前點數 = %d" % point print "這局結束了,當前點數 = %d" % point else:#出現異常,則停止遊戲。等待渣渣看日誌看看哪裡出問題了。 sendEmail("[email protected]", "Some errors occurred in python script for npubits", "Some errors occurred in python script for npubits") break
2. 用get請求判斷是否可以開始遊戲
#function - Get網頁#若網頁顯示之前的沒結束,則返回0#若網頁顯示可以開始新的一局,則返回1#其它情況返回-1def getData(url): headers = { ‘User-Agent‘ : ‘-‘,#建議設定 ‘cookie‘:‘-‘#我沒做登陸,所以手動弄cookie } try: response = requests.get(url, headers=headers) indexHtmlCode = response.text indexHtmlCode = indexHtmlCode.encode(‘utf-8‘) #判斷是否有重新整理按鈕,若有,說明上局沒結束 freshRegex = r‘重新整理</button>‘ result = re.findall(freshRegex, indexHtmlCode) if result: return 0# toulanboy - http://www.cnblogs.com/toulanboy/ #判斷是否有開始遊戲按鈕,若有,說明可以開始遊戲 beginRegex = r‘開始遊戲!</button>‘ result = re.findall(beginRegex, indexHtmlCode) if result: return 1 return -1 except Exception as e: return -1
3. 用Post請求實現開始/摸牌/停止的動作
toulanboy - http://www.cnblogs.com/toulanboy/
### 不同動作需要的資料不一樣# 開始遊戲startValues = { "game":"hit", "start":"yes"}# 繼續摸牌hitValues = { "game":"hit"}# 停止摸牌stopValues = { "game":"stop"}#function - Post網頁#若是開始和摸牌,則返回點數#頁面沒有點數(停止摸牌操作會出現),則返回0#異常,返回-1def postData(url, values): dd = urllib.urlencode(values) headers = { "Content-Length":str(len(dd)), "Content-Type":"application/x-www-form-urlencoded", ‘Cache-Control‘:‘max-age=0‘,#上述三個參數其實應該不用手動添加,有可能request庫會幫我們添加。有待驗證。 ‘User-Agent‘ : ‘-‘,#自己補充 ‘cookie‘:‘-‘#自己補充 } try: response = requests.post(url, data=dd,headers=headers) indexHtmlCode = response.text indexHtmlCode = indexHtmlCode.encode(‘utf-8‘)# toulanboy - http://www.cnblogs.com/toulanboy/ # 查看返回的網頁的點數 pointRegex = r‘點數\s?=\s?(\d*)<‘ result = re.findall(pointRegex, indexHtmlCode) if result: return int(result[0]) else: return 0 except Exception as e: return -1
完整代碼
為了便於維護,完整代碼中增加了日誌記錄和寄件提醒
#!/usr/bin/python# coding=utf-8# 時間:2018-08-22# toulanboy# 緣由:想實現自動玩npubits的21點遊戲import requestsimport reimport urllibimport time import loggingimport smtplibfrom email.mime.text import MIMEText#配置日誌logging.basicConfig(filename=‘my.log‘,format=‘[%(asctime)s-%(filename)s-%(levelname)s:%(message)s]‘, level = logging.INFO,filemode=‘a‘,datefmt=‘%Y-%m-%d %I:%M:%S %p‘)### 不同動作需要的資料不一樣# 開始遊戲startValues = { "game":"hit", "start":"yes"}# 繼續摸牌hitValues = { "game":"hit"}# 停止摸牌stopValues = { "game":"stop"}# toulanboy - http://www.cnblogs.com/toulanboy/#function - Post網頁#若是開始和摸牌,則返回點數#頁面沒有點數(停止摸牌操作會出現),則返回0#異常,返回-1def postData(url, values): dd = urllib.urlencode(values) headers = { "Content-Length":str(len(dd)), "Content-Type":"application/x-www-form-urlencoded", ‘Cache-Control‘:‘max-age=0‘,#上述三個參數其實應該不用手動添加,有可能request庫會幫我們添加。有待驗證。 ‘User-Agent‘ : ‘-‘,#自己補充 ‘cookie‘:‘-‘#自己補充 } try: response = requests.post(url, data=dd,headers=headers) indexHtmlCode = response.text indexHtmlCode = indexHtmlCode.encode(‘utf-8‘) # 提取網頁主幹,存入日誌(方便後期的分析) body = re.findall(r‘<div\s?id=\‘main\‘\s?class=\‘well\s?no-border-radius\‘>.*?</div>‘,indexHtmlCode, re.S) if body: logging.info(body[0]) else: logging.info(indexHtmlCode) # 查看返回的網頁的點數 pointRegex = r‘點數\s?=\s?(\d*)<‘ result = re.findall(pointRegex, indexHtmlCode) if result: return int(result[0]) else: return 0 except Exception as e: logging.error(e) return -1#function - Get網頁#若網頁顯示之前的沒結束,則返回0#若網頁顯示可以開始新的一局,則返回1#其它情況返回-1def getData(url): headers = { ‘User-Agent‘ : ‘-‘,#建議設定 ‘cookie‘:‘-‘#我沒做登陸,所以手動弄cookie } try: response = requests.get(url, headers=headers) indexHtmlCode = response.text indexHtmlCode = indexHtmlCode.encode(‘utf-8‘) #判斷是否有重新整理按鈕,若有,說明上局沒結束 freshRegex = r‘重新整理</button>‘ result = re.findall(freshRegex, indexHtmlCode) if result: return 0 #判斷是否有開始遊戲按鈕,若有,說明可以開始遊戲 beginRegex = r‘開始遊戲!</button>‘ result = re.findall(beginRegex, indexHtmlCode) if result: return 1 # 若以上情況都不是,有可能是cookie到期了 loginRegex = r‘您尚未登入</body>‘ result = re.findall(loginRegex, indexHtmlCode) if result: return 2 # 如果不是cookie到期,則需列印當前錯誤資訊(記錄返回的網頁原始碼),方便後面找錯 logging.error(indexHtmlCode) except Exception as e: logging.error(e) return -1#發郵件 (收件者 ,郵件主題 ,郵件內文)def sendEmail(_to, subject, mainText): _user = "-" #登入的163郵箱 _pwd = "-" #163郵箱授權碼 msg = MIMEText(mainText) #郵件內文 msg["Subject"] = subject #郵件主題 msg["From"] = _user #寄件者 msg["To"] = _to #收件者 try: s = smtplib.SMTP_SSL("smtp.163.com", 465) s.login(_user, _pwd)#登入 s.sendmail(_user, _to, msg.as_string())#發送 s.quit()#退出登入 logging.info("郵件發送成功!") print "郵件發送成功!" except smtplib.SMTPException,e: logging.info("郵件發送失敗,%s"%e[0]) print "郵件發送失敗,%s"%e[0]#(**此處不提供連結,使用者直接在網站首頁點擊21點後,地址欄的連結便是。**)url = ‘https://----‘ #不停地玩21點while True: #先看之前的是否結束了 result = getData(url) time.sleep(5) if result == 0: #如果還沒結束,則繼續重新整理 print "之前的尚沒結束,等待中" elif result == 1:#如果結束了,則開始遊戲 point = postData(url, startValues)#發出“開始遊戲”請求 logging.info("已開局,當前點數 = %d" % point) print "已開局,當前點數 = %d" % point #大於20點,系統會自動結束,故在這裡我只需在小於21點的情況下摸牌 while point <= 20: if point >= 17:#我認為只要大於17點我滿足了,所以大於17點就停止摸牌 time.sleep(1) postData(url, stopValues)#發出“停止摸牌”請求 logging.info("停止摸牌了,當前點數 = %d" % point) print "停止摸牌了,當前點數 = %d" % point break else:#小於17點則繼續摸牌 time.sleep(1) point = postData(url, hitValues)#發出“繼續摸牌”請求 logging.info("又摸牌了,當前點數 = %d" % point) print "又摸牌了,當前點數 = %d" % point logging.info("這局結束了,當前點數 = %d" % point) print "這局結束了,當前點數 = %d" % point else:#出現異常,則停止遊戲。等待渣渣看日誌看看哪裡出問題了。 sendEmail("[email protected]", "Some errors occurred in python script for npubits", "Some errors occurred in python script for npubits") break
toulanboy - http://www.cnblogs.com/toulanboy/
完畢。python剛剛學到點皮毛,代碼習慣可能不好,希望大佬多多包涵。如若有大佬願意指點,非常感謝。
用python實現自動玩Npubits的21點遊戲