mirror of
https://github.com/TDSCDMAA/AutoMihoyoBBS.git
synced 2026-06-02 18:43:42 +08:00
add geetestServer.py.
Signed-off-by: 大山 <10679024+qizitong20100501@user.noreply.gitee.com>
This commit is contained in:
parent
5e486c6548
commit
2e15a73e47
75
geetestServer.py
Normal file
75
geetestServer.py
Normal file
@ -0,0 +1,75 @@
|
||||
from asyncio import Condition
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
import threading
|
||||
import json
|
||||
|
||||
class GeetestValidateServer:
|
||||
validate = None
|
||||
lock = threading.Condition()
|
||||
#主线程调用,调用后在新线程开启服务器,等待服务器自己结束
|
||||
def solveCaptcha(self,challenge:str,gt:str)->str:
|
||||
#用__handlerFactory__创建一个BaseHTTPRequestHandler类,然后创建一个httpServer来处理请求,端口是16384
|
||||
ts = HTTPServer(('127.0.0.1', 16384), self.__handlerFactory__({"challenge":challenge,"gt":gt},self,self.lock))
|
||||
serverThread = threading.Thread(target=self.__startServer__,args=(ts,))
|
||||
#主线程比server线程跑得快,开一个线程用来等待lock
|
||||
waitThread = threading.Thread(target=self.__waitForLock__)
|
||||
serverThread.start()
|
||||
waitThread.start()
|
||||
waitThread.join()
|
||||
ts.shutdown()
|
||||
return self.validate["geetest_validate"]
|
||||
|
||||
#开一个线程用来等待lock
|
||||
def __waitForLock__(self):
|
||||
self.lock.acquire()
|
||||
self.lock.release()
|
||||
|
||||
#网页服务器线程
|
||||
def __startServer__(self,server:HTTPServer):
|
||||
self.lock.acquire()
|
||||
server.serve_forever()
|
||||
|
||||
|
||||
def __handlerFactory__(self,challenge:dict,validateServer,lock:Condition):
|
||||
class HandlerWithChallenge(BaseHTTPRequestHandler):
|
||||
challengeInfo = challenge
|
||||
server = validateServer
|
||||
def responseBuilder(self,responseStr:str):
|
||||
# 响应头
|
||||
headers = "HTTP/1.1 200 OK\nContent-Length: {data-length}\nContent-Type: text/html; charset=utf-8\n".replace('\n', '\r\n') + '\r\n'
|
||||
# 内容的长度要用utf8编码下的算
|
||||
utf8Data = responseStr.encode("utf-8")
|
||||
headers = headers.format_map({'data-length': len(utf8Data)})
|
||||
self.wfile.write(headers.encode())
|
||||
self.wfile.write(utf8Data)
|
||||
|
||||
def do_GET(self):
|
||||
#发送网页
|
||||
if self.path =="/":
|
||||
f = open(file="index.html",mode="r",encoding="utf-8")
|
||||
self.responseBuilder(f.read())
|
||||
f.close()
|
||||
#处理一下图标
|
||||
elif self.path =="/favicon.ico":
|
||||
self.responseBuilder("")
|
||||
else:
|
||||
self.send_error(404,"Not Found")
|
||||
|
||||
def do_POST(self):
|
||||
# 获得报文的长度
|
||||
responseData = self.rfile.read(int(self.headers['content-length']))
|
||||
#获得challenge的信息
|
||||
if self.path =="/getChallenge":
|
||||
data = json.dumps(self.challengeInfo)
|
||||
self.responseBuilder(data)
|
||||
#前端返回geetest的validate信息,结束服务器运行
|
||||
elif self.path =="/complete":
|
||||
validateObj = json.loads(responseData)
|
||||
self.responseBuilder('{"code":1}')
|
||||
#存到GeetestValidateServer的validate中
|
||||
validateServer.validate = validateObj
|
||||
#唤醒主线程,关闭服务器
|
||||
lock.release()
|
||||
else:
|
||||
self.send_error(404,"Not Found")
|
||||
return HandlerWithChallenge
|
||||
Loading…
Reference in New Issue
Block a user