вторник, 8 марта 2016 г.

Python, как автоматизация труда секретарши.

Пока решал данную проблему, постиг мудрость:
Нельзя путать цель и способ достижения цели.
Интро:
На семинарах руководитель показывает презентацию со списками задач по каждому сотруднику. Каждую неделю, перед семинаром, он тратит более получаса на принтскрины из браузера списков в Basecamp'e. Но кроме того что он делает скрины, он еще обрезает/перемещает содержимое, что бы вместилось на слайд.
Вообще очень позитивно сказывается на решение задач.
Задача:
  • Сэкономить время руководителя скриптом (что всегда полезно)
  • И научиться пользоваться python (http://bash.im/quote/436725)


Первоначальная стратегия

я решил пойти путём прямой автоматизации. Т.е. сделать всё тоже самое что он делает руками, но с помощью Python'a (как оказалось, это съело море моего времени и конечный результат не достигнут, поэтому и надо не путать цель и способ достижения цели ><)

Тут задача разбилась на этапы:
  • авторизация на сайте Basecamp.com
  • парсинг html
    • получение списка сотрудников
    • получение списка задач назначенных на каждого сотрудника
      • удаление лишнего со страницы
  • сохранение html
  • преобразование html -> pdf/png/ppt (во что-нибудь, что бы вставлять в презентацию)

Первый подход

В интернете куча примеров авторизации, так же рекомендуют использовать "помошники" типа grab (в нем всё проще, но он под python2, вот не хотелось и всё)
Долго разбирался, не хватало какого-то малого ключа, поэтому рекомендую начать с теории и зайти на htmlbook.ru.
Собственно из кода ниже можно сделать, мне кажется, вход на почти любой сайт. Данные для словаря authData  можно узнать с помощью дополнения типа Firebug. После авторизации посмотрев в данные ушедшие на сервер с POST-запросом.

#!/usr/bin/env python3

import requests
import bs4
project_id = *******
#proxies = {'http': 'http://www-proxy.local:3128/'}
url = 'https://launchpad.37signals.com/basecamp'
html = requests.get(url)
soup = bs4.BeautifulSoup(html.text, "lxml")
hiddenAuthKey = soup.find('input', {'name': 'authenticity_token'})['value']
authData = {
            'password':'**********',
            'username':'**********',
            'utf8':'✓',
            'authenticity_token':hiddenAuthKey,
            'product':'basecamp',
            'x':169,
            'y':34}

url = 'https://launchpad.37signals.com/session'
s = requests.Session()
s.post(url,data=authData,headers={"Referer":"https://launchpad.37signals.com/basecamp"},verify=True)
page = s.get('https://basecamp.com/'+project_id+'/projects/1416343',verify=True)
 

Далее, для вычленения ссылок на сотрудников и удаления лишних блоков на странице использовалась библиотека BeautifulSoup. Документация на сайте[5]  подробно излагает возможности.
Отмечу что я использовал:
 
person_list = soup.findAll('a','person_name') # нахождение тегов a с классом person_name

soup.find('header').decompose() # метод удаляющий из кода соответствующий блок

Еще, на будущее, хочу отметить библиотеку pdfkit пригодную для конвертации html в pdf. На практике с ней не сложилось: были проблемы с использованием родных стилей и кодировки странички.
Так же, была опробована идея с использованием webkit2png. Идея простая - создается webkit окно, в котором отрисовывается html-страница и сохраняется как png изображение. К сожалению, тоже не сложилось.
Один из трудных моментов был кроссплатформенность. 
Под linux у меня всё работало. Под windows были неопределенные проблемы.

Правильная стратегия

И тут я вспомнил цель.
Была найдена библиотека pyrate. Работоспособна, но для python2. Эта библиотека, помимо basecamp поддерживает: Github, Harvest, Mailchimp, Twitter (v1.1 + OAuth). Библиотека имеет скудное описание, но работает. На просторах было найдено описание API Basecamp[8] и дальше уже не трудно.
Созданием презентации из данных занимается библиотека python-pptx [9].

bc2ppt.py - после запуска скрипта, рядом появиться не форматированная презентация с задачами каждого сотрудника.

Открытые вкладки в процессе:

  1. http://htmlbook.ru/samhtml5/formy/otpravka-dannykh-formy  Теория. Must read.
  2. http://docs.python-requests.org/en/latest/user/quickstart/ 
  3. http://www.cyberforum.ru
  4. http://grablib.org/ Говорят крутая библиотека, которая могла бы сократить мои страдания.... но у меня не заработала. Ни под 3 ни под 2.
  5. http://wiki.python.su/Документации/BeautifulSoup 
  6. https://habrahabr.ru/post/121815/ -   Парсинг на Pуthon.
  7. https://pypi.python.org/pypi/pyrate/0.5a6 Pyrate is a python wrapper for restful web apis. It's like magic but simpler.
  8. https://github.com/basecamp/basecamp-classic-api описание API Basecamp
  9. http://python-pptx.readthedocs.org/en/latest/

Комментариев нет:

Отправить комментарий