小屋創作

日誌2021-07-17 00:59

selenium練習 - 動態牆自動發文

作者:熾炎之翼

度的
今天晚上本來想研究twython
但是發現twitter API要申請Create APP的地方
要用英文填好幾欄200字以上的用途和申請理由之類的東西
我看教學都說不會審核所以就亂打了
送出才發現現在改成要審核了 = =

對 我只能等到他退回再重新申請了
所以我就跑去研究selenium了

我不是第一次接觸selenium
當時的自動搶樓機器人就有差不多一半是用到selenium的函式寫的
但是說真的 當時根本就是縫合怪 = =
大概知道用途就亂貼 but it works


不過後來維護上果然就出現很大問題了
所以這次就決定認真來摸看看

然後剛開始就看到了一個超屌工具 Selenium IDE
https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd

這個功能可以讓你輸入一個網址
然後他會打開那個網站
之後你在網站內的所有操作都會被記錄下來並轉成適用於selenium的指令
換言之 只要把你要爬蟲做的事情先手動示範一次
之後這個擴充套件就會生成一個模板
你根本不需要自己去探勘網頁元素

...
突然覺得我之前的搶樓機器人搞這麼久好浪費時間喔
當時用這個大概不到半小時就能馬上生出一個吧 = =

果然學程式不應該偷吃步
腳踏實地才是捷徑@@

然後我就想做個練習
就把目標放到動態牆自動發文

果然用上Selenium IDE就瞬間解決了八成的問題
剩下就是適時用time.sleep()來解決網頁跟不上程式速度的問題
這樣應該就沒問題了吧










這邊出現了一個新的大問題

啊我的字怎麼不見了@@
整個貼文也因此送不出去
一開始以為是我示範時操作有誤
但是多試幾次也是同樣的結果
看來不是我的問題了...

Selenium IDE你算計我!


後來細看程式碼以後
再進行了小實驗 果然與我的猜想沒錯

看到<div>標籤竟然還存在我就知道發生什麼事了

程式直接用JavaScript指令碼把文字以html碼形式貼給網頁
這就造成我的內容變成類似於「請在此輸入文字」的提示文字之類的存在
所以網頁判定我沒有打字 當然就不給我送出

會造成這種狀況是因為IDE以「結果論」來把我的行為轉換成程式碼
對IDE來說 他不是看到我打字 他只有看到我對網頁造成的影響

知道問題就要來解決問題了
我很快就發現對那個框框按Enter鍵就能讓文字現形
但也會讓貼文第一行出現無意義的空行
所以我又想到可以對框框按BACKSPACE鍵
但以這種形式沒指定方位只會刪除最後一個字元

正當我打算找座標時
我又突然產生了新的疑問
直接對框框按BACKSPACE鍵可以讓文字現形嗎

看來只要對文字框框做出更改指令就能讓文字現形
所以我的問題簡化到只要把輸出內容末尾再預留一個任意字元或空格就能解決了

問題解決以後 就完成了我的第一次自動發文實驗

不知道是不是動態牆上第一個由程式發的貼文呢XD


然後我就再試著做的稍微完整一點(其實也就把基本功能補一下
搞了一個比較有實用功能的小程式可以讓有裝selenium的人玩一下
先上程式碼

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import os

UID = input('UID: ')
PW = input('PW: ')

driver = webdriver.Chrome()
driver.get("https://wall.gamer.com.tw/")

driver.find_element(By.ID, "uidh").send_keys(UID)
driver.find_element(By.NAME, "passwdh").send_keys(PW)
driver.find_element(
    By.CSS_SELECTOR, ".form__buttonbar:nth-child(6) > .btn--primary").click()
time.sleep(0.5)
while True:
    os.system('cls')
    content = input('content(換行請打\n): ')
    driver.find_element(By.CSS_SELECTOR, ".sidebar_section_btn-post").click()
    driver.find_element(By.CSS_SELECTOR, ".input-main-editor-content").click()
    time.sleep(0.5)
    element = driver.find_element(
        By.CSS_SELECTOR, ".input-main-editor-content")
    driver.execute_script(
        "if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '"+content+" '}", element)
    driver.find_element(By.CSS_SELECTOR, ".input-main-editor-content").click()
    driver.find_element(
        By.CSS_SELECTOR, ".input-main-editor-content").send_keys(Keys.BACK_SPACE)
    time.sleep(0.5)
    driver.find_element(By.CSS_SELECTOR, ".btn").click()
    driver.execute_script("window.scrollTo(0,0)")
    time.sleep(0.5)
    driver.find_element(By.CSS_SELECTOR, ".btn-primary").click()

一開始需要輸入你的帳密

隨便亂打的 不要照做 = =

我剛剛的測試都是直接寫好在code裡讓程式自己填
不過這邊就需要客製化一點

然後用了os.system('cls') (把終端機頁面清空)來保護隱私和保持界面整潔
然後接下來就是填文字內容
 
這邊沒啥限制 主要就是跳脫字元要特別注意
比如最基礎的換行是\n 斜線是\\ 單引號是\' 之類的

為了使用更方便一點 可以讓程式不是單次使用
我這邊套了無限迴圈
然後之前打的os.system('cls') 這時又可以來讓終端機畫面保持簡潔
然後就能不斷在框框打文了來無CD瘋狂刷廢文了

基本上是這樣的小程式
畢竟只是隨便做做 功能也是頗鳥
首先感覺也不能算自動 感覺只是程式代你發文而已
目前也只能發文字不能上傳文字、不能標註人和作品等等
要加這些功能我再用IDE去調一下code就可以實現
而且模板生出來以後 就能結合其他程式來進行一些應用
比如剛剛我想到的預約發文、定時上傳資料等等真正實現自動化的功能

總之用途多多
但是今天只是小練習而已 就沒打算做太多了
這次研究差不多就這樣了
感謝觀看~



38

20

LINE 分享

相關創作

[閒聊][711fm]左岸咖啡館甜檸咖啡好喝

誘人的形狀《貓咪造型瓶身威士忌》讓貓奴忍不住心動的名品

貓咪大戰爭 終極心得

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】