суббота, 30 июня 2012 г.

О Raspberry Pi, визах и умном доме.

Уже достаточно давно я хочу попробовать сделать свой собственный проект умного дома. Главным компонентом моей идеи является компьютер, который будет работать круглые сутки, выполняя те или иные задачи. Я очень долго ждал второй партии Raspberry Pi, даже отметился на нескольких сайтах  (http://authenticate.rsdelivers.com/). И вот, сегодня случилось чудо - мне выслали приглашение на покупку. Ясно-понятно, что купить можно было только либо через визу, либо через пайпал(второе предполагает первое :) ). По-быстрому сделал привязку симки к qiwi-кошельку и сделал заказ. Все, надеюсь, что менее чем через 12 недель я получу долгожданную плату и вдоволь поэкспериментирую ;)
Готовиться к посылке начну уже прямо с сегодняшнего дня, буду потихоньку реализовывать программную часть умного дома. 

вторник, 26 июня 2012 г.

Создание телефонной книги друзей vk.com с последующим переносом в google contacts

Надеюсь, что скоро куплю адроидофон, поэтому готовлюсь как морально, так и программно :) Первая мысль - как бы поменьше возиться с забиванием телефонной книги в новом устройстве. Так как в vk.com можно получить телефонные номера, а android замечательно синхронизируется с google contaсts, было решено написать скрипт, который берет инфу из вконтакта, пишит её в csv - файл, а затем мы его запросто грузим куда надо. Кстати, почему именно csv? Данный формат поддерживается не только google, но еще и кучей сторонних сайтов, правда там скорей всего другой формат данных, но хз, может и такой сойдет.

Собственно формат гугловского csv имеет вид:
Name,Given Name,Additional Name,Family Name,Yomi Name,Given Name Yomi,Additional Name Yomi,Family Name Yomi,Name Prefix,Name Suffix,Initials,Nickname,Short Name,Maiden Name,Birthday,Gender,Location,Billing Information,Directory Server,Mileage,Occupation,Hobby,Sensitivity,Priority,Subject,Notes,Group Membership,E-mail 1 - Type,E-mail 1 - Value,Phone 1 - Type,Phone 1 - Value,Phone 2 - Type,Phone 2 - Value,Address 1 - Type,Address 1 - Formatted,Address 1 - Street,Address 1 - City,Address 1 - PO Box,Address 1 - Region,Address 1 - Postal Code,Address 1 - Country,Address 1 - Extended Address,Website 1 - Type,Website 1 - Value
Поля пропускать нельзя, т.е. нельзя задать только имя и фамилию не задавая всей остальной информации. Всё, вроде больше знать ничего не нужно. Как работать с API я уже описывал в посте про граббер музыки, поэтому недолго думая получаем информацию о друзьях и пишем в файл, соблюдая формат.

Запись выглядит примерно так (я не записываю друзей, которые вообще не открыли ни одного телефонного номера):
for i in friends:
            kol=0
           tmp = i["last_name"] + ' '+ i["first_name"] + ',' + i["last_name"] + ',,' + i["first_name"] + ',,,,,,,,,,,'
           if 'bdate' in i:
               tmp += transform_birthday(i["bdate"])
           else:
            tmp += ' '
            tmp += ',,,,,,,,,,,,* My Contacts, '
            if 'domain' in i:
                tmp += '* Home,'+tmp["domain"]+','
            else:
                tmp += ',,'
            if 'home_phone' in i:
             k = transform_phone(i['home_phone'])
             if k>0:
                 tmp += 'Home,'+k+','
                     kol+=1
            else:
                tmp += ',,'  
            if 'mobile_phone' in i:
             k = transform_phone(i['mobile_phone'])
             if k>0:
                 tmp += 'Mobile,'+k+','
                     kol+=1
                 else:
                     tmp += ',,'
            tmp += ',,,,,,,,,,\n'
            if kol>0:
                f.write(tmp)    


Ccылка на скачку: https://www.dropbox.com/s/rbcq3dru12rah38/CSVexportContaks.py

понедельник, 25 июня 2012 г.

Subline text 2

Очень неплохой кроссплатформенный текстовый редактор. Уступает конечно таким гигантам как VIM или EMACS, но все же является очень неплохой штукой.


INSTALL:
Добавьте Sublime Text 2 PPA, используя следующие команды:
sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update

И затем, чтобы установить бету Sublime Text 2 beta (рекомендуется), используйте эту команду:
sudo apt-get install sublime-text-2-beta (Мы будем ставить Dev версию, смотри ниже)
Или чтобы установить dev-сборку Sublime Text 2:
sudo apt-get install sublime-text-2-dev

PACKAGE CONTROL:
Чтобы установить Sublime Package Control, откройте Sublime Text 2, нажмите ctrl+' (' - символ, рядом с 1) и вставьте это:
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

PLAGINS:
Чтобы установить плагины необходимо в Package control написать Install package. А затем уже приступить к поиску и установке.
Terminal - плагин для запуска терминала из папки, в которой находится файл. Комбинация ctrl+shift+t
Sublime Alignment - форматирование кода.
SubLimeLinter - офигенная штука. Проверка кода на ошибки, как в нотации, так и в других отношениях. PEP8 рулит :)
SublimeCodeIntel - показывает автозаполнение доступных модулей в режиме реального времени, а также информацию о текущей функции в статус баре. Ставить обязательно!
Bracket Highlighter - Подсвечивает скобки и кавычки, позволяет удобно перемещаться в коде («скачет» по основным точкам) и делает еще много полезного.
Zen coding — плагин для быстрого написания и редактирования html кода. Ядро этого плагина — мощный движок сокращений, который позволяет вам расширить короткие выражения (похожие на CSS селекторы) до HTML кода.
Djaneiro - Супорт django под Sublime Text 2


Все комбинации можно посмотреть в настройках плагинов.
Так же есть фишки как мультивыделение и другие штуки, доступные благодаря плагинам.

вторник, 19 июня 2012 г.

О фильмах

Какой фильм я считаю хорошим? Подумал об этом и сделал вывод: тот, после которого остается послевкусие, тот, что оставляет какие-то определенные чувства и эмоции, тот, после просмотра которого ты меняешься. Таких фильмов не так уж и много. Но за последнюю неделю мне посчастливилось увидеть целых два фильма, которые мне понравились. Оба они (так или иначе) показывают, что никогда не нужно сдаваться и всегда необходимо верить в лучшее. Оба дают заряд позитива и оптимизма.
Я рекомендую посмотреть их: "1+1" и "Рок на века".

P.S. Смотрите хорошие фильмы. Меняйтесь!

понедельник, 18 июня 2012 г.

Оху***ая бл*ть консоль или учим консоль давать советы и материться

Данный скрипт не несет вообще смысловой нагрузки. Мне было нечего делать, у меня вообще сосиски варились, я не виноват что я его написал и запостил сюда :)

Многие знают, что есть такой сайт http://fucking-great-advice.ru/. Собственно название говорит само за себя, так вот, озвучка некоторых цитат там просто изумительна. Недолго думая запилил скрипт, который дает советы в консоль, а если есть звук, то еще и произносит его (совет).
При написании была небольшая проблемка. Не понятно было каким образом генерится рандомная цитата. Поэтому я решил сделать в лоб -  загружаем главную страницу, там есть ссылки на различные страницы уже с рандомными цитатами, берем произвольную из этих цитат. Вуаля, дело сделано :) Ах да, не забываем распарсить все это на предмет звука, скачать звук, проиграть его, а потом удалить (чтобы не забивалась папочка лишний раз).

Получим рандомную цитату рандомных цитат:
def getRandomAdvice():
    doc=getHTML("http://fucking-great-advice.ru/")
    soup=BeautifulSoup(doc)
    x=[]
    for i in str(soup).split():
       if 'href="http://fucking-great-advice.ru/advice/' in i: 
          x.append(i)
    j=random.randint(1, len(x))
    return x[j][6:-1]

Попробуем получить звуковой файл, проиграть его и удалить :) :
def playSound(adressBase):
    j=adressBase.replace('http://fucking-great-advice.ru/advice/', '')[:-1]
    link="http://fucking-great-advice.ru/files/sounds/sound_"+str(j)+".MP3"
    try:
        subprocess.call(['wget', '-b', link])
        music_file='sound_'+str(j)+'.MP3'
        subprocess.call('reset')
        pygame.init()
        pygame.mixer.music.load(music_file)
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy(): pass
        os.remove(music_file)
    except: pass
    os.remove('wget-log')

P.S. Получилась забавная штука. Голос всё же великолепен :))

воскресенье, 17 июня 2012 г.

О скорости

Увидел такие вот тесты, невольно опять задумался о Хаскелле:
Дано: массив 16k целых чисел
Тест: 1000 раз quicksort
C (own) 0m2.528s x 1.00
C (qsort) 0m3.282s x 1.30
C++ (std) 0m3.250s x 1.28
Haskell 0m3.867s x 1.53
PHP 1m18.73s x 30
Python 1m38.55s x 38
Perl 2m53.69s x 67

пятница, 15 июня 2012 г.

Полные исходники

Кому нужны любые полные иходники - пишите (сюда или на мою страницу: http://vk.com/rapter )

Консольный граббер музыки с профиля vk.com cо свистелками и перделками

Всё-таки решил разобраться с API vk.com, да и написать под себя скрипт. Вконтакте я использую всё же больше как плеер и поисковик музыки, нежели как социальную сеть, поэтому иметь хорошую скачивалку музыки под рукой было бы очень не плохо. 

Начну с того, как же все таки работать с API. Под Python есть хорошая либа - vkontakte (ставится без проблем через pip), но просто подключение ее ничего не даст(что логично), необходимо зарегать своё приложение, как это делается написано тут: http://habrahabr.ru/post/125155/. Там вам дадут защищенный ключ и ID приложения, с помощью которых необходимо получить токен. Токен - это некоторая длинная замысловатая строка, которая необходима для получения определенных прав и свобод для работы с vk.com. Собственно получить его можно вбив в строку браузера что-то подобное: http://oauth.vk.com/authorize?client_id=ID ВАШЕГО ПРИЛОЖЕНИЯ&scope=audio(ПОЛУЧИМ ДОСТУП К АУДИО)&response_type=token, вас пошлют на страничку, в адресной строке которой можно и увидеть пресловутый токен(выглядит он примерно так: "9d791f49d29a92ea9d19f7da559d6df31e99d409d404a6dcd989bf1baa42bb3"). Всё, токен получили можно действовать. Справка по API описана тут:

Итак, что нам нужно сделать? Во первых получить всю музыку и сотворить некие функции по работе с ней. Реализуем следующие функции: 

Печать всех композий
def printAllAudio(audio):
    subprocess.call("clear")
    for i in xrange(len(audio)):
        print str(i)+" "+audio[i]["artist"]+" - "+audio[i]["title"]  

Скачка одной композиции по её номеру:
def downloadOnNumber(audio, number):
     nameFileNew=audio[number]["artist"]+" - "+audio[number]["title"]
     print "GET FILE: "+nameFileNew
     print "FILE NUMBER: "+str(number)
     subprocess.call(['wget', audio[number]["url"]])
     p=re.compile(r"[0-9a-zA-Z]+\.mp3$")
     nameFileOld=p.findall(audio[number]["url"])
     os.rename(nameFileOld[0],nameFileNew+".mp3") 

Cкачка всех композиций:
def dounloadAllFiles(audio):
    for i in xrange(len(audio)):
        downloadOnNumber(audio, i)

Скачка по названию группы:
def downloadOnArtist(audio, artist):
    kol=0
    for i in xrange(len(audio)):
        if audio[i]["artist"] in artist:
            downloadOnNumber(audio, i)
            kol+=1
    return kol  

Скачка по названию песни:
 def downloadOnComposition(audio, composition):
    kol=0
    for i in xrange(len(audio)):
        if audio[i]["title"] in composition:
            downloadOnNumber(audio, i)
            kol+=1
    return kol 

Скачка по интервалу:
def dowloadOnInterval(a, b):
   for i in xrange(a, b+1):
       downloadOnNumber(audio, i)

Как видим, достаточно широкий функционал получился :) Используем внешнюю утилиту wget, которая обладает очень красивым выхлопом. Примерно все выглядит таким образом:   
Теперь неплохо было бы все сделать в консоль-стайл, предусмотреть команды, а также слабенькую защиту от  дурачка. 
В общем тянуть не буду, все выглядит примерно так:

 audio=vk.audio.get(uid='ВАШ ID vk.com')
    count=len(audio)
    print "Введите команду: "
    command=raw_input().split()
    if command[0]=="help":
        subprocess.call("clear")
        print "Доступные команды: "
        print "grub +"
        print "-all = скачать все песни из аудио"
        print "-s = скачать песню по её названию (пробел) название песни"
        print "-ar = скачать песню по название группы(имя артиста) (пробел) имя артиста(группы):"      
        print "-print = распечатать все песни и их номер"
        print "-n = cкачать по номеру (пробел) номер песни" 
        print "-i = скачать по интрервалу (пробел) первое число (пробел) второе число" 
    elif command[0]=="grub":
        if command[1]=="-all":
            dounloadAllFiles(audio)
        elif command[1]=="-ar":  
            kol=downloadOnArtist(audio, joinOther(command))
            if kol==0: print "Нет совпадений в имени!"
        elif command[1]=="-s":
            kol=downloadOnComposition(audio, joinOther(command))
            if kol==0: print "Нет совпадений в имени!"
        elif command[1]=="-print":
            printAllAudio(audio)
        elif command[1]=="-n":
            if command[2].isdigit()==False: print "Это не числовое значение!"
            elif 1<int(command[2])<count: downloadOnNumber(audio, int(command[2]))
            else: print "Песни с таким номером нет!"
        elif command[1]=="-i":
            if command[2].isdigit()==False or command[3].isdigit()==False: print "Это не числовое значение!"
            elif int(command[2])>int(command[3]): print "Первое значение интервала должно быть меньше второго!"
            elif int(command[2])<1 or int(command[3])<1 or int(command[2])>count or int(command[3])>count: print  "Введите значения от 1 до числа композиций"
            else:  dowloadOnInterval(int(command[2]), int(command[3]))          
    else: print command[0]+"- Не, не слышал :)" 

Всё работает на ура;) Теперь можно качать любимые песни не выходя из не менее любимой консоли))

вторник, 12 июня 2012 г.

Тянем 50 первых аудиозаписей из своего профиля vk.com

Сейчас потребовалось быстренько слить несколько первых композиций с vk.com. Лень было что-то искать, решил быстренько наваять. С API не хотелось разбираться, после взгляда на код странички стало понятно, что класс c музякой выглядит следующим образом:
 
Cледовательно, распаспарсим этот класс на предмет ссылки и подадим в wget. Всё. Счастье. Жаль только что на странице только 50 первых песен, остальные видимо только с помощью API и можно вытащить.
print "Введите число первых композиций: "
    while True:
        kol=input()
        if (kol<1) or (kol>50): print "Число должно быть >1 и <51"
        else: break                   
    tmp=initVK(loginVK, passwordVK)
    html=getHTML(tmp, 'http://vk.com/audio')
    k=1
    soup=BeautifulSoup(html)
    for i in soup.findAll(True, 'play_btn'):
        if k>kol: break;
        i=str(i)
        k1=i.find("http:")
        k2=i.find("mp3")
        exitStr=i[k1:k2]+"mp3"
        subprocess.call(['wget', exitStr])
        k+=1;































Новости на мобильник или управление с e-mail. Часть третья.

Итак, функция отправки сообщений с мыла была приведена в постах ниже, поэтому смысла ее выкладывать нет. Осталось написать функцию, которая будет читать письма, находить в них команды (под командами я понимаю любую строку, которая начинается с "/", под исполняемой командой - любую строку из перечисленных в первой части.) и отправлять все эти команды на исполнение. Также я вижу смысл прокомментить некоторые строки данной функции:
def returnCommand():
    server = "pop.yandex.ru" #укажим сервер яндекса(там почта)
    port = "110"
    login = "___"
    password = "____"
    box = poplib.POP3(server, port)
    box.user(login)
    box.pass_(password)
    response, lst, octets = box.list()
    x=[] #темповый массив для команд и мусора
    for msgnum, msgsize in [i.split() for i in lst]:
    (resp, lines, octets) = box.retr(msgnum) #получаем письмо с темой, отправителем, текстом письма
    msgtext = "\n".join(lines) + "\n\n"
        message = email.message_from_string(msgtext)#получим только тело(текст) письма
    message_body = message.get_payload()
        x.append(message_body) 
        box.dele(msgnum)#удалим все пришедшие сообщения, чтобы они нас не смущали потом
    box.quit()
    command=[]
    for i in x:
        g=i.split()
        for j in g: 
           if '/' in j: command.append(j)#из темпового массива вытащим все команды
    print "Commands:"
    print command
    return command #вернем list-список команд

Ну и собственно в головном модуле будем получать list из команд, смотреть, есть ли там исполняемые команды и выполнять их:
inputInformation=returnCommand()
   outputString=''
   for inputString in inputInformation:
       kol=0
       if '/film' in inputString: outputString+='|'+getFilms(); kol=1
       if '/bash' in inputString: outputString+='|'+getRandomBashText(); kol=1
       if '/news' in inputString: outputString+='|'+getRandomNewsText(); kol=1
       if '/weather' in inputString: outputString+='|'+getRSSWeatherOne(); kol=1
       if '/anekdot' in inputString: outputString+='|'+getRandomAnekdot(); kol=1
       if kol==0: print 'Вы ошиблись с командой!'
   sendMessage(outputString, fromaddr, toaddrs, username, passwordmail)

Всё. В скором времени(решил приурочить покупку симки к покупке нового телефона) протестирую, может быть залью что-то новое :) А потом отпишусь.

понедельник, 11 июня 2012 г.

Новости на мобильник или управление с e-mail. Часть вторая.

Приступим к программной реализации. В предыдущих скриптах я уже получал RSS -ленту bash.im и погоды.  Анекдоты и новости я также получу через RSS-ленту, осталось только написать для всех этих грабберов функции возврата одной цитаты, погоды на один день, получение одного анекдота и новости соответственно. Все эти функции по-сути представляют одно и тоже, различаются лишь в парсинге HTML-тэгов, поэтому приведу лишь реализацию функций получения ленты анекдотов и получение одного анекдота.

Функция получения ленты анекдотов:
 def getRSSAnekdot(nameURL):
    d=feedparser.parse(nameURL)
    s=''
    for e in d.entries:
        s+=e.description+'\n'
    return s

Получим один анекдот:
def getRandomAnekdot():
    anekdots=getRSSAnekdot('http://www.anekdot.ru/rss/export_j.xml')
    j=random.randint(0, 9)
    k=0
    s=''
    for i in anekdots.split('\n'):
       if j==k:
          if i=='': j+=1
          else:
               s=i
               break
       k+=1        
    if '<br />' in s: s=s.replace('<br />', '')
    return s

Теперь приступим к самому интересному - получению фильмов с сайта кинотеатра. Открываем страницу http://www.cinemapark.ru/multiplexes/show/8 и смотрим разметочку... Замечаем, что каждый фильм "упакован" следующим образом:
<div class="msch_group_title">

<a href="/films/detail/13204#8">Люди в чёрном 3 IMAX 3D (приключения/фантастика, 1 ч. 46 мин.)</a>

</div>
Само-собой разумеется, данный класс тоже находится в куче тэгов. Поэтому берем библиотеку BeautifulSoup и вытаскиваем класс, затем парсим то, что находится внутри него, вытаскивая только название и вид (2d, 3d, IMAX) фильма:



def getFilms():
    doc=getHTML()
    soup = BeautifulSoup(doc)
    x=[]
    for film in soup.findAll(True, 'msch_group_title'):
         ans=''
         s=str(film).replace('<div class="msch_group_title">', '')
         s=s.replace('</a>\n</div>','')
         k=0
         for i in s:
            if i=='(': k=0
            if k!=0: ans+=i
            if i=='>': k=1  
         x.append(ans[0:-1])
    s=''
    for i in set(x):
       s+=str(i)+';'
    return s                      Всё, получение информации сделано. Осталось написать мониторинг мыла и функцию обратной отправки, сделаю это в следующий раз.


воскресенье, 10 июня 2012 г.

Новости на мобильник или управление с e-mail. Часть первая.

Скрипт номер три. Захотелось мне чего-то большего -  реализовать услугу, с помощью которой я бы мог на мобильный телефон получить некоторую информацию с интернета не выходя в интернет. Представьте: отправил смс - а тебе рассылочка фильмов с любимого кинотеатра, отправил смс - погода в удобном виде на ближайшее время. А что можно сделать в перспективе! Ведь таким образом можно и компом рулить :) В общем стал гуглить и узнал для себя новую штуку, e-mail шлюз зовется. А смысл в ней следующий - мы можем отправить смс на электронный ящик и с электронного ящика можем получить смс. Крутая приблуда, не правда ли?   Правда оказалось, что у новосибирского филиала мегафона такой услуги нет, а вот у мтс все в наличии. Ну что ж, мтс, так мтс...
Итак, как же все это сделать и что для этого надо? Во-первых, мобильный телефон, с которого будем слать сообщения и получать определенную информацию, во вторых - любимый компьютер с установленным Python'ом ))

 Заходим на сайт http://www.nsk.mts.ru/messaging/elektron_pochta/mobilepost/sms_to_e_mail/ , читаем, как все работает (кстати, каюсь, так все и не соберусь купить новую симкарту, думаю в течение месяца все точно проверю).

Определяемся с тем, что мы хотим иметь за команды. Я решил немного переделать идею про Kindle и сделал следующие: "/bash" - получить рандомную цитату с bash.im, "/film" - получение всех фильмов, которые идут сейчас в кинотеатре синемапарк в Рояль Парке (взял его, так как там есть 2d, 3d и IMAX фильмы, да и это один из самых больших кинотеатров Новосибирска), "/news" - получить случайную новость о Новосибирске, "/weather" - получить погоду в Новосибирске на ближайшее время, "/anekdot" - получить анекдот :)

О подробностях реализации расскажу в следующих постах.

пятница, 8 июня 2012 г.

Новостной граббер для Kindle 3

Итак, скрипт второй. Kindle 3 wifi+3G - воистину гиковое устройство и не только потому, что в нем есть бесплатный интернет (что даёт уже не плохие возможности), но и потому, что amazon придумал и реализовал очень интересный сервис. При покупке книги вы регистрируетесь на amazon, за вашей книгой закрепляется электронная почта блабла@kindle.com, при посылке книг на которую они(книги) преобразуются в читабельный формат (в основном *.mobi). Отсюда можем сделать вывод, что слать на адрес мы можем не только книги, но и новости, анекдоты, цитаты, твиты и многое другое. Лично мне было бы очень удобно каждое утро просматривать хабраленту, смотреть погоду и читать баш и все это с одного тычка и в автобусе(а главное - бесплатно). Сказано-сделано, код прилагается :)

Для начала необходима привязка вашей основной почты(у меня на яндексе) с почтой на http://www.amazon.com/. Можете переслать пару-тройку файликов, чтобы проверить что все работает. Кстати, вся фишка сервиса от amazon в том, что книги должны быть именно прикреплены к электронному письму, а не быть текстом внутри него. Поэтому напишем простенький скриптик, который собирает информацию с хабра, башорга и сайта с погодой, запишем все это в файл и отошлем. PROFIT!

Все три сайта имеют RSS, поэтому не будем мудрить и воспользуемся данной услугой, тем более есть замечательная библиотека под Python - feedparser.

Функция для получения тайтла RSS -новости и самой новости.
def getRSS(nameURL, tittleRSS):
    d=feedparser.parse(nameURL)
    s=tittleRSS+"\n"
    for e in d.entries:
        s+=e.title.upper()+"\n\n"+e.description+"\n\n"
    return s 

Тупая функция парсинга bash.im, удаляем теги, которые присутсвуют внутри текста:
def parseBash(Bash):
    tmp=''
    answerstr=''
    for i in Bash.split(' '):
        flag=0
        if '<br' in i:
           tmp=i.replace('<br', '\n')
           flag=1
        if '/>' in i:
           tmp=i.replace('/>', '')
           flag=1
        if '&quot;' in i:
           tmp=i.replace('&quot;', '')
           flag=1
        if '/><br' in i:
           tmp=i.replace('/><br', '')
           flag=1 
        if flag==0: tmp=i
        answerstr+=tmp+' '
    return answerstr

Функция парсинга для хабра аналогична, только теги немного другие, поэтому приводить фрагмент не буду, исходник будет прикреплен позже.

Функция компановки файла и отправки с вашего основного ящика на ящик блабла@kindle.com:

def sendMessage(fromaddr, toaddrs, username, passwordmail):
    import smtplib
    import mimetypes
    from email.mime.multipart import MIMEMultipart
    from email.mime.application import MIMEApplication
    COMMASPACE = ', '
    path = 'dailyInfo.txt'
    msg = MIMEMultipart()
    msg['Subject'] = str(datetime.datetime.now())
    msg['From'] = fromaddr
    msg['To'] = COMMASPACE.join (toaddrs)
    msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

    attach = MIMEApplication (open(path, 'rb').read())
    attach.add_header ('Content-Disposition', 'attachment', filename=path)
    msg.attach (attach)
    server = smtplib.SMTP('smtp.yandex.ru:587')
    server.starttls()
    server.login(username,passwordmail)
    server.sendmail(fromaddr, toaddrs, msg.as_string())
    server.quit()
 
Ну и собственно код функции main():
         nameURLNews='http://habrahabr.ru/rss/hubs/' 
         nameURLBash='http://bash.im/rss/'
         nameURLWeather='http://rp5.ru/rss/6036/ru'
         fromaddr="_____" # адрес основной почты
         toaddrs="_____@kindle.com"#киндловской
         username="____" #логин от основного ящика
         passwordmail="_____"#пароль для основного ящика
         weather=getRSS(nameURLWeather, '---------WEATHER--------')
         habr=getRSS(nameURLNews, '---------NEWS--------')
         bash=getRSS(nameURLBash, '---------BASH.IM--------\n')
         outputInfo=weather+parseHabr(habr)+parseBash(bash)
         f=codecs.open('dailyInfo.txt', 'w', encoding='utf-8')
         f.write(outputInfo)
         sendMessage(fromaddr, toaddrs, username, passwordmail)
        
Вот и все, осталось написать небольшого демона, который будет в определенное время делать рассылку и все.
Кстати, кто хочет присоединится к моей небольшой рассылке, вы можете указать мою электронную почту rapter2006@ya.ru в списке доступных адресов для вашего KIndle на сайте amazon, и к вам будут приходить новые новости. Удачи :)

четверг, 7 июня 2012 г.

Скрипт, отлавливающий изменения на странице вконтакте

Первый скриптик самый простой. Некоторые группы вконтакте или конкретные люди могут организовывать розыгрыши призов. Они выкладывают сообщение -  вы должны быстренько среагировать на него и что-то получить :) Или же немного другая ситуация - вы очень ждете новых постов вашего друга, и вам бы очень хотелось, чтобы если что-то изменилось на его стене, вам пришло письмо на электронную почту.
Собственно скрипт этим и занимается, при изменении страницы друга(или группы) он отсылает, что она изменена, и шлет оповещение на почту. Как вы понимаете, потом это сообщение можно послать на мобильник или на другой электронный носитель, чем мы и займемся в следующий раз, а сейчас скрипт в студию:


Функция отправки сообщения.
 def sendMessage(text, fromaddr, toaddrs, username, passwordmail):
        if len(text) == 0:
                print "Empty message"
                return
        import smtplib
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        msg = MIMEMultipart('alternative')
        msg['Subject'] = "Vkontake_Frend"
        msg['From'] = fromaddr
        msg['To'] = toaddrs

        mime_text = MIMEText(text, 'plain', 'utf-8')
        msg.attach(mime_text)
        server = smtplib.SMTP('smtp.yandex.ru:587')#ПОРТ ЯНДЕКСА
        server.starttls()
        server.login(username,passwordmail)
        server.sendmail(fromaddr, toaddrs, msg.as_string())
        server.quit()

 Инициализация вконтакте (вы должны понимать, что при попытке получения страницы друга/группы без регистрации, получите лишь страницу привествия, что не радует). Используем библиотеку mechanize, которая замечательно работает с куками.
def initVK():
    br = mechanize.Browser()
    cj = cookielib.LWPCookieJar()
    br.set_cookiejar(cj)
    br.set_handle_equiv(True)
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
    br.open('http://vk.com')
    br.select_form(nr=0)
    br.form['email'] = "___" #ваш е-mail
    br.form['pass'] = "___"#ваш пароль
    br.submit()
    return br

Получение кода html-странички:
def getHTML(br, stranica):
    br.open(stranica)
    html = br.response().read()
    return html

А теперь собственно сам быдло-код проверки новых сообщений:
tek=[]
    pred=[]
    j=0
    kk=initVK()
    while True:
        a=getHTML(kk, '____')#сюда вносим адрес друга/группы
        a=list(a.split('\n'))
               for i in a:
           if ('<div class="wall_text"><a class="author" href="/____">' in i) : #во href вносим имя пользователя вконтакте, href="/rapter"
           tek.append(i)
           if j==0:
                pred=tek[:]
                j=1  
           else:
             if tek!=pred:
                 print "Были изменения!"
                 pred=tek[:]
                 sendMessage("Были изменения!", fromaddr, toaddrs, username, passwordmail)
             else: print "Изменений не было!"
        tek=[]
        time.sleep(60)      
 К слову сказать, здесь используется smtp сервер яндекса, но никто не запрещает использовать вам любой другой - гуглите.

Вот собственно и все, удачных доработок :) 

Небольшие скрипты

Объявляю месяц дурацких, но иногда пригождающихся скриптов.
Ищу небольшие идейки маленьких приложений, которые бы вы хотели иметь в повсеместном пользовании (новостные грабберы, расчеты маршрутов автобуса и тд и тп), но не нашли реализацию.
Для разогрева отпишусь о своих 3х скриптиках, которые мне так или иначе пригодились(пригождаются) в жизни.

Здрасьте

Привет всем! Решил еще раз попробовать вести блог. Первый загнулся даже не начавшись, сейчас же попытаюсь сделать что-то более-менее вразумительное. Так что буду строчить по мере возможности :)