Twitter хакнули!

18 декабря 2009 15 комментариев

Сегодня с “радостью” обнаружил дефейс главной страницы популярного сервиса twitter.com

twitter дефейс

Categories: Мои новости Tags: ,

Python: Простой пример использования twisted

Надо мне написать небольшой сервер, который будет принимать некие данные, сохранять их, а потом по определеным командам отдавать. Сейчас есть нечто такое же, только реализованное на LAMP, работает прямо скажем не очень быстро. Можно конечно сделать какое-то кеширование, memcache и т.д., но мне не хватает свободы маневра в текущей структуре, поэтому я решил таки переписать серверную часть, ибо клиентская вполне себе меня удовлетворяет.

Вообще решил сделать отдельный сервис, висящий на отличном от 80 порту и выполняющий все что мне надо. Писать решил с использование сетевого фреймворка twisted. Штука прикольная, но вот незадача, нормальной документации и примеров как то нету, того что на их сайте есть, мне явно не хватает, для того чтобы понять как и что нужно делать. Поэтому решил для начала написать простенький примерчик, который будет висеть и слушать запросы и в зависимости от url увеличивать или уменьшать внутренний счетчик.

Вот что получилось:

       1:  # To change this template, choose Tools | Templates
       2:  # and open the template in the editor.
       3:   
       4:  __author__="mrdaark"
       5:  __date__ ="$15.07.2009 21:31:01$"
       6:   
       7:  from twisted.web import server, resource
       8:  from twisted.internet import reactor
       9:  import string
      10:   
      11:  class Consult():
      12:      count=0
      13:   
      14:      def add(self,x=1):
      15:          self.__class__.count+=x
      16:   
      17:      def remove(self,x=1):
      18:          self.__class__.count-=x
      19:   
      20:  class Server(resource.Resource):
      21:      isLeaf = True
      22:   
      23:      def getChild(self, name, request):
      24:          if name == '':
      25:              return self
      26:          return Resource.getChild(self, name, request)
      27:   
      28:      def render(self, request):
      29:          urlpath=string.split(request.path[1:],'/')
      30:          path=urlpath[0]
      31:          if len(urlpath)>1:
      32:              r=int(urlpath[1])
      33:          else:
      34:              r=1
      35:   
      36:          str='<html><head></head><body>'
      37:   
      38:          c=Consult()
      39:          if (path=='add'):
      40:              c.add(r)  
      41:          elif (path=='remove'):
      42:              c.remove(r)
      43:   
      44:          str+= "x: %d<br />" % (c.count)
      45:   
      46:          str+='<a href="/add/1">add 1</a><br /><a href="/remove/1">remove 1</a></body></html>'
      47:          return str
      48:   
      49:  def main():
      50:      site = server.Site(Server())
      51:      reactor.listenTCP(8080, site)
      52:      reactor.run()
      53:   
      54:  if __name__ == "__main__":
      55:      main() 

Штука запускается, вешается на 8080 порт и принимает http запросы. Увеличивает и уменьшает внутренний счетчик в зависимости о второго параметра в урл, т.е. формат урл таков: /<функция>/<параметр>. По-умолчанию, параметр равен единице.

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

IT-карма: Я почти бог :)

16 июля 2009 14 комментариев

Прикольно так, хотя я не знал ответов на как минимум 3 вопроса :)

Categories: Мои новости Tags:

Он издевается!

1 июля 2009 6 комментариев

Сейчас дир приволок денежку за мою подработку. Я честно мерзко хихикал когда он ушел.

Мало того что денег там кот наплакал, так видимо чтобы мне казалось что денег дофига, он выдал мне 610 рублей десятками!

Это 61 (шестьдесят одна) бумажка!

Стопка денег

Стопка денег

Не хилая такая стопка денежков, только куда ее девать теперь :)

Python: RSS to Twitter

29 июня 2009 2 комментария

С недели 2 назад для одного хитрого сайта понадобилось сделать автоматический репост статей в твиттер. Решил не писать на php, а попробовать на python’е наваять. Откровенного говоря очень понравилось! Получилось очень просто и легко.

Написал наверное за пол часа, что с учетом того, что python я вообщем то не знаю совсем не плохо.

  1. #!/usr/local/bin/python
  2. # -*- coding: utf8 -*-
  3.  
  4. import urllib
  5. import libxml2
  6. import pickle
  7. import twitter
  8. import os
  9. from time import sleep
  10.  
  11. bit_api="bit.ly.api"
  12. bit_login="bit.ly.login"
  13. twit_login="name"
  14. twit_pass="pass"
  15. rss_url="http://feed"
  16.  
  17.  
  18. def shorten_url(long_url, login_user, api_key):
  19.     try:
  20.         longUrl = urllib.urlencode(dict(longUrl=long_url))
  21.         login = urllib.urlencode(dict(login=login_user))
  22.         apiKey = urllib.urlencode(dict(apiKey=api_key))
  23.  
  24.         encodedurl="http://api.bit.ly/shorten?version=2.0.1&%s&%s&%s" % (longUrl, login, apiKey)
  25.  
  26.         request = urllib.urlopen(encodedurl)
  27.         responde = request.read()
  28.         request.close()
  29.         responde_dict = eval(responde)
  30.         short_url = responde_dict["results"][long_url]["shortUrl"]
  31.         return short_url
  32.     except IOError, e:
  33.         raise "urllib error "
  34.  
  35.  
  36. if __name__ == '__main__':
  37.     doc = libxml2.parseFile(rss_url)
  38.     links=[]
  39.     for item in doc.xpathEval('//channel/item/link'):
  40.         links.append(item.content)
  41.  
  42.     titles=[]
  43.     for item in doc.xpathEval('//channel/item/title'):
  44.         titles.append(item.content)
  45.  
  46.     rss_path = os.path.join(os.path.dirname(__file__), 'rss.db')
  47.     file = open (rss_path)
  48.     old_links=pickle.load(file)
  49.     file.close()
  50.  
  51.     items=[]
  52.     f=0
  53.     for x in xrange(0,len(links)):
  54.         for old in old_links:
  55.             f=0
  56.             if (old==links[x]):
  57.                 f=1
  58.                 break
  59.         if (f==0):
  60.             items.append(x)
  61.  
  62.     api = twitter.Api(username=twit_login, password=twit_pass)
  63.  
  64.     for x in items:
  65.         title=titles[x].decode("utf8")
  66.         if len(title)<=120:
  67.             print "link %s: %s" % (x,links[x])
  68.             if x!=0:
  69.                 sleep(15)
  70.             api.PostUpdate(title+" "+shorten_url(links[x], bit_login, bit_api))
  71.  
  72.     file=open(rss_path,"w")
  73.     ser=pickle.dump(links,file)
  74.     file.close()
  75.  

Какие трудности вылезли в процессе:

1. Нужно как-то было не постить то что уже отправлено. Решилось сохранением списка ссылок в сериализованном виде в файл

2. Размер сообщение в твиттере не больше 140 символов, а надо бы в твитты еще и ссылки на статьи вставлять, притом что заголовки у статей я бы сказал не маленькие. Решилось регистрацией на bit.ly (сервис укорачивания ссылок) и собственно укорачивание. Не помню уже сам написал или с сайта их взял функцию, ибо там все так просто что даже неинтересно.

3. Невероятно, но встала проблема с кодировкой. Решилось за 5 минут гугления и пробования нескольких комбинаций. Что-то не понимал я откуда куда функции перекодируют. Вобщем вот так надо

title.decode(”utf8″)

4. Ну и задержку пришлось поставить, иначе bit.ly говорило зайдите позже :)

Дальше все это безобразие запихал в крон:

*/12 * * * * /usr/local/bin/python /usr/local/www/rss2twitter/rss2twit.py

За время пока это дело работает, уже сделан репост 1256 твиттов, так что красота.

А вообще все очень просто и легко, особенно учитывая что twitter api уже написано. хотя если бы его небыло, думаю я бы просто логинился, сохранял куки и постил обычным POST запросом.

Ну и файлик со скриптом на последок: rss2twit.tar.gz

З.Ы. с удовольствием выслушаю критику, потому как первое не Hello, world! приложение на python’е. :)

Хозяйке на заметку: замечания детям от посторонних

27 июня 2009 4 комментария

На баше вычитал, надо будет попробовать

Моему ребенку делают замечания посторонние люди! Как реагировать?
Обучите ребенка волшебному заклинанию: “Меня мама учит, что не всякое оценочное суждение должно служить модификатором поведения”. Будучи произнесено с четкой дикцией и доброжелательно-уверенной интонацией оно действует аналогично заклинанию: “Окаменей!”, причем более надежно, хотя и ненадолго, и без опасных побочных эффектов.

Думаю действительно сработает :)

Монтирование флешки под FreeBSD

1 июня 2009 2 комментария

Заколебался каждый раз вспоминать как монтировать флешки под фрей, решил записать:

mount_msdosfs -Lru_RU.KOI8-R /dev/da0s1 /mnt/flash

Яндекс vs Google или устами младенца…

10 мая 2009 3 комментария

Сейчас мелкий (8 месяцев) сидел и колошматил рученками по клавиатуре ноутбука и водил пальчиками по тачпаду, я чтоб время зря не пропадало, решил показать ему картинки в яндексе, набрал куку, и показал как искать. Мелкий посмотрел, 10 секунд активно колошматил по клавиатуре, и вуаля, тот же запрос в гугел.картинках!!!

вот такие пироги :) ))

Ubuntu на Asus X55SV и звук в наушники

Давеча (месяц уже) поставил убунту на бук, вроде все было нормально, но тут обнаружился странный косяк, при подключении наушников нифига не отключали встроенные колонки, что прямо скажем не комильфо.

Немного порыскав в интернете, нашел решение. Нужно в файлик/etc/modprobe.d/alsa-base.conf добавить строчечку:

options snd-hda-intel model=lenovo-ms7195-dig

после чего перезагрузился и все заработало :)

PS. как вариант предлагалась еще вот такая строчка:

options snd-hda-intel model=3stack-6ch

PPS. пользуясь случаем попиарю блог товарища seo-оптимизатора, мне пофик, а ему приятно буит :)

Перевед rss feed блога на feedburner

Собственно сабж, долго подбирал пароль к старому аккаунту feedburner, чтобы перенести свои фиды в аккаунт на гугле (для меня было откровением, что теперь фидбернер под крылом гугла, продались чтоль?), в итоге подобрал, перенес.

Раньше фид ссылался на блог на блоггере, а теперь собственно ссылается на этот блог.

Редирект фида на сайте сдела с помощью вот этого плагина: http://wordpress.org/extend/plugins/feedburner-plugin/, не смотря на то что был рекомендован другой, ну не заладилось что-то с ним, или я чего-то не понял или не работает оно, хотя сделал все по инструкции.

Вообщем кто не понял, теперь адрес фида вот такой: http://feeds.feedburner.com/mrdaark :)

Пользуйтесь на здоровье. :)