#javascript #python #windows #vba #автоматизация
Текущий неавтоматизированный процесс выглядит следующим образом: Нужно зайти в браузер и открыть специальную ссылку; Нужно выбрать из выпадающего списка свой логин; Выбрать папку с файлами и сами файлы, которые будут загружаться; Дальше для каждого окошка появляются формы для заполнения, например: первый файл называется Автор - Книга.doc, под этим название есть две формы для заполнения: "Автор: "; "Книга"; Руками копируется "Автор" в форму для заполнения; руками копируется "Книга" в форму для заполнения - так для каждого отдельного загружаемого файла; После того как все формы с "Авторами" и "Книгами" заполнены нажимается кнопка "Загрузить"; По результатам загрузки появляется окно "Загрузка завершена": "Автор - Книга".... и эту информацию нужно скопировать, например, в эксель файл. Вопрос: можно ли написать программу, которая автоматизирует этот процесс - чтобы она сама заполняла формы по стандартизированному название (между автором и книгой всегда могут стоять "пробел дефис пробел); чтобы копировала и заносила информацию в эксель; чтобы, перемещала загруженные файлы из одной папки в другую. Из навыков программирования только VBA excel. Хочется также понять, что конкретно и в каких языках программирования стоит изучить, чтобы суметь сделать подобную программу. Предпочтительно на Python. И был бы очень признателен за ответы на то, как решить последовательные кусочки этой довольной большой задачи и где можно прочитать ответы, чтобы эти кусочки работали: как заполнять формы в браузере, используя имя файла "Автор - Книга.doc" над этими формами? Как выбирать логин из списка? и др.
Ответы
Ответ 1
Вместо того, чтобы пытаться повторить действия пользователя с GUI буквально, можно взглянуть на задачу глазами программиста: вместо открытия браузера, заполнения и отправки формы, можно выполнить http POST запрос напрямую (request.post()) вместо выбора файлов в графическом диалоге, можно использовать API, которое возвращает список файлов по шаблону (Path().glob("*.doc")) вместо копирования руками метаданных книги из названия файла Author - Title.doc в элементы формы, выставляются требуемые параметры запроса напрямую (author, title в примере). Сами метаданные из имени файла можно получить, манипулируя строку с именем напрямую: fn.split('-') или с помощью регулярных выражений: r'^([^-]+?)\s*-\s*(.+)\.doc$' вместо копирования результатов загрузки из окна в Excel, ответ сервера напрямую печатается в csv формате в стандартный вывод (csv.writer(sys.stdout)) Что легко в файл скопировать (| tee -a books.csv) Конечный скрипт, который загружает файлы с книгами, может выглядеть так: #!/usr/bin/env python3 '''Upload "- .doc" books from the given directory. Usage: upload-books | tee -a books.csv ''' import csv import re import sys from pathlib import Path import requests # $ pip install requests if len(sys.argv) < 2: sys.exit(__doc__) src_dir = sys.argv[1] with requests.Session() as sess: writer = csv.writer(sys.stdout) for path in Path(src_dir).glob('*.doc'): # for each book metadata = re.findall(r'^([^-]+?)\s*-\s*(.+)\.doc$', path.name) if not metadata: print("warning: can't find author, title in path:", path, file=sys.stderr) continue # don't upload # upload book author, title = metadata[0] book = {path.name: (path.name, path.open('rb'), 'application/msword'), 'author': author, 'title': title} r = sess.post('https://example.com/api/v1/books', files=book, auth=('user', 'passwd')) if not r.ok: print("warning: can't upload book from path:", path, file=sys.stderr) continue # don't save book info # save uploaded book info data = r.json()['response'] writer.writerow([str(path), author, title, data['url']]) Это в хорошем случае, когда у сайта есть явное API или спонтанно сформировавшийся набор http запросов/ответов, не требует выполнения динамического кода в браузере (или когда результаты этого выполнения могут быть легко смоделированы). В менее удачном случае, когда, например, за загрузку книг ответчает Silverlight control, который использует какой-нибудь свой протокол для общения с сервером, то может быть проще использовать инструменты GUI автоматизации такие как pywinauto, pyautogui или AutoIt (упомянутый в ответе на схожий вопрос на Stack Overflow). В промежуточном случае, интерфейс реализован в браузере на javascript и работу с ним можно автоматизировать, используя что-нибудь вроде Selenium WebDriver (+ headless chrome). Ответ 2
Наиболее распространенным средством для таких целей является curl. Например, для формы с полями name, age и town команда должна вроде такой: curl -d Name="HarryP" -d Age="123" -d Town="DefaultCity" -d Form_Submit="Send" http://www.example.com/process-form.php
Комментариев нет:
Отправить комментарий