# 阿瓦隆爬蟲專案(二代目)
## 概述
這篇主要功能為成果展示
下面的程式已經跟一代比整理得較乾淨
目前是沒有其他可以再改進的地方(應該啦)
聽說之後這個網頁會出2.0
可能之後出的時候會再寫一個專案
by 作者:布叮咚瓜茶(高鼎鈞)
## 輸出簡述
下面是擷取的網站畫面
https://avalon.signage-cloud.org/
下面的順序是: 派票+結果 ==> 身分 ==> 玩家
派票的紀錄方式為: 幾號位 ==> 人選 ==> 誰場內黑 ==>誰場外白
如果該結果成功執行,則會顯示結果,OX為成功與失敗的張數
最後顯示身分為:刺客 莫甘娜 默德雷德 奧伯倫/梅林 派西維爾
最後顯示1家~10家的ID
## 範例
### 主介面

### 派票
#### 第一輪

#### 第二輪

#### 第三輪

#### 第四輪

## 程式結果

# 程式碼
```python=
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import re
def everyonedo(allwhodo):
anw=[] #出去人選
aib=[] #內黑
aow=[] #外白
whodo = [whodo.text for whodo in allwhodo if whodo.text != ""]
for e in range(len(whodo)//10):
nw = 0
ib = 0
ow = 0
u10 = 0
for r in range(10):
if whodo[10*e+r] == "正常白":
if r==9:
r=-1
nw = nw*10 + r+1
elif whodo[10*e+r] == "場內黑":
if r==9 and ib!=0:
r=-1
u10 = 1
ib = ib*10 + r+1
nw = nw*10 + r+1
elif whodo[10*e+r] == "場外白":
if r==9 and ow!=0:
u10 = 1
r=-1
ow = ow*10 + r+1
if e == 4:
nw = -2
if ib == 0 and u10==0:
ib=-1
if ow == 0 and u10==0:
ow=-1
anw.append(nw)
aib.append(ib)
aow.append(ow)
anw.append(-3) #檢測換下一輪
return anw,aib,aow
def extract_numbers(input_string):
pattern = r'\d+'
numbers = re.findall(pattern, input_string)
try:
number = int(numbers[0])
except:
number=""
return number
def main():
#開啟對局
browser = webdriver.Chrome()
browser.get("https://avalon.signage-cloud.org/")
time.sleep(1)
name = browser.find_element(By.CLASS_NAME,'form-control')
name.send_keys("牌譜機器人")
time.sleep(1)
login_button = browser.find_element(By.CLASS_NAME, "btn.btn-lg.btn-primary.btn-block.btn-signin")
login_button.click()
time.sleep(1)
room_button = browser.find_element(By.CSS_SELECTOR, "body > div > div > div:nth-child(1) > div.col-md-9 > ul > li > div > div:nth-child(3) > button")
room_button.click()
#抓取使用者
time.sleep(1)
goti = [goti.text for goti in browser.find_elements(By.XPATH, '//p[@align="center"]') if goti.text != ""]
goti[6], goti[8] = goti[8], goti[6]
goti[7], goti[9] = goti[9], goti[7]
#預先抓成功與不成功(順邊抓玩家身分)
jpgnum=browser.find_elements(By.CLASS_NAME,"img-rounded")
tf = []
inplay=[]
for i in range(len(jpgnum)):
if jpgnum[i].get_attribute('src') =="https://avalon.signage-cloud.org/image/good_cup.jpg":
tf.append("O")
elif jpgnum[i].get_attribute('src') =="https://avalon.signage-cloud.org/image/bad_cup.jpg":
tf.append("X")
else:
inplay.append(jpgnum[i].get_attribute('src'))
#抓尾派內容
fifgo=[fifgo.text for fifgo in browser.find_elements(By.CLASS_NAME,"btn.btn-primary") if fifgo.text != ""]
fifuse = []
del fifgo[0]
for i in range(len(fifgo)):
fifgo[i]=extract_numbers(fifgo[i])
if fifgo[i] == 10:
fifgo[i] = 0
try:
fifuse.append(fifgo[0]*100+fifgo[1]*fifgo[2])
fifuse.append(fifgo[3]*1000+fifgo[4]*100+fifgo[5]*fifgo[6])
fifuse.append(fifgo[7]*1000+fifgo[8]*100+fifgo[9]*fifgo[10])
fifuse.append(fifgo[11]*10000+fifgo[12]*1000+fifgo[13]*100+fifgo[14]*fifgo[15])
fifuse.append(fifgo[16]*10000+fifgo[17]*1000+fifgo[18]*100+fifgo[19]*fifgo[20])
except:
pass
#按按鈕(派票紀錄)
whogobotton=browser.find_element(By.CSS_SELECTOR,"body > div.container-fluid > div > div.col-sm-7 > div:nth-child(2) > div:nth-child(1) > button")
whogobotton.click()
#抓取派票
pnw=[]
pib=[]
pow=[]
for i in range(1,6):
try:
time.sleep(1)
gsb = browser.find_element(By.CSS_SELECTOR, f"#game_statistics_modal > div > div > div.modal-body > div > ul > li:nth-child({i}) > a") #偵測局數按鈕
gsb.click()
allodo = browser.find_elements(By.CSS_SELECTOR, "span[style='color: green;'], span[style='color: red;']")
gnw,gib,gow=everyonedo(allodo)
pnw=pnw+gnw
pib=pib+gib
pow=pow+gow
except:
pass
#扣掉多於黑白球
if len(tf)==26:
tf = tf[5:]
gm=5
elif len(tf)==21:
tf = tf[5:]
gm=4
else:
tf=tf[4:]
gm=3
#輸出
#輸出派票
whodothis=0
for i in range(gm):
for j in range(6):
if pnw[0] == -3:
del pnw[0]
break
whodothis = whodothis +1
if pnw[0] == -2:
pnw[0] = fifuse[i]
if pow[0] == -1 and pib[0]==-1:
print(whodothis%10,".",pnw[0], sep='')
elif pow[0] == -1 :
print(whodothis%10,".",pnw[0]," ",pib[0],"-", sep='')
elif pib[0] == -1:
print(whodothis%10,".",pnw[0]," ",pow[0],"+", sep='')
else:
print(whodothis%10,".",pnw[0]," ",pib[0],"- ",pow[0],"+", sep='')
del pow[0]
del pib[0]
del pnw[0]
if i == 0 :
print(tf[0],tf[1],tf[2], sep='')
if i == 1 :
print(tf[3],tf[4],tf[5],tf[6], sep='')
print("")
if i == 2 :
print(tf[7],tf[8],tf[9],tf[10], sep='')
print("")
if i == 3 :
print(tf[11],tf[12],tf[13],tf[14],tf[15], sep='')
print("")
if i == 4 :
print(tf[16],tf[17],tf[18],tf[19],tf[20], sep='')
print("")
#輸出身分
goodp=0
badp=0
inplay[7], inplay[9] = inplay[9], inplay[7]
inplay[6], inplay[8] = inplay[8], inplay[6]
inplay[8], inplay[9] = inplay[9], inplay[8]
for k in range(9):
if inplay[k]=="https://avalon.signage-cloud.org/image/Q_%E6%A2%85%E6%9E%97.jpg":
goodp = goodp+(k+1)%10*10
elif inplay[k]=="https://avalon.signage-cloud.org/image/Q_%E6%B4%BE%E8%A5%BF%E7%B6%AD%E7%88%BE.jpg":
goodp = goodp+(k+1)%10
elif inplay[k]=="https://avalon.signage-cloud.org/image/Q_%E5%88%BA%E5%AE%A2.jpg":
badp = badp+(k+1)%10*1000
elif inplay[k]=="https://avalon.signage-cloud.org/image/Q_%E8%8E%AB%E7%94%98%E5%A8%9C.jpg":
badp = badp+(k+1)%10*100
elif inplay[k]=="https://avalon.signage-cloud.org/image/Q_%E8%8E%AB%E5%BE%B7%E9%9B%B7%E5%BE%B7.jpg":
badp = badp+(k+1)%10*10
elif inplay[k]=="https://avalon.signage-cloud.org/image/Q_%E5%A5%A7%E4%BC%AF%E5%80%AB.jpg":
badp = badp+(k+1)%10
if goodp//10 == 0:
print(badp,"/","0",goodp,sep="")
elif badp//1000 == 0:
print("0",badp,"/",goodp,sep="")
else:
print(badp,"/",goodp,sep="")
#輸出玩家
for i, player in enumerate(goti):
print(i + 1, ".", player,sep="")
#關閉網頁
browser.quit()
if __name__ == "__main__":
main()
```