スタジアムのスクリプト時限任命、東南大学、セレン及びchromedriverリアライズの使用、たTesseract識別コードを書いた再

最後の書き込み半製品は、フォームを投稿する直接urllibはライブラリですが、今は利用できません、主にポスト要求、追加のいくつかの未知の値、および暗号化されたパスワードの分野でase128で使用されている、私は怠け者実現しています。
ちょうどそのようなクリックなど、人間の入力操作をシミュレートし、セレンは、自動テストのための良いモジュールで、ブラウザが直接動員することができ、セレンを試してみて、非常に使いやすいが、それは比較的低い効率で、多くの操作理由彼らは見つけることができる前にロードすると、他のページ要素。

8000://116.62.5.101:これも予約を受け付けるためのウェブサイトを設定し、データベースに書き込まれ、午前8時01分毎朝の予定スクリプトの実行、関心や学生のニーズここで見ることができ、HTTP、スクリプトを書いただけでなく、 、
後でChromeブラウザとchromdriverフラスコウェブサイト、データベース、セレン、tesseract4.0、無インターフェースに基づいてサーバーを展開する方法についての記事を書きます。



セレンコアの使用たとえば、オブジェクトとしてページに対応する要素を見つけるために、セレクタを使用することです:
ブロは、ブラウザオブジェクトのwebdriverをセレンである、あなたは、名前、ID、クラス別の要素を見つけるためにfind_element_byの方法を使用することができ
、これらの場合には要素のどれもが、あなたが興味を持っているXPathの小さなパートナーが詳細を学ぶために行くことができる、XPathを使用することはできませんが、最も簡単な方法は、XPath、それをコピーすることができますF12の開発者モード、右応答要素の後に開くことです。

 

 

たTesseract是一个识别引擎、用于识别验证码





輸入pymongo
輸入スケジュール
インポート時の
インポートpytesseract
PILのインポートイメージから
インポートプールをマルチプロセッシングから
BSONインポートのObjectIdから
セレン輸入webdriverをから
インポート日時
輸入ランダム
輸入OSの


デフaddmates(matesid、framenum、BRO) :

button_addmates = bro.find_element_by_id( "ハンドル加算")
button_addmates.click()
bro.switch_to.frame( "xubox_iframe" + STR(framenum))
input_matesid = bro.find_element_by_id( "CARDNO")
input_matesid.send_keys(matesid)
button_findmate = bro.find_element_by_class_name( "検索ID")を
button_findmate.click()
input_existmates = bro.find_elements_by_class_name( "ユーザ")
oldcontacts = []
input_existmatesでinput_existmate用:
#プリント(input_existmate.get_attribute( "のTextContent"))
(。input_existmate.get_attribute("のTextContent")ストリップ())oldcontacts.append

時間。睡眠(1)
プリント(bro.page_source)
input_newcontact = bro.find_element_by_id( "接触")
印刷(input_newcontact.get_attribute( "のTextContent"))
newcontact = input_newcontact.get_attribute( "のTextContent")

newcontactない場合はoldcontactsで:
button_addtocontacts = bro.find_element_by_class_name( "ユーザーの追加")
button_addtocontacts。()をクリックし
time.sleep(1)
他の:
input_existmatesでinput_existmateため:
。input_existmate.get_attribute( "のTextContent")ストリップ()== newcontact場合:
チェックボックス= input_existmate.find_element_by_name( "ユーザ")
checkbox.click()
time.sleep(1)
button_submitaddmates = bro.find_element_by_class_name(」デル-すべてのユーザー」)
button_submitaddmates.click()
ブレーク


#ssl._create_default_https_context = ssl._create_unverified_context
デフメイン(reserverdic、受注コード):

隐藏浏览器界面
オプション= webdriver.ChromeOptions()
option.add_argument( 'ヘッドレス')
オプション.add_argument( ' -なし-サンドボックス')
BRO = webdriver.Chrome(オプション=オプション)
#BRO = webdriver.Chrome()
印刷( "クローム已启动")
URL =「https://newids.seu.edu.cn/authserver/login?goto=http:/ /my.seu.edu.cn/index.portal」


bro.get(URL)
プリント(bro.page_source)
のbro.save_screenshot( "ddd.png")
#print( "保存")
登录预约系统
ID = reserverdic [ "idpwd"] [ "SSID"]
PWD = reserverdic [ "idpwd"] [ "PWD"]
time.sleep(3)
input_username = bro.find_element_by_id( "ユーザ名")
input_password = bro.find_element_by_id( "パスワード")
input_username.send_keys(ID)
input_password。send_keys(PWD)
#プリント(input_username)
プリント(input_password)

クラスの#の複数の直接次の形式find_element_by_class使用することができない
botton_login = bro.find_element_by_css_selector( "[クラス= 'auth_login_btnプライマリFull_width']")
botton_login.click()

#URL3 =「http://yuyue.seu.edu.cnを/eduplus/order/initOrderIndex.do?sclId=1 "
#1 bro.get(URL3)
オープンスケジューラ
情報reserverdic = ["情報"]
インフォメーション= {
# 'dayInfo':" 2018年11月23日」、
'のitemId' :. 7、
'時間': "12はある:00-13:00"
#}
#= INFOURL urllib.parse.urlencode(情報)
"" "
'のitemId' :. 7、Jiulonghuピンポン、1-3人
8、Jiulonghuバスケットボール、9-14観客、ハーフ5-8: 'ITEMID'
'のitemId':9、Jiulonghuバレーボール、4-15人が
'ITEMID':10、Jiulonghuバドミントン、1-5人
「ITEMID」:11、ドラゴン湖のダンスは、非必須の
「ITEMID」:12、ドラゴン湖のフィットネスは、非必須の
「ITEMID」:13、龍湖武道は、非必須の
「ITEMID」:14、龍湖テコンドーを、非必要な
'ITEMID':15、4つのアーチバドミントン、1-3人
'のitemId':16、4つのアーチピンポン、1-3人
'のitemId':17、4つのアーチテニス、1-3人
"" "

URL2 =" http://yuyue.seu.edu.cn/eduplus/order/initEditOrder.do?sclId=1&dayInfo="+info['dayInfo']+"&itemId="+info['itemId']​​+"&time="+インフォ[ "時間"]
印刷(URL2)
のbro.execute_script( "window.open()")
#1 bro.switch_to.window(bro.window_handles [1])
bro.get(URL2)

全体で#バスケットボールハーフコートの契約フィールド
「バスケットボール= reserverdic [phonemate "] [" halffull "]
バスケットボール== 2の場合:
buttonhalffull = bro.find_elements_by_name( "orderVO.useMode")
buttonhalffull [1] .click()
添加电话
PHONENUMBER = reserverdic [ "phonemate"] [ "電話"]
input_phone = bro.find_element_by_id( "電話")
input_phone.clear( )
input_phone.send_keys(PHONENUMBER)

添加好友
framenum = 0
reserverdicでeachmateため[ "phonemate"] [ "mateid"]:
framenum + = 1
addmates(eachmate、framenum、BRO)
time.sleep(1)



处理验证码
スクリーンショット= STR(random.randint(1,100000))+ 'screenshot.png'
validcodeshot = STR(random.randint(1,100000))+ 'validateimage.png'
BRO。get_screenshot_as_file(スクリーンショット)
IMG = bro.find_element_by_xpath( '// * [ID @ = "FM"] /テーブル/ TBODY / TR [6] / TD [2] / IMG')
左= INT(img.location [ 'X'])
トップ= INT(img.location [ 'Y'])
右= INT(img.location [X ''] + img.size [ '幅'])
ボトム= INT(img.location [ 'Y'] + img.size [ '高'])

处理图像#1通过イメージ
IM = Image.open(スクリーンショット)
IM = im.crop((左、上、右、下))
im.save(validcodeshot)

IMG = Image.open(validcodeshot)
validcode = pytesseract.image_to_string(IMG)
プリント(validcode)

input_validcode = bro.find_element_by_id( "validateCode")
input_validcode.send_keys(validcode)
button_reserve = BRO。find_element_by_id(「提出します」)
button_reserve.click()

os.remove(スクリーンショット)
os.remove(validcodeshot)
time.sleep(1)



してみてください:
alertcontent = bro.find_element_by_css_selector( "[クラス= 'xubox_msg xubox_text']")
であればalertcontent.get_attribute( "のTextContent" ):
UpdateStatusを(受注、alertcontent.get_attribute( "のTextContent")+ "预约失败")
プリント(alertcontent.get_attribute("のTextContent")、 "预约失败")
bro.quit()
戻り0
例外を除い:
bro.quit ()
UpdateStatusを(受注、 "预约成功")
印刷( "预约成功")
リターン1


DEF)(MMAIN。
試験#
#reserverdic1 = {
# "Idpwd":{
# 'SSID':220 187 988、
'PWD': "MIMA"
#}
# "情報":{
# 'dayInfo': "2019年9月2日"、
は'アイテムID'、」7。 」、
'時間':'12:00-13:00」
#}、
"phonemate ":{
#"電話":1885187965558、
#" mateid ":[220 184 346]、すべての友達リスト#IDの
#" halffull" :1#1が2半分、非デフォルトのビット1バスケットボール、または空示し、全体を表す
#}
#}
#reserverdic2 = {
{# "idpwd"
、220 175 358:# 'SSID'を
# 'PWD': "美馬"
#}
# "情報":{
# 'DayInfo': "2019年9月8日"、
は'アイテムID':、」7" 。
# '時間':'17:00-18:00」
#}
# "phonemate":{
# "電話番号": 18851879658、
"mateid":[220 184 348]、すべての友人リスト#1のID
# "halffull":第1位2の半分を示し、聴衆を表し、デフォルト以外のビット1バスケットボール、または空
#}
#}
#=グループ[ reserverdic1、reserverdic2]


オーダーリスト= getorderlist()
IFないオーダーリスト:
印刷(STR(datetime.date.today())、 "いいえ注文")

プール=プール()
pool.map(doorder、オーダーリスト)

#1 pool.map(メイン、グループ)


DEFのdoorder(注文):
試してみてください。
印刷(「プロセス・オーダー」、順序)
メイン(オーダー[0]、順[1])
の例外を除い:
newstutas = "预约失败、检查提交信息是否出错"
UpdateStatusを([1]、newstutas順)
プリント(newstutas)


DEF(getorderlist):


今日= datetime.date .today()
MyClientという= pymongo.MongoClient( "のMongoDB:// localhostの:27017 /")
MYDB = MyClientという[ "オーダー"]
mycol = MYDB [ "オーダー"]
findresult = mycol.find({ '日':STR(今日)}、{ "reservedic":1、 "_ ID":1})
オーダーリスト= []
findresultにおけるxについて:
orderlist.append([X [ "reservedic"]はx [ "_ IDが"]])

ーダーリストを返す


DEF UpdateStatusを(受注、newinfo):
MyClientという= pymongo。MongoClient( "MongoDBは:// localhostを:27017 /")
MYDB = MyClientという[ "オーダー"]
mycol = MYDB [ "オーダー"]
mycol.update_one({ "_id"のObjectId(受注)}、{ "$セット":{ "ステータス":newinfo}})


あれば__name__ == '__main__':
#1 MMAIN()

MMAIN()


のschedule.every()day.at('08:00' )。。ん(MMAIN)
真しばらく#:
#1 schedule.run_pending()

おすすめ

転載: www.cnblogs.com/CooperXia-847550730/p/11479752.html