Наша "Империя зла"
Учимся покорять Google с использованием Python
Многие называют Google "корпорацией зла", хотя я и не вижу в ней ничего плохого, но если народ называет, так тому и быть. И для превращения Google действительно в "зло" научимся использовать его сервисы для своих ооочень благородных хакерских дел.
Как говорил Артист из фильма о Брайтон Бич "Если мы не можем его купить - нужно его убить... или использовать". Google это как подарок судьбы для нас. У него ведь не только множество сервисов, которые нам полезны, но также Google предоставляет прекрасный API (Application Programming Interface) для доступа к ним. Сегодня разберем некоторые из сервисов.
SEO & Blogspot
Перед непосредственной работой с Google подготовимся и установим библиотеку GData и ElementTree (смотри их на диске).
А первой задачей, что решим, будет помощь СЕОшникам с их сателлитами, в качестве которых можно использовать Гугловский блогохостинг Blogspot. Сперва зайдем на него - http://blogspot.com/ и создадим блог, к примеру, http://super-puper-hacker.blogspot.com. А теперь напишем код для автоматического постинга в блог информации. Во-первых, авторизируемся на blogspot'е инициализируя обьект blogger_service:
from gdata import service
import gdata, atom
blogger_service =
service.GDataService('login@gmail.com','pass')
blogger_service.source = '][akep'
blogger_service.service = 'blogger'
blogger_service.account_type = 'GOOGLE'
blogger_service.server = 'www.blogger.com'
blogger_service.ProgrammaticLogin()
Но у нашего аккаунта может быть несколько блогов, которые идентифицируются специальным идентификатором. Попробуем получить id первого блога:
query = service.Query()
query.feed = '/feeds/default/blogs'
feed = blogger_service.Get(query.ToUri())
blog_id = feed.entry[0].GetSelfLink().href.split("/")[-1]
Этим кодом в переменную blog_id сохранили нужный идентификатор. Хотя этот пусть не очень эффективный, ведь зачем каждый раз узнавать этот айдишник, если он не меняется. Можно, как вариант, зайти на блог, нажать на кнопку "добавить новый пост" и в браузере будет приблизительно такой текст http://www.blogger.com/post-create.g?blogID=3344789329453358925, где как раз последние цифры являются идентификатором блога. А дальше написать так:
blog_id = 3344789329453358925
И наконец-то создадим наш пост как обьект gdata.GDataEntry, в котором установим свойства title и content. Да и запостим на блог методом blogger_service.Post:
title = "TITLE"
text = "TEXT"
entry = gdata.GDataEntry()
entry.title = atom.Title('xhtml', title)
entry.content = atom.Content(content_type='html', text=text)
blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)
Так что можешь взять отсканированный текст какой-то книги и постить по страничке пару раз в день на блог, тем самым получая уникальный контент. Хотя я тебе предложу другой вариант для получения контента, а именно поиск через Google английских текстов определенной тематики с последующим переводом на русский язык.
Поиск
Примемся за поиск уникального контента. Это можно сделать через регулярки и один запрос, но как-то сложновато писать самим ;), ведь уже ребята давно написали, и мы можем скачать библиотеку xgoogle (конечно же я ее также поместил на диск), и использовать всего лишь один обьект GoogleSearch, которому при создании нужно передать поисковый запрос, а потом лишь использовать для парсинга страниц метод get_results до тех пор пока этот метод будет возвращать результат. В конечном счете код будет выглядеть следующим образом:
from xgoogle.search import GoogleSearch
gs = GoogleSearch("presidentua")
results = gs.get_results()
while results:
for res in results:
print res.url
results = gs.get_results()
Перевод
Теперь допустим текст ты уже получил из страниц что напарсили в предыдущем примере. А теперь перейдем к переводу и вспомним Google Translate, который знает больше 50 языков. В этого сервиса также есть API для доступа, но он на основе JavaScript библиотеки, посему и в этот раз следовало б заюзать еще одну либу, которых хватает. Но напишем лучше сами, потому что есть некоторые недостатки в либах, да и нам будет полезно изучить сверхполезную либу для парсинга HTML, а именно BeautifulSoup. Сначала получим страницу используя opener из стандартной библиотеки urllib2:
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', '][akep /0.1')]
translated_page = opener.open(
"http://translate.google.com/translate_t?" +
urllib.urlencode({'sl': sl, 'tl': tl}),
data=urllib.urlencode({'hl': 'en', 'ie': 'UTF8',
'text': text.encode('utf-8'), 'sl': sl, 'tl': tl})
)
Мы сначала создаем opener, а дальше устанавливаем User-agent, так как без него Google отказывается переводить. И исполняем запрос передавая все параметры исходя из API Google:
- sl, из какого переводим языка
- tl, на какой язык
- hl, язык интерфейса, этот параметр нам не важен, поэтому пусть всегда будет 'en'
- ie, кодировка текста, конечно же используем utf-8
- text, сам переводимый текст
После запроса в переменной translated_page будет HTML код, и что бы вытянуть лишь переведенный текст как раз используем BeautifulSoup. Создадим его обьект:
translated_soup = BeautifulSoup(translated_page)
Теперь из переменной translated_soup можем вытянуть данные, например, мы точно знаем, что переведенный текст находится в div элементе HTMLла у которого идентификатор равен result_box, тогда нужный еревод вытянем такой строкой:
translated_soup('div', id='result_box')[0].string
Вообще о BeautifulSoup советую отдельно почитать на официальном сайте www.crummy.com/software/BeautifulSoup/, поверь, если будешь юзать, эта либа чрезвычайно упростит тебе жизнь.
Опера - не всегда браузер
Ну хватит все помагать СЕОшникам, ведь Гугл полезен и другим представителям хак-сцены. Посмотрим на оперативных сотрудников милиции - они же оперативно владеют информациею поэтому могут быстро и эффективно реагировать, и нам не положено от них отставать. Пусть есть такая ситуацию, у тебя снифер, и нужно получить доступ к сайту, что хранит сессию лишь полчаса. Посему тебе нужно сидеть постоянно возле компа и следить за логами, чтобы после получения кукисов успеть их применить, но также можно и клевую гулянку пропустить. Чтобы решить данную проблему нужно постоянно быть в курсе обо всем происходящем, и для сего дела подойдет телефон, что всегда под рукою, и конечно же СМСка с информацией о событии. Отправлять СМСки зачастую не так-то просто, ведь на бесплатных сервисах мешает капча. И тут Гугл не оставил в беде нас и создал такую фишку как Календарь, где можно выставлять события с оповещением по СМСке. Это и заюзаем.
Итак, берем заходим в календарь на Гугле и там в настройках указываем телефон, а также способ уведомления о событиях - ставим "за одну минуту до события послать СМС".
Теперь перейдем к программе, где сначала нужно авторизироваться:
calendar_service = gdata.calendar.service.CalendarService()
calendar_service.email = 'spirt40@gmail.com'
calendar_service.password = 'мой пароль'
calendar_service.source = '][akep'
calendar_service.ProgrammaticLogin()
Дальше легко добавляем событие:
text = 'Texxxt'
text += ' %s:%s'%(time.localtime()[3],time.localtime()[4]+2)
event = gdata.calendar.CalendarEventEntry()
event.content = atom.Content(text=text)
event.quick_add = gdata.calendar.QuickAdd(value='true')
new_event = calendar_service.InsertEvent(event, '/calendar/feeds/default/private/full')
Я уже давно приделал такую штуку для мониторинга своих сервисов, и теперь сплю как младенец ;)
Хотя может этот способ и не долго будет актуален, ведь насколько знаешь Гугл анонсировал своего "убийцу скайпа", где вроде будут бесплатные сообщения на все номера. Но до этого еще дожить нужно, а пока Календарь будет продолжать нам помогать.
Таблицы
Где твои скрипты, например тот же снифер, хранит данные? на хостинге? А если его завтра закроют... Поэтому давай найдем замену и попробуем использовать Spreadsheets - Гугловские таблицы.
Для этого зайди на http://spreadsheets.google.com/ создай новую таблицу и обязательно вверху посмотри ее код, если у меня URL http://spreadsheets.google.com/ccc?key=tLqt8Y4YaQyqe8DrRBcxS-g&hl=en, то кодом будет tLqt8Y4YaQyqe8DrRBcxS-g, данный идентификатор нужен для того, чтобы знать с какой таблицей работать. Дальше в ней установим в первой строчке название столбцов. Если это снифер, то можно назвать типа ip, user-agent, cookie, ну или по-твоему усмотрению. Я же для демонстрации назвал столбы first и second. Теперь после кода авторизации на Гугле формируем исходные данные:
key = 'tLqt8Y4YaQyqe8DrRBcxS-g'
wksht_id = '1'
data = {
'first': 'first data',
'second': 'second, some text'
}
Где в начале код самой таблицы, дальше идентификатор листа, и массив где индексом элементов есть название колонок в таблице. Теперь имея все это можно их сохранить в базе:
gd_client.InsertRow(data, key, wksht_id)
...
Как видишь Google может помочь в очень многих случаях. Но это только маленькая часть тех возможностей что он дает. Ведь еще не рассмотрели гугловскую почту, что дает достаточно места для хранения файлов. Не рассказал о Google Maps, с помощью которого можно видеть на карте, например, с каких мест люди, что попались на сниффер. Также не рассказал о мощнейшей вещь хостинг Google App Engine. К примеру, можно на его основе, на Pyhon и Django сделать снифер, что будет всю информацию хранить в базе BigTable и этот снифер выдержит тысячи подключений, не упустит ни одного запроса и это все полностью бесплатно. Но это большая и интересная тема о которой поговорим отдельно уже в следующий раз.
