Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
104-155.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
122.82 Кб
Скачать

Poplib модулі

Тағыда бір хаттама - POP3 (Post Office Protocol, почталық хаттама) – серверде почталық жәшіктен почта қабылдау үшін қызмет етеді (хаттама RFC 1725 анықталған).

Почталық сервермен жұмыс істеу үшін олармен байланыс орнату керек және, жоғарыда қаралған мысал тәрізді, SMTP-командасының көмегімен талап етілген хабарламаларды алу. POP3 байланыс обьектісімен poplib модуліндегі POP3 конструктор классы арқылы орнатуға болады:

poplib.POP3(host[, port])

Мұндағы host - POP3-серверінің адресі, port - сервердегі порт (үнсіз келісім бойынша 110), pop_obj- POP3-серверімен жұмыс сеансын басқару үшін обьекті.

Келесі мысал POP3-байланысымен жұмыс істеу үшін негізгі әдістерді көрсетеді.

import poplib, email

# Қолданушының есептiк деректерi:

SERVER = "pop.server.com"

USERNAME = "user"

USERPASSWORD = "secretword"

p = poplib.POP3(SERVER)

print p.getwelcome()

# бiрдейлендiрудiң кезеңi

print p.user(USERNAME)

print p.pass_(USERPASSWORD)

# транзакциялау кезеңі

response, lst, octets = p.list()

print response

for msgnum, msgsize in [i.split() for i in lst]:

print "Сообщение %(msgnum)s имеет длину %(msgsize)s" % vars()

print "UIDL =", p.uidl(int(msgnum)).split()[2]

if int(msgsize) > 32000:

(resp, lines, octets) = p.top(msgnum, 0)

else:

(resp, lines, octets) = p.retr(msgnum)

msgtxt = "\n".join(lines)+"\n\n"

msg = email.message_from_string(msgtxt)

print "* От: %(from)s\n* Кому: %(to)s\n* Тема: %(subject)s\n" % msg

# msg содержит заголовки сообщения или все сообщение (если оно небольшое)

# этап обновления

print p.quit()

Ескерту:

Әлбетте, мысал нақты істеу үшін нақты есептік деректерді енгізу керек.

Сценарий орындалу кезде экранға келесідей шығарады:

+OK POP3 pop.server.com server ready

+OK User name accepted, password please

+OK Mailbox open, 68 messages

+OK Mailbox scan listing follows

Сообщение 1 имеет длину 4202

UIDL = 4152a47e00000004

* От: online@kaspersky.com

* Кому: user@server.com

* Тема: KL Online Activation

...

+OK Sayonara

Осы және басқа POP3 классының көшірмелерінің әдістері төменде сипатталған:

Әдіс

POP3 командасы

сипатталуы

getwelcome()

POP3-сервері бойынша s жолын алады.

user(name)

USER

name

name қолданушы атымен көрсетілген USER командасын жібереді.

pass_(pwd)

PASS pwd

PASS командасында қолданушы кілттік сөзін жібереді. Осы командадан кейін және QUIT командасының орындалуына дейін почталық жәшік бұғатталады.

apop(user,

secret)

APOP user

secret

APOP бойынша серверде идентификациялау.

rpop(user)

RPOP user

RPOP әдісі бойынша идентификациялау

stat()

STAT

Пошта жәшiгi туралы ақпаратпен кортежді қайтарады. Мұндағы m – хабарлама саны, l – байт бойынша почта жәшігінің өлшемі.

list([num])

LIST [num]

(resp, ['num octets', ...]) форматтағы хабарлама тізімін қайтарады, егер num, и "+OK num octets" көрсетілмесе, егер көрсетілсе.

retr(num)

RETR num

Серверден num нөмерімен берілген хабарламаны жүктейді және (resp, lst, octets) серверінің жауабымен берілген кортежді қайтарады

dele(num)

DELE num

Num нөмерімен берілген хабарламаны өшіреді

rset()

RSET

Хабарламаны өшіру белгілерін болдырмайды.

noop()

NOOP

Ештене істемейді (байланысуды қолдайды)

quit()

QUIT

Серверден өшірілу. Сервер барлық қажетті өзгертулерді орындайды (хабарламаны өшіреді) және почталық жәшіктің құлыптамасын шешеді.

top(num,

lines)

TOP num

lines

Команда RETR-ге ұқсас, бірақ тек тақырыпшаны және хабарлама денесінің lines жолын жүктейді. Кортежді (resp, lst,

octets) қайтарады.

uidl([num])

UIDL

[num]

"unique-id listing"-тан қысқартылған (хабралама индификаторларының бірегей тізімі). Нәтиже форматы: (resp, lst, octets), егер num көрсетілмесе, және "+OK num uniqid", егер көрсетілсе. Lst тізімі "+OK num uniqid" түріндегі жолдардан тұрады.

Бұл кестеде num хабарлама нөмерін білдіреді (ол барлық сессия аралығында өзгертілмейді), resp – сервер жауабы, кез келген команда үшін қайтарылады, нәтижелі операциялар үшін “+OK”-тан басталады (сәтсіздік кезінде poplib.proto_error ерекше жағдайы туындайды). Octets параметрі қабылданған мәліметтердің байттар санын білдіреді. uniqid – сервермен жинақталған хабарлама идентификаторы.

POP3-сервермен жұмыс үш кезеңнен тұрады: идентификация, транзакция және жаңарту. Идентификация кезеңінде, POP3-объектсін құрғаннан кейін бірден, тек USER, PASS (иногда APOP и RPOP) командалары рұқсат етілген. Идентификациядан кейін сервер қолданушы жайлы мәліметті алады және транзакция кезеңі басталады. Бұнда қалған командалар орналастырылған. Жаңарту кезеңі QUIT командасымен шақырылады, солан кейінгі POP3-сервер берілген командалармен қолданушының почталық жәшігін жаңартады, яғни хабарламаны өшіру үшін белгіленгендерді өшіреді.

WWW клиенттері үшін модулдер

Python тілінің стандартты құрылғылары бағдарламалардан WWW обьектісіне қарапайым жағдайдағыдай, сондай-ақ қиын жағдайлардада қолжетімділік алуға мүмкіндік береді, көбінесе формалардың мәліметтері, идентификация, прокси арқылы қолдетімділікті жіберу қажеттілігінде және т.б.

Ескере кететіні, WWW-пен жұмыс кезінде негізінен HTTP хаттамасы қолданылады, бірақ WWW тек қана HTTP-ді қамтымайды сондай-ақ басқа схемаладыда қамтиды (FTP, gopher, HTTPS және т.б.). Қолданылған схема әдетте URL ең басында көрсетілген.

Желілік обьектілерді жүктеудің функциялары

Белгілі URL бойынша WWW-объектісінің қарапайым жағдайы келесі мысалда көрсетілген.

import urllib

doc = urllib.urlopen("http://python.onego.ru").read()

print doc[:40]

urllib.urlopen() функциясы read() әдісімен оқитын, файлтәрізді обьект құрады. Осы обьектің басқа әдістері: readline(), readlines(), fileno(), close() әдеттегі файл бойынша жұмыс істейді, сондай-ақ Message-объект серверінен алынғанмен сәйкестерді қайтаратын info() әдісі бар. Бұл обьектіні қосымша мәлімет алу үшін қолдануға болады:

>>> import urllib

>>> f = urllib.urlopen("http://python.onego.ru")

>>> print f.info()

Date: Sat, 25 Dec 2004 19:46:11 GMT

Server: Apache/1.3.29 (Unix) PHP/4.3.10

Content-Type: text/html; charset=windows-1251

Content-Length: 4291

>>> print f.info()['Content-Type']

text/html; charset=windows-1251

urllib.urlopen() функциясы көмегімен күрделілек заттарды істеуге болады, мысалы, web-серверге форма мәлімметтерін жіберу. Белгілі болғандай, web-формалардың толтырылған мәліметтері web-серверге GET әдісін немесе POST әдісін қолдануымен жіберілуі мүмкін. GET әдісі URL-дегі "?" белгісінен кейін барлық жіберілген параметрлернің кодталуымен байланысты, ал POST әдісінің жағдайында мәліметтер HTTP-сұрауының денесінде жіберіледі. Жіберудің екі нұсқасы төменде келтірілген:

import urllib

data = {"search": "Python"}

enc_data = urllib.urlencode(data)

# метод GET

f = urllib.urlopen("http://searchengine.com/search" + "?" + enc_data)

print f.read()

# метод POST

f = urllib.urlopen("http://searchengine.com/search", enc_data)

print f.read()

Кейбір жағдайларда мәліметтер қайталаныатын аттарға ие. Бұл жағдайда urllib.urlencode() параметірі ретінде сөздік орнына ат-мән жұбының тізбектілігін қолдануға болады:

>>> import urllib

>>> data = [("n", "1"), ("n", "3"), ("n", "4"), ("button", "Привет"),]

>>> enc_data = urllib.urlencode(data)

>>> print enc_data

n=1&n=3&n=4&button=%F0%D2%C9%D7%C5%D4

urllib модулі прокси-сервер арқылы веб-обьектілерді жүктеуге мүмкіндік береді. Егер ештене көрсетпесек,нақты ОЖ тәсілі қабылдануымен берілген прокси-сервер қолданылады. Unix-те прокси-сервер http_proxy, ftp_proxy және т.б. айнымалы арасында беріледі. Windows-та прокси-серверлер реестрде жазылған, ал Mac OS-та олар Internet конфигурациясынан алынады. Прокси-серверді proxies к urllib.urlopen() атты параметр сияқты беруге болады.

# Использовать указанный прокси

proxies = proxies={'http': 'http://www.proxy.com:3128'}

f = urllib.urlopen(some_url, proxies=proxies)

# Не использовать прокси

f = urllib.urlopen(some_url, proxies={})

# Использовать прокси по умолчанию

f = urllib.urlopen(some_url, proxies=None)

f = urllib.urlopen(some_url)

urlretrieve() функциясы берілген URL желілік обьектісін файлда жазуға мүмкіндік береді. Ол келесідей параметрлерге ие:

urllib.urlretrieve(url[, filename[, reporthook[, data]]])

Мұндағы url-желілік обьектінің URL-і, filename- обьекті сыйдыру үшін локальды файл аты, reporthook- жүктеме күйі жайлы хабарлама үшін шақырылатын функия, data-POST ( егер ол қолданылса) әдісі үшін мәліметтер. Функция (filepath, headers) кортежді қайтарады, мұндағы filepath – локальды файл аты.

urllib.urlretrieve() функциясының интерактивтілігін қамтамасыз ету үшін reporthook() берілген функциясын уақыт өте келе шақырады. Бұл функцияда үш аргумент жіберіледі:қабылданған блоктар саны, өлшемі, блоктың және байттағы (бұл параметр -1-ге тең, егер ол белгілі болса) қабылданған жалпы өлшемі.

Келесі мысалда бағдарлама үлкен файл қабылдайды.

FILE = 'boost-1.31.0-9.src.rpm'

URL = 'http://download.fedora.redhat.com/pub/fedora/linux/core/3/SRPMS/' + FILE

def download(url, file):

import urllib, time

start_t = time.time()

def progress(bl, blsize, size):

dldsize = min(bl*blsize, size)

if size != -1:

p = float(dldsize) / size

try:

elapsed = time.time() - start_t

est_t = elapsed / p - elapsed

except:

est_t = 0

print "%6.2f %% %6.0f s %6.0f s %6i / %-6i bytes" % (

p*100, elapsed, est_t, dldsize, size)

else:

print "%6i / %-6i bytes" % (dldsize, size)

urllib.urlretrieve(URL, FILE, progress)

download(URL, FILE)

Бұл бағдарлама келесідей шығарады

0.00 % 1 s 0 s 0 / 6952309 bytes

0.12 % 5 s 3941 s 8192 / 6952309 bytes

0.24 % 7 s 3132 s 16384 / 6952309 bytes

0.35 % 10 s 2864 s 24576 / 6952309 bytes

0.47 % 12 s 2631 s 32768 / 6952309 bytes

0.59 % 15 s 2570 s 40960 / 6952309 bytes

0.71 % 18 s 2526 s 49152 / 6952309 bytes

0.82 % 20 s 2441 s 57344 / 6952309 bytes

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]