Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 130, ОКТЯБРЬ 2009 г.

Гуглосервисы для хакера. Овладеваем сервисами мегакорпорации с помощью Python’a

Лейтенант Роман 'predidentua' Хоменко, http://tutamc.com

Многие наши коллеги называют Google «корпорацией зла». Сложный вопрос! Лично я ничего плохого в данной организации не вижу, поскольку она совершенно бесплатно предоставляет честным программистам множество полезных сервисов и замечательный API для их использования.

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. В этом сервисе также есть 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 (без юзер-агента гугл переводить откажется). Финальным аккордом мы исполняем запрос, передаем все параметры, ориентируясь из 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. Поверь, эта либа способна чрезвычайно упростить тебе жизнь.

Опера - не всегда браузер

Ну, все, хватит помогать СЕОшникам, ведь Гугл полезен и другим представителям хак-сцены. Посмотрим на сотрудников милиции, они владеют актуальной информацией и потому способны к оперативному реагированию. Не будем от них отставать! Представим ситуацию, при которой у тебя есть снифер, и нужно получить доступ к сайту, который хранит сессию всего лишь полчаса. Получается, что теперь тебе придется безотрывно торчать за компом, чтобы быть готовым воспользоваться ситуацией? Вырваться из рабства нам поможет телефон, который всегда под рукой и всегда готов нас порадовать sms-кой, содержащей актуальную информацию. Но отправлять смски зачастую не так-то просто, так как на бесплатных сервисах нам мешает капча. И здесь тоже поможет Гугл, создавший замечательный Календарь, позволяющий извещать о событиях посредством СМС. Эту фичу мы и заюзаем.

Заходим на гуглокалендарь и в настройках указываем телефон, а также способ уведомления о событиях - ставим «за одну минуту до события послать СМС».

Теперь перейдем к программе, где сначала нужно авторизироваться:

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, выдержит тысячи подключений и не упустит ни единого запроса!

Как ты понимаешь, все это – темы для отдельных статей. Может быть, с ними мы познакомим тебя позже. Удачи!

Некоторые факты о Google

  • Google Inc. — американская компания, владеющая первой по популярности (77,04 %) в мире поисковой системой Google, обрабатывающей 41 млрд. 345 млн. запросов в месяц.
  • Google — самый дорогой бренд в мире. Рыночная капитализация компании составляет примерно 160 млрд. долл.
  • Google понимает более 100 языков. Кроме русского, украинского, английского, греческого, латыни, гэльского, хинди, зулусского, эсперанто, персидского, арабского, иврита, и многих других языков, Google также понимает язык повара Борк-Борк-Борка из «Маппет-шоу», язык расы инопланетян с планеты Клингон, персонажей сериала Star Trek, наречие Элмера Фуда (из мультика про Багса Банни) и древний полушуточный хакерский язык leet.

Вид мадагаскарских муравьев Proceratium google был назван в честь сервиса Google Earth, который помог открывателю в его исследованиях. Алгоритм ранжирования назван Page Rank, не от слова Page (страница), а от фамилии Ларри Пейджа – одного из основателей Google.

CD

Комментированные исходники и куча ништяков от автора как всегда ждут тебя на нашем мега-DVD.

VIDEO

К каждой статье я снимаю маленькое видео, и эта не станет исключением. Смотри его с нашего диска!

WWW

Сайт библиотеки Beautiful Soup: http://crummy.com/software/BeautifulSoup.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001