Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2019 11:44:55

Nord99
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

Всем доброго времени суток, большая просьба - помогите пожалуйста переделать скрипт написанный под Python 2.7 в Python 3.7, сам я в питоне еще чуть больше чем ноль, мануалы есть но изучать долго,
у меня для работы есть готовый скрипт на Python 2.7 но старовата уже эта версия, т.к. Python изучать все равно буду но позже так что уже сейчас лучше поставлю Python 3.7 и буду постепенно изучать его
зачем мне регрессировать до 2.7, а этот скрипт написан под 2.7 и в 3.7 работать отказывается а он нужен уже сейчас и срочно помогите пожалуйста его переделать, думаю для профессионалов это будет быстро вот такой вот скрипт:


 import mmap 
import struct 
import win32event 
import time 
import smtplib 
import sys 
 
def ControllerStart(Filter = "Tag", TimeOut = 60): 
    #Создаем объект события готовности буфера для получения отладочных сообщений 
    buffer_ready = win32event.CreateEvent(None, 0, 0, "DBWIN_BUFFER_READY") 
    #Создаем объект события получения данных отладочного сообщения 
    data_ready = win32event.CreateEvent(None, 0, 0, "DBWIN_DATA_READY") 
    #Выделяем память под буфер обмена 
    _buffer = mmap.mmap(0, 4096, "DBWIN_BUFFER", mmap.ACCESS_WRITE) 
    timeStart = time.time() 
     
    while time.time() < timeStart + int(TimeOut): 
        #Устанавливаем событие готовности буфера для получения отладочных сообщений, 
        #т.е. регистрируем "программу-ловушку" 
        win32event.SetEvent(buffer_ready) 
        #Если есть сигнал получения данных отладочного сообщения – обрабатываем его 
        if win32event.WaitForSingleObject(data_ready, 1) == win32event.WAIT_OBJECT_0: 
            _buffer.seek(0) 
            #Получаем идентификатор процесса, отправившего отладочное сообщение 
            process_id, = struct.unpack("L", _buffer.read(4)) 
            #Считываем отладочное сообщение из буфера обмена 
            data = _buffer.read(4092) 
            #Считываем строку до символа окончания строки, если он присутствует 
            if "\0" in data: 
                str1 = data[:data.index("\0")] 
            #иначе вся строка в буфере является отладочным сообщением 
            else: 
                str1 = data 
             
            #Проверяем присутствие подстроки Filter в сообщении, 
            #если она присутствует, считаем, что 
            #отладочное сообщение получено от нашего скрипта Lua  
            if str1.find(Filter) >= 0: 
                ticks = time.localtime() 
                #Выводим отладочное сообщение в консоль 
                print ("Pid %d [%02d:%02d:%02d]: %s" % (process_id, ticks.tm_hour, ticks.tm_min, ticks.tm_sec, str1))
                timeStart = time.time() 
         
        #Если в течение установленного таймаута с момента 
        #последнего отладочного сообщения не было получено 
        #новых отладочных сообщений скрипа Lua - отравляем письмо 
        if time.time() >= timeStart + int(TimeOut): SendMail ("Script %s" % Filter)
             
def SendMail(MsgText): 
    #От кого 
    fromaddr = 'Mr. Robot <someaccount@test.com>'' 
    #Кому 
    toaddr = 'Administrator <administrator@test.com>' 
    #Тема письма 
    subj = 'Notification from Controller' 
    #Текст сообщения 
    msg_txt = 'Notice:\n\n ' +  MsgText + '\n\nBye!' 
    #Создаем письмо (заголовки и текст) 
    msg = "From: %s\nTo: %s\nSubject: %s\n\n%s"  % ( fromaddr, 
                                                     toaddr, 
                                                     subj, 
                                                     msg_txt) 
      
    #Логин почтового ящика 
    username = 'someaccount' 
    #Пароль почтового ящика 
    password = 'somepassword' 
     
    #Инициализируем соединение с сервером по протоколу smtp 
    server = smtplib.SMTP("smtp.mail.com:465") 
    #Переводим соединение в защищенный режим (Transport Layer Security) 
    server.starttls() 
    #Авторизуемся на сервере 
    server.login(username, password) 
    #Отправляем письмо 
    server.sendmail(fromaddr, toaddr, msg) 
    print ("Message send to %s" % toaddr)
    #Закрываем соединение с сервером 
    server.quit() 
 
if len(sys.argv) == 1: 
    ControllerStart() 
elif len(sys.argv) == 2: 
    ControllerStart(sys.argv[1]) 
elif len(sys.argv) == 3: 
    ControllerStart(sys.argv[1], int(sys.argv[2])) 

При попытке выполнения в IDLE Python 3.7 выдает вот такие ошибки:

Traceback (most recent call last):
File “X:\disc.py”, line 82, in <module>
ControllerStart()
File “X:\disc.py”, line 29, in ControllerStart
if “\0” in data:
TypeError: a bytes-like object is required, not ‘str’

Traceback (most recent call last):
File “X:\disc.py”, line 82, in <module>
ControllerStart()
File “X:\disc.py”, line 47, in ControllerStart
if time.time() >= timeStart + int(TimeOut): SendMail (“Script %s” % Filter)
File “X:\disc.py”, line 70, in SendMail
server = smtplib.SMTP(“smtp.mail.com:465”)
File “C:\Python\Python37-32\lib\smtplib.py”, line 251, in __init__
(code, msg) = self.connect(host, port)
File “C:\Python\Python37-32\lib\smtplib.py”, line 338, in connect
(code, msg) = self.getreply()
File “C:\Python\Python37-32\lib\smtplib.py”, line 394, in getreply
raise SMTPServerDisconnected(“Connection unexpectedly closed”)
smtplib.SMTPServerDisconnected: Connection unexpectedly closed


Отредактировано Nord99 (Фев. 23, 2019 12:44:36)

Офлайн

#2 Фев. 23, 2019 12:28:09

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

Nord99 код в теги

[code python][/code]
иначе он нечитаем, по поводу ошибки для начала поменяйте if “\0” in data: на if b'\0' in data:



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Фев. 23, 2019 15:42:03

Nord99
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

PEHDOM
для начала поменяйте if “\0” in data: на if b'\0' in data:
Спасибо поправил

Отредактировано Nord99 (Фев. 23, 2019 16:08:55)

Офлайн

#4 Фев. 23, 2019 16:51:49

Nord99
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

Будьте добры, подскажите еще пожалуйста как исправить:
1. что то не передаёт мне этот скрипт по емейлу полное содержимое строки str1, такое как оно происходит в событии win32event
2. Я зациклил скрипт чтобы он выполнялся без остановки а не один раз, поставил в конце while True:

 while True:
        if len(sys.argv) == 1: 
            ControllerStart() 
        elif len(sys.argv) == 2: 
            ControllerStart(sys.argv[1]) 
        elif len(sys.argv) == 3: 
            ControllerStart(sys.argv[1], int(sys.argv[2])) 

В итоге после нескольких циклов выполнения он отваливается с ошибкой

Traceback (most recent call last):
File “X:\disc.py”, line 82, in <module>
ControllerStart()
File “X:\disc.py”, line 38, in ControllerStart
if str1.find(Filter) >= 0:
TypeError: argument should be integer or bytes-like object, not ‘str’

Отредактировано Nord99 (Фев. 23, 2019 16:52:10)

Офлайн

#5 Фев. 23, 2019 17:08:41

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

Nord99
if str1.find(Filter) >= 0:
TypeError: argument should be integer or bytes-like object, not ‘str’
оно вам говорит что Filter должет быть или числом или байтом, но не строкой. Разберитесь что вам приходит в data вот тут data = _buffer.read(4092), судя по всем там байты. следовательно вам или нужно работать с ними как с байтами, или преобразовывать в строку, если хотите работать с данными как с строкой.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Фев. 23, 2019 17:58:17

Nord99
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

PEHDOM
или преобразовывать в строку, если хотите работать с данными как с строкой.
А как их преобразовать в строку?

Офлайн

#7 Фев. 23, 2019 20:26:36

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Помогите переделать скрипт

Nord99
А как их преобразовать в строку?
обычно для этого используют метод decode(), учитывая что у вас венда, то както так:
 str1 = data.decode('cp1251')



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version