четверг, 22 сентября 2011 г.

Декодировка писем.

Узнал на форуме модуль для декодировки MIME. Когда в письме, которое мы тянем скриптом с какого-либо ящика, находится вот такая абракадабра:
=80=D0=BE=D0=B2=D0=B0=D0=BB=D0=B8 =D1=83=D1=87=D1=91=D1=82=D0=BD=D1=83=D1=
=8E =D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C =D0=B2 =D0=A2=D0=B2=D0=B8=D1=82=D1=

 нужно использовать модуль quopri

import quopri
s = '''=D0=95=D1=81=D0=BB=D0=B8 =D0=B2=D1=8B =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=
=D0=BB=D0=B8 =D1=8D=D1=82=D0=BE =D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=
=D0=B8=D0=B5 =D0=BF=D0=BE =D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B5, =D0=B8 =D0=
=B2=D1=8B =D0=BD=D0=B5 =D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=
=80=D0=BE=D0=B2=D0=B0=D0=BB=D0=B8 =D1=83=D1=87=D1=91=D1=82=D0=BD=D1=83=D1=
=8E =D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8C =D0=B2 =D0=A2=D0=B2=D0=B8=D1=82=D1=
=82=D0=B5=D1=80=D0=B5, =D0=BF=D1=80=D0=BE=D0=B9=D0=B4=D0=B8=D1=82=D0=B5 =D0=
=BF=D0=BE =D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B5:
http://twitter.com/account/not_my_account/sdfaasdfldfjlas/65558-5ED38-131=
666'''
print quopri.decodestring(s).decode('utf8')

Получаем:
Если вы получили это сообщение по ошибке, и вы не регистрировали учётную запись в Твиттере, пройдите по ссылке:
http://twitter.com/account/not_my_account/sdfaasdfldfjlas/65558-5ED38-131666

Еще письмо может быть закодировано в base64. Среди стандартных модулей Python есть один для работы с этой кодировкой:

import base64
body = base64.b64decode(body)

четверг, 25 августа 2011 г.

Использование TOR'а в pycurl

Писать много неохота. Поэтому коротенечко: нужно установить Vidalia Bundle. Затем модуль для Python - TorCtl. Затем проксей курлу указываем 127.0.0.1:9050 с типом Socks5. Всё, таким образом мы лазим серферим через какую-то проксю тора. Для смены этой прокси нам надо приконнектиться к тору и сбросить соединение с помощью модуля TorCtl.

conn = TorCtl.connect()
conn.sendAndRecv('signal newnym\r\n')

суббота, 21 мая 2011 г.

Динамический импорт модуля.

Нужно было реализовать что-то типа плагинов: есть скрипт, представляющий из себя основу, и набор модулей для этой основы, для разных сервисов. То есть появился новый сервис - написал модуль, закинул в папку к скрипту - всё работает. Делается это довольно просто с помощью функции __import__:


module = "common_module" // название файла модуля
dyn_module = __import__(module)
Class = dyn_module.Dyn_Class // Dyn_Class - класс из модуля

суббота, 19 марта 2011 г.

Segmentation fault при использовании pycurl в Linux.

Написал клиенту простейший скрипт с использованием pycurl (я его всегда, кстати, использую), который состоит буквально из одного get-запроса, а при использовании этого скрипта под Linux, начала периодически валиться ошибка Segmentation fault и обрывать работу скрипта. Как выяснилось надо было вставить следующий кусочек кода, чтобы этого не происходило:

import sys
import pycurl

try:
import signal
from signal import SIGPIPE, SIG_IGN
signal.signal(signal.SIGPIPE, signal.SIG_IGN)
except ImportError:
pass

Пока не пробовал, но чтобы не забыть решил записать.

воскресенье, 13 марта 2011 г.

Использование __setattr_.

Очень часто использую файл настроек для скрипта посредством модуля ConfigParser. И как-то немножко поднадоело писать в несколько строк каждый раз:

key = config.get("Basic","Key")
ns1 = config.get("Domains","NS1")
ns2 = config.get("Domains","NS2")


Короче, захотел я, чтобы доступ к настройкам выглядел примерно так: ns1 = config.Domains['ns1'], когда надо обратился к ней, вне зависимости от того, сколько настроек в файле. Самая хитрость - это сделать свойством класса секцию файла настроек. Именно для этого нужна функция __setattr__. Вот так у меня всё в итоге получилось:

class ConfigDict(object):
def __init__(self,path):
config = ConfigParser.RawConfigParser()
config.read(path)
for section in config.sections():
dct = {}
for option in config.options(section):
dct[option] = config.get(section,option)
self.__setattr__(section,dct)


Используется это вот так:


def main():
conf = ConfigDict("settings.cfg")
threads = conf.Basic['threads']
ns1 = conf.Domains['ns1']
if __name__ == '__main__':
main()

Ну и сам файл настроек settings.cfg:

[Basic]
THREADS = 1 ; потоки
[Domains]
NS1 = ns1.0adz.com

воскресенье, 14 ноября 2010 г.

Работаем с ftp через curl.

Подробной статьи для чайников я не нагуглил, даже на php, а ftp-uploader написать было необходимо. Поэтому приведу куски кода, которые мне помогли. Во-первых, нам надо залогиниться, юзаем опцию:

# userpwd = "login:parol"
curl.setopt(pycurl.USERPWD,userpwd)

Во-вторых нам надо заливать файлы, делается это так:

size = os.path.getsize(path)
fp = open(path,"rb")
# url = ftp://ftp.host.com/directory/file.txt
curl.setopt(pycurl.URL,url)
curl.setopt(pycurl.UPLOAD,1)
curl.setopt(pycurl.INFILE,fp)
curl.setopt(pycurl.INFILESIZE,size)
curl.perform()

В-третьих, нам надо создавать папки, а для этого нужно юзать команды ftp. Делается это так:

quote = "MKD {0}".format(folder)
curl.setopt(pycurl.URL,host)
curl.setopt(pycurl.POSTQUOTE,[quote])
curl.setopt(pycurl.UPLOAD,0)
curl.perform()

Пока всё, этого мне хватило, чтобы написать uploader. Пришлось немного попариться при создании вложенных папок, но вроде всё работает=) Прокси юзать также как и для http.

пятница, 6 августа 2010 г.

Переход на python 2.7?

На форуме дали ссылку на популярные модули для Питона, причем как для 2.6, так и 2.7. Все модули в виде exe-файлов, не надо набирать в консоли setup.py install и тому подобное. Сама ссылка очень порадовала, все необходимые мне модули там есть: pycurl, mechanize(ClientForm), Pil, и т.д.; и заставила задуматься о переходе на версию 2.7.