<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF122%3APython</id>
		<title>LXF122:Python - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF122%3APython"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF122:Python&amp;action=history"/>
		<updated>2026-05-13T23:35:21Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF122:Python&amp;diff=10625&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF122:Python&amp;diff=10625&amp;oldid=prev"/>
				<updated>2010-08-24T07:36:53Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''Python''''' Заставим Web доставлять нужное содержимое вам на блюдечке&lt;br /&gt;
&lt;br /&gt;
==''Python'': Прочту вам твиты==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Python}}&lt;br /&gt;
&lt;br /&gt;
: '''Часть 3: Ник Вейч''' продолжает web-эксперименты а-ля доктор Моро, на сей раз создавая гибрид, умеющий говорить – полу-''Python'', полу-''Twitter''.&lt;br /&gt;
&lt;br /&gt;
Однажды некто решил, что людям нужно больше отвлекаться от работы – и придумал ''Twitter''. Возможно, в штаб-квартире ''Twitter'' эту историю изложили бы не совсем так – скорее всего потому, что она создает не слишком гламурный имидж (ну да, да, это еще и дико неточно). Так или иначе, Twitter оседлал волну популярности. Если вы хотите узнать, в какой точке планеты сейчас находится Стивен Фрай, что каждый житель США ел на ланч или как самодовольно бахвалится о своем величии Джонатан Росс сегодня, проще всего обратиться туда.&lt;br /&gt;
&lt;br /&gt;
Вы удивитесь, но ''Twitter'' способен и на полезные штуки. По нашим предыдущим урокам мы поняли, что секрет победы над технологией – узнать, как работает сервис, а затем выяснить детали его интерфейса прикладного программирования (API, Application Programming Interface). Оказывается, API Twitter закручен довольно лихо: всякие вещи в нем работают самыми разными способами. Но не будем расстраиваться, ведь в ''Python'' для него существует масса оберток. Больше всего нам подойдет стандартный ''Python-Twitter'', доступный во множестве репозиториев, а также по адресу http://code.google.com/p/python-twitter.&lt;br /&gt;
&lt;br /&gt;
===Перерыв===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Identi.ca|Содержание=Identi.ca – это свободная платформа микроблоггинга с открытым&lt;br /&gt;
кодом. Ее содержимое доступно по лицензии Creative Commons, и, наверное, это мило по отношению к прародительнице. Увы, она далеко не так популярна, как ''Twitter''. Но, может, оно и к лучшему – все&lt;br /&gt;
же меньше шума. Основы этого урока можно применить к Identi.ca таким же образом, как и к ''Twitter'', потому что API Identi.ca подобен API Twitter (довольно странному) на низком уровне.|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
Так, теперь приостановим урок, чтобы дать вам выбор. Вы когда-нибудь слышали об Identi.ca? Он, э-э, вылитый ''Twitter'', более или менее, но работает на свободном ПО под лицензией GPl. Его содержание доступно на условиях Creative Commons, а значит, в целом он убедительнее и красивее, чем ''Twitter''. Честно.&lt;br /&gt;
&lt;br /&gt;
Все еще тут? Тогда заодно расскажем, как все работает в Identi.ca. Специального модуля ''Python'' для этого сервиса нет, но поскольку API схож с ''Twitter'', мы просто сменим настройки подключения к серверу в файле '''twitter.py'''. Вообще-то это уже сделано за нас – посмотрите файл по адресу http://www.dilella.org/foo/twitter.py_new. И это на самом деле позволяет передавать данные на сервер – поэтому теперь, увидев&lt;br /&gt;
&lt;br /&gt;
 client = twitter.Api(username=”foo”,password=”bar”)&lt;br /&gt;
&lt;br /&gt;
можете сделать следующую замену:&lt;br /&gt;
&lt;br /&gt;
 client = twitter.Api(username=”foo”, password=”bar”, twitterserver=”identi.ca”)&lt;br /&gt;
&lt;br /&gt;
Если хотите использовать эту расширенную библиотеку, просто скачайте файл по ссылке. Понадобится заменить установленную библиотеку, связанную с ''Twitter'' (для более гладкой работы системы, лучше сперва установить исходный пакет ''Python-Twitter''). В зависимости от ваших версий Linux и ''Python'', он находится в '''/usr/lib/python2.5/site-packages''' или где-то еще. Просто замените файл '''twitter.py''' на новый.&lt;br /&gt;
&lt;br /&gt;
===Соединение===&lt;br /&gt;
&lt;br /&gt;
Чтобы от системы ''Twitter'' был прок, создадим учетную запись. Как и в предыдущих проектах, для этих целей можно написать скрипт, но гораздо легче просто перейти на web-страницу, зарегистрироваться и запомнить детали, которые вы будете использовать. Вы, наверное, также захотите добавить друзей (в противном случае будет скучновато), а можно и использовать имеющуюся учетную запись. Для целей нашего урока, мы создали&lt;br /&gt;
профиль для '''evilbotx''' и решили следовать по ''Twitter'' за очаровательной Бритни Спирс. Теперь запустите&lt;br /&gt;
''Python'' в окне терминала (набрав ''python'', и приступим  к созданию микроблога:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Cкорая помощь|Содержание=О функциях любого модуля ''Python'' можно разузнать в подробностях, импортировав его в оболочке ''Python'' и набрав ‘'''help (имямодуля)'''’.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import twitter&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; client = twitter.&lt;br /&gt;
 Api(username=”evilbotx”, password=”mypassword”)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; client.PostUpdate(“Hello World!”)&lt;br /&gt;
 &amp;lt;twitter.Status object at 0xb7c2f44c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эти строки завершают ритуал самопровозглашения нашего приложения. Сначала мы создали объект под названием&lt;br /&gt;
'''client''', который соединился с сервером ''Twitter'' и идентифицировался, а в следующей строке применили&lt;br /&gt;
его метод для публикации сообщения (в терминологии ''Twitter'' это называется «обновить статус»).&lt;br /&gt;
&lt;br /&gt;
Если вы создаете чисто автономную систему, больше вам знать и не надо – вы можете вставить данный кусок&lt;br /&gt;
кода в свой скрипт и отправлять твиты куда захотите. Но мы хотим большего. Следующим шагом будет список&lt;br /&gt;
людей, за обновлениями которых вы желаете следить и узнавать их статусы. Процесс не сложен, потому что для большинства задач существуют готовые методы:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; userlist = client.GetFriends()&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; for username in userlist:&lt;br /&gt;
 ... print username.screen_name, username.status.text&lt;br /&gt;
 ...evilnick @tweeny4 it’s hard to beat a poached egg&lt;br /&gt;
 serenajwilliams @celebsdontreply. Of course, I reply.&lt;br /&gt;
 britneyspears The Circus is coming back to the states&lt;br /&gt;
 -Britney&lt;br /&gt;
&lt;br /&gt;
Из этого кода видно, что метод '''GetFriends()''' возвращает список объектов '''user. User''' – это класс в модуле ''Twitter'' с различными атрибутами: описание пользователя, псевдоним и т. д. Модуль получает эти данные от ''Twitter'' при создании объектов, и их можно извлечь. Рассмотрим некоторые полезные свойства.&lt;br /&gt;
&lt;br /&gt;
* '''User.id''' Уникальный идентификационный номер, присваиваемый пользователю сервиса ''Twitter''.&lt;br /&gt;
* '''User.name''' Реальное имя пользователя. *&lt;br /&gt;
* '''User.screen_name''' Его псевдоним в ''Twitter''.&lt;br /&gt;
* '''User.description''' Небольшое описание, введенное пользователем. *&lt;br /&gt;
* '''User. Profile_image_url''' Ссылка на картинку профиля пользователя.&lt;br /&gt;
* '''User.url''' URL, введенный пользователем, часто – домашняя страница. *&lt;br /&gt;
* '''User.status''' Последний объект '''status''' этого пользователя.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Эти поля могут оставаться пустыми, если пользователь не указал информацию.&lt;br /&gt;
&lt;br /&gt;
При желании можно использовать все это программно – например, подгружая изображения для графического клиента&lt;br /&gt;
''Twitter'' или объединяя пользователей в группы по интересам.&lt;br /&gt;
&lt;br /&gt;
Как было бы здорово иметь клиент ''Twitter'' с поддержкой аудио! Вместо того, чтобы пялиться в дурацкий экран, отрываясь от написания ценного кода, можно просто включить свои уши и прослушивать обновления статусов. Для Linux существует несколько утилит преобразования текста в речь и даже распознавания голоса ([[LXF116:Компьютер слушает!|LXF116]]–[[LXF117:Компьютер слушает|117]]). В вашем дистрибутиве, возможно, уже установлены ''Festival'' или ''Espeak'', а если нет, пакеты легко найти в обычных репозиториях. Мы возьмем ''Espeak'', но вы можете использовать и другие, потому что код почти одинаковый. Для выполнения такого легкого задания не будем гнаться за сложными решениями – применим наш старый любимый модуль '''subprocess'''. Он, если вы помните, вызывает оболочку из ''Python''. Воспользуемся методом '''call''', который просто берет список аргументов, которые вы хотите использовать. Простой пример:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import subprocess&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; subprocess.call([‘espeak’,’”Hello World!”])&lt;br /&gt;
&lt;br /&gt;
===Получите ваши настройки===&lt;br /&gt;
&lt;br /&gt;
Вы будете дружелюбно (если вам по вкусу синтетические голоса) поприветствованы голосом. В случае синтаксической ошибки тщательно проверьте правильность расстановки кавычек. Последний элемент в списке – текстовая строка, заключенная в двойные кавычки, а затем в простые кавычки. Она передает Полное объяснение модуля ''Pyton-Twitte''r имеется на сайте http://static.unto.net/python-twitter/0.6/doc/twitter.html.espeak «Hello World!” в командную строку. Итак, наш клиент будет выглядеть наподобие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 import twitter, subprocess, time&lt;br /&gt;
 client = twitter.Api(“evilbotx”, “evilbot”)&lt;br /&gt;
 while True :&lt;br /&gt;
   list = client.GetFriends()&lt;br /&gt;
    for name in list:&lt;br /&gt;
      print name.screen_name, name.status.text, name.status.id&lt;br /&gt;
      texty = name.screen_name + name.status.text&lt;br /&gt;
      time.sleep(2)&lt;br /&gt;
      subprocess.call([“espeak”, texty])&lt;br /&gt;
   time.sleep(60)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы устанавливаем соединение, входим в бесконечный цикл и получаем список друзей. Внутренний цикл обрабатывает статусы и выдает их, конвертирует информацию в строку и затем использует '''subprocess.call''' для ее перевода в речь. '''Time.sleep(60)''' инициализирует задержку, чтобы не досаждать серверу слишком часто.&lt;br /&gt;
&lt;br /&gt;
Вы можете удивиться, почему мы обращаемся к списку друзей внутри главного цикла. Но так будет проще, по двум причинам. Во-первых, все объекты '''User''' из списка автоматически снабжаются последними статусами. Загрузив список друзей единожды, мы все равно в каждом цикле справлялись бы со статусами, что загромоздило бы код и (только не надо меня здесь цитировать: доказательств у меня никаких, одни смутные подозрения), возможно, увеличило бы затраты на взаимодействие клиента с сервером. Вторая причина заключается в том,&lt;br /&gt;
что мы можем спокойно запускать и его, и другой клиент ''Twitter'', или заходить на сайты. Любые изменения в списке друзей сразу отразятся в скрипте.&lt;br /&gt;
&lt;br /&gt;
На этом этапе все работает, но есть проблема: статусы оглашаются независимо от того, были ли они обновлены за данный период. Не мешает проверить время, когда было создано статусное сообщение, и сравнить с настоящим. Если сообщение создано более чем 60 секунд назад (или, допустим, 61 – дадим доработать остатку кода), то его нужно сказать вслух. На беду, время относительно. Временной модуль ''Python'' выдает время как смещение от начала эпохи (секунды с момента создания вселенной – согласно Unix, это была полночь 1 января 1970 г.), а ''Twitter'' выдает время создания статусного сообщения в текстовом формате. &lt;br /&gt;
&lt;br /&gt;
Чтобы сравнить эти времена, надо привести их к одному виду. Похоже, модуль ''Twitter-Python'' в процессе трансляции делает ошибочное допущение, потому что его методы определения времени получения статусного сообщения и времени, когда оно было опубликовано, дают различные результаты. Это усложняет ситуацию,&lt;br /&gt;
но не делает невозможным ее исправление. API Twitter возвращает даты и время в виде  текстовых строк в формате&lt;br /&gt;
'''Mon Jun 8 11:46:34 +0000 2009'''. Тут все в порядке, потому что ''Python'' умеет конвертировать их в нормальный числовой формат  и затем в число секунд от начала эпохи. Единственный небольшой прокол – ''Twitter'' не включает в формат даты часовой пояс. Однако эксперименты покажут вам, что время, как и следовало ожидать, в UTC (или GMT, если вы помните, что время изобрели в Британии). Теперь можно просто добавить '''UTC''' в конец строки, и пусть ''Python'' преобразует это в более удобный числовой формат.&lt;br /&gt;
Объект '''status''' сохраняет время прямо из ''Twitter'' в виде свойства '''created-at''', и мы можем использовать его безо всяких проблем. Функция '''time.strptime''' преобразует имеющуюся строку в набор числовых величин стандартной формы. Для получения результата, нужно передать саму строку и строку-описание&lt;br /&gt;
ее формата, которая содержит указания или описания в соответствии со списком значений, поддерживаемых модулем.&lt;br /&gt;
Для нас они таковы: '''%а''' – аббревиатура  для названия дня, '''%b''' – для названия месяца, '''%d''' – для обозначения числа, '''%H''' – часы, '''%m''' – минуты, '''%S''' – секунды, '''%Y''' – год, и '''%Z''' – трехбуквенное обозначение часового пояса.&lt;br /&gt;
&lt;br /&gt;
===Один статус за все===&lt;br /&gt;
&lt;br /&gt;
Кто читал предыдущий выпуск, про чат-ботов, возможно, помнит, что статусное сообщение легко установить программно. А как насчет автоматической установки вашего статуса в чате по вашему последнему обновлению&lt;br /&gt;
в ''Twitter''? По-простому, можно поступить так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 import xmpp, twitter&lt;br /&gt;
 twituser=”foo1”&lt;br /&gt;
 twitpass=”foo2”&lt;br /&gt;
 jabberuser=”bar1@something”&lt;br /&gt;
 jabberpass=”bar2”&lt;br /&gt;
 twit=twitter.Api(username=twituser,password=twitpass)&lt;br /&gt;
 text=twit.GetUser(twituser).status.text&lt;br /&gt;
 jid=xmpp.protocol.JID(jabberuser)&lt;br /&gt;
 jab=xmpp.Client(jid.getDomain(),debug=[])&lt;br /&gt;
 jab.connect()&lt;br /&gt;
 jab.auth(jid.getNode(),jabberpass)&lt;br /&gt;
 jab.sendInitPresence()&lt;br /&gt;
 jab.send(xmpp.Presence(status = text , show = “chat”, priority = ‘1’)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вставьте все это в цикл с подходящей задержкой, и получите два в одном – только не забудьте подставить в начале свой настоящий ID и пароль. &lt;br /&gt;
&lt;br /&gt;
===Когда был твит?===&lt;br /&gt;
&lt;br /&gt;
Как вы можете заметить, мы добавили последнюю величину сами, чтобы она участвовала в обработке времени в ''Python''. Внутренний числовой формат, используемый в ''Python'', просто указывает все даты в числах,&lt;br /&gt;
что легко увидеть, преобразовав время вручную:&lt;br /&gt;
&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; time.strptime(‘Mon Jun 8 10:51:32 +0000 2009 UTC’, ‘%a %b %d %H:%M:%S +0000 %Y %Z’)&lt;br /&gt;
 (2009, 6, 8, 10, 51, 32, 0, 159, 0)&lt;br /&gt;
&lt;br /&gt;
Эти числа, соответственно, год, месяц, число, часы, минуты, секунды, день недели (понедельнику соответствует 0), день в году и отметка о летнем времени. Поэтому-то и важно указать часовой пояс, ведь при отсутствии&lt;br /&gt;
данной отметки ''Python'' попытается ввести свою, что может привести к непонятным результатам. &lt;br /&gt;
&lt;br /&gt;
Время можно затем перевести в привычные для Unix секунды от начала эпохи, используя '''time.mktime()'''. Вы можете найти более подробную информацию о модуле '''time''' и различных методах, открыв в своем браузере http://docs.python.org/library/time.html. &lt;br /&gt;
&lt;br /&gt;
Наш преобразованный код принял следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 import twitter, subprocess, time&lt;br /&gt;
 client = twitter.Api(“evilbotx”, “password”)&lt;br /&gt;
 while True :&lt;br /&gt;
   list = client.GetFriends()&lt;br /&gt;
   for name in list:&lt;br /&gt;
     texty= name.screen_name + name.status.text&lt;br /&gt;
     now = time.mktime(time.gmtime())&lt;br /&gt;
     stringmsgtime =name.status.created_at + ‘ UTC’ &lt;br /&gt;
     msgtime=time.mktime(time.strptime(stringmsgtime,‘%a %b %d %H:%M:%S +0000 %Y %Z’))&lt;br /&gt;
     if ((msgtime+61)&amp;gt;now):&lt;br /&gt;
       subprocess.call([“espeak”, texty])&lt;br /&gt;
     time.sleep(60)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь у вас есть функционирующий аудио-клиент ''Twitter'' всего из 13 строк кода. Неплохо; единственная проблема возникнет, если в вашем списке активных друзей более дюжины человек – тогда скрипт вам будет не заткнуть. В этом случае, ограничьтесь теми пользователями, за обновлениями которых вы хотите следить, а затем&lt;br /&gt;
получайте статус каждого из вашего списка, и для этого нужно поменять всего лишь несколько строк кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 import twitter, subprocess, time&lt;br /&gt;
 client = twitter.Api(“evilbotx”, “password”)&lt;br /&gt;
 list = [‘evilnick’, ‘evilbottester’, ‘tweeny4’]&lt;br /&gt;
 while True :&lt;br /&gt;
   for item in list:&lt;br /&gt;
     name=client.GetUser(item)&lt;br /&gt;
     texty= name.screen_name + name.status.text&lt;br /&gt;
     now = time.mktime(time.gmtime())&lt;br /&gt;
     stringmsgtime =name.status.created_at + ‘ UTC’&lt;br /&gt;
     msgtime=time.mktime(time.strptime(stringmsgtime,‘%a %b %d %H:%M:%S +0000 %Y %Z’))&lt;br /&gt;
     if ((msgtime+61)&amp;gt;now):&lt;br /&gt;
        subprocess.call([“espeak”, texty])&lt;br /&gt;
     time.sleep(60)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В новой версии нашего скрипта внутренний цикл проходит через список и задействует метод '''GetUser()''' для каждого псевдонима пользователя. Он возвращается как объект '''User''' со свойствами, включающими последнее&lt;br /&gt;
обновление. Теперь вы получите голосовое уведомление, только если статус обновит кто-то из избранных контактов.&lt;br /&gt;
&lt;br /&gt;
===Идем дальше===&lt;br /&gt;
&lt;br /&gt;
Полезным дополнением к скрипту может быть GUI для быстрого обновления вашего собственного статуса. Для этого&lt;br /&gt;
достаточно создать поле ввода (не более 140 знаков), используя ''PyQt, wxWidgets'' или другой любезный&lt;br /&gt;
вам GUI, и подсоединить метод для публикации обновлений статусов по нажатию '''Enter'''. А можно употребить&lt;br /&gt;
ваши знания методов ''Twitter'' для добавления его функций к другим сервисам. Пусть ваши серверы сообщают&lt;br /&gt;
о степени своей загрузки и остатке свободного пространства; или добавьте скрипт в ''Amarok'' для создания&lt;br /&gt;
уведомлений о проигрываемых треках; или запрограммируйте произвольные выкрики про Майка. Все в ваших руках.&lt;br /&gt;
'''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>