用python實現自動玩Npubits的21點遊戲

來源:互聯網
上載者:User

標籤: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指令碼思路
  1. 等待開局。
  2. 開始21點。
  3. 判斷點數。
  4. 若點數大於20,回到第1步。
  5. 若點數大於17,則去到第8步。(17可變,只是我認為17點夠大了)
  6. 若點數小於等於17,則去到第7步。
  7. 繼續摸牌,回到第3步。
  8. 停止摸牌,回到第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點遊戲

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.