Отбывая срочную службу, я заметил, что приходится заполнять довольно много цифровых форм. И это не разовые формы, это формы, которые мне приходится заполнять каждый день. Будучи сам решателем проблем (к тому же ленивым), я хотел сделать эти формы намного проще в заполнении. Я хотел
- хранить данные более простым способом
- обрабатывать их в данные, ожидаемые формой
- автоматически заполнять форму.
После некоторых экспериментов я нашел несколько решений
Selenium
В июне 2022 года я выполнил несколько заданий CTF (HTB CTF, SEETF), некоторые из которых включали использование этой библиотеки Python под названием selenium
в качестве веб-бота. Мне уже приходилось читать код с использованием этой библиотеки, и я решил, что могу использовать ее для автоматизации отправки своих форм.
На самом деле запустить ее довольно просто. Во-первых, вам нужно установить ее и необходимые зависимости. Вам следует pip install selenium
, но вам также нужно установить драйвер веб-браузера. Я использовал ChromeDriver, но есть также GeckoDriver для Firefox.
Вот пример кода. Он заполняет текстовое поле, которое вы можете выбрать по ID элемента, и нажимает на элемент. Используя эти концепции, вы, вероятно, сможете сделать сценарий для автозаполнения собственной формы
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def visit_report():
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito")
client = webdriver.Chrome(chrome_options=chrome_options,
executable_path=r"/run/media/hacker/Windows/Users/zunmu/Documents/Stuff/Linux Tools/chromedriver")
#executable_path=r"D:\chromedriver.exe")
client.set_page_load_timeout(10)
client.set_script_timeout(10)
client.get('https://www.w3schools.com/html/html_forms.asp')
time.sleep(3)
### Fill up text fields
client.find_element_by_id("fname").send_keys("Data")
client.find_element_by_id("lname").click()
### Traversing the DOM
button = (
client.find_element_by_id("fname")
.find_element(by=By.XPATH,value='..')
.find_elements_by_xpath(".//*")[-1]
)
button.click()
time.sleep(300)
client.quit()
visit_report()
Selenium Python имеет несколько полезных ресурсов, таких как
- https://selenium-python.readthedocs.io/locating-elements.html
- https://stackoverflow.com/questions/24795198/get-all-child-elements
Одним из преимуществ является то, что вы можете использовать любые библиотеки, какие захотите, и что это легко кодировать. В итоге я объединил Selenium и openpyxl
, библиотеку Excel Sheet Python, для чтения данных из Excel Sheet и автозаполнения формы.
Мобильный Selenium?
Топовая версия — это здорово и все такое, но я хотел что-то мобильное. В конце концов, я не везде беру с собой ноутбук. Мой первый подход заключался в том, чтобы просто запустить код selenium на мобильном устройстве.
Я уже установил Kali NetHunter на свой телефон Android и подумал, сможет ли он запустить мой Python-скрипт как есть. Оказалось, что Chrome не поддерживается в моей установке Kali NetHunter из-за неправильной конфигурации SUID.
Я поменял драйвер на GeckoDriver, чтобы воспользоваться преимуществами Firefox, предустановленного на nethunter
. Я нашел двоичный файл ARM здесь, скачал его и обновил свой скрипт с новым WebDriver, как здесь.
В итоге все работает довольно хорошо, не нужно все перекодировать, но
- Вам нужно пройти через NetHunter, интерфейс которого не очень интуитивно понятен.
- Он работает только на Android, но не на iOS.
Я хотел найти лучшее решение, чтобы поделиться радостью автозаполнения форм с другими.
React-Native / Expo
По прихоти я решил поискать React Native WebView и проверить, есть ли в нем функциональность для автозаполнения форм. Я получил кое-что еще лучше, мы можем внедрить наш собственный пользовательский код Javascript с помощью свойства injectedJavaScript
. Ссылка здесь.
<WebView
style={styles.container}
source={{uri: 'https://github.com/react-native-community/react-native-webview'}}
javaScriptEnabled={true}
injectedJavaScript={`document.body.style.backgroundColor = 'red';
setTimeout(function() { window.alert('hi') }, 2000);
true;`}
onMessage={(event) => {}}
/>
%[http://snack.expo.dev/@hackin7/basic-webview-usage].
Вы должны обратить внимание, что код, который вы хотите запустить для автозаполнения документа, вероятно, должен быть в setTimeout
для запуска через несколько секунд после загрузки документа (вероятно, чтобы дать ему время загрузиться).
С этим я провел выходные, работая над созданием Proof of Concept App для автоматического заполнения форм. Я использовал document.getElementById("<id>").value = <value>;
и <element>.click();
в Javascript. Сделать приложение так же сложно, как и обычное мобильное приложение (сложнее, чем selenium, но ничего слишком сложного или трудного).
И это мой путь к созданию приложения для автоматического заполнения нужной мне формы.
В целом
В целом, Selenium хорош для быстрого создания прототипов, в то время как вы можете использовать React Native/ Expo для окончательной доработки приложения.
Вероятно, существует множество других способов сделать это. Например, WebView в Android SDK, вероятно, имеет функциональность для взаимодействия с элементами, как показано здесь. В качестве альтернативы можно просто вручную написать сценарий на Python, который может генерировать Javascript для вставки в консоль разработчика (хотя это не самое элегантное решение).