Ja die leerzeilen hab ich beim Einfügen und wieder Rauslöschen der prints zum debuggen wohl versehentlich entfernt. Und dass hier gleich immer aus einer Frage geschlossen wird dass man eine Lösung auf dem Silbertablett serviert haben will finde ich schon fast beängstigend. Ich habe inzwischen schon X mal in so ziemlich jedem Thread den ich erstellt habe erwähnt dass ich keine Fertiglösung bevorzuge sondern gern auch etwas Lernen möchte, daher ne meigrafd das ist für mich nicht Schwein-Sein sondern ein Tip den ich verfolgen kann .
Durchsuche Mail und falls Bestimmter Inhalt vorhanden sende Nachricht mittels Telegram/Schicke Nachricht nach reboot
-
Apop85 -
16. Dezember 2017 um 01:08 -
Erledigt
Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
-
-
Durchsuche Mail und falls Bestimmter Inhalt vorhanden sende Nachricht mittels Telegram/Schicke Nachricht nach reboot? Schau mal ob du hier fündig wirst!
-
meigrafd Tja, tut mir leid, dass ich besseres zu tun habe als > 100 Zeilen dicht gequetschten Code nach einem nackten Except abzusuchen.
Apop85 ein paar Leerzeilen hier und da (üblicherweise nach einem Block Code, der "eine Einheit" bildet) würden deinem Code gut tun. Und nie nie nie nie nie ein reines except oder except Exception verwenden. Nie.
Nie.
Wegen genau sowas, wenn du eine bestimmte exception erwartest, fang' sie gezielt ab und mache weiter. Wenn du einfach nur allgemeine Fehler unterdrücken willst, lass das Script sterben und fixe sie.
Das Zen of Python sagt dazu:
Da das Script via Crontab läuft und sofern korrekt eingerichtet keinerlei Fehlermeldung ausgeben sollte, dient das von mir ihm vorgegebene except Exception, error: als Laufzeitsicherheit... Weil der Exitcode vom Script dann bei 0 bleibt.... Wir erarbeiten hier gemeinsam eine Lösung. Dass man sowas für gewöhnlich nicht machen sollte ist klar und kommentier ich nicht weiter weil:
Also sorry aber bevor man in einem mehr-als-ein-Beitrag-langen-Thread postet, liest man sich entweder vorher ein oder hält die Klappe.
Es kommen in letzter Zeit einige Situationen zusammen die mich langsam nerven und Du kriegst das jetzt halt mal ab.
-
Dass es hier keine Privatunterhaltungen in öffentlichen Threads gibt weißt du doch mittlerweile, meigrafd. Und BTW habe auch ich in diesem Thread schon mehrfach geschrieben, seit Beitrag #6.
Und egal, ob das except von Apop85 kommt oder du das untergeschoben hast, ich werde mich weiterhin aktiv dagegen wehren. Das hat noch nie etwas gutes gebracht.
Du kriegst das jetzt halt mal ab.
Kein Problem, komm ich mit klar!
-
Es dient dem Lerneffekt Linus , einen Plan den ich beim gemeinsamen erarbeiten des Scripts verfolge. Wenn Du denkst das besser zu können/machen verzieh ich mich und überlasse dir das Feld.
-
Ok habe den Fehler gefunden.
Die Seite auf welchem die chat-id ausgelesen wird wurde aus irgend einem Grund gereseted. Musste dem Bot nochmals eine Nachricht schicken und tadaaa....
Danke meigrafd für den Tipp mit den Zeilen.
Gibt es sowas öfters oder wie ist/konnte das passieren dass die Daten da gereseted wurden?
Grüsse
Edit: Debugausgaben mit auskommentierten Zeilen:
CodeTraceback (most recent call last): File "/home/pi/scripts/checkmail.py", line 119, in <module> check_mails() File "/home/pi/scripts/checkmail.py", line 61, in check_mails telegram_chat_id = get_last_chat_id(get_updates()) File "/home/pi/scripts/checkmail.py", line 50, in get_last_chat_id chat_id = updates['result'][last_update]['message']['chat']['id'] IndexError: list index out of range
-
Das geschieht glaub ich automatisch nach einer gewissen Zeit - also Inaktivität.
Versuch mal die chat_id fest einzubauen also ohne dynamischen Auslesen.
-
-
Ok habs nun entsprechend umgeschrieben dass die Chatid hardgecoded ist.
Python
Alles anzeigen#!/usr/bin/python2 from __future__ import print_function import email import imaplib import urllib import requests from time import gmtime, strftime MAIL_SERVERS = { 'gmail': { 'Login': '****************@gmail.com', 'Password': '********************', 'Server': 'imap.gmail.com', 'Port': 993, }, } # react only on eMails with exact this subject subject = 'Confirm Your Hostname Now' BOT_TOKEN = '******************************' TELEGRAM_CHAT_ID = '********' telegram_notice_text = 'No-IP Adresse muss verifiziert werden! %confirmlink%' URL = 'https://api.telegram.org/bot{}/'.format(BOT_TOKEN) DEBUG = False def send_message(chat_id, text): print('Sending Telegram Notice...') text = urllib.quote_plus(text) url = URL + 'sendMessage?parse_mode=Markdown&chat_id={}&text={}'.format(chat_id, text) response = requests.get(url) # check Mails def check_mails(): for SRV in MAIL_SERVERS: if MAIL_SERVERS[SRV]['Login'] == '': continue print('Checking: {}'.format(SRV)) m = imaplib.IMAP4_SSL(MAIL_SERVERS[SRV]['Server'], MAIL_SERVERS[SRV].get('Port', 993)) m.login(MAIL_SERVERS[SRV]['Login'], MAIL_SERVERS[SRV]['Password']) m.select('Inbox') status, unreadcount = m.status('INBOX', '(UNSEEN)') unreadcount = int(unreadcount[0].split()[2].strip(').,]')) if unreadcount > 0: print('processing {} unreaded emails ...'.format(unreadcount)) items = m.search(None, 'UNSEEN') items = str(items[1]).strip('[\']').split(' ') for index, emailid in enumerate(items): resp, data = m.fetch(emailid, '(RFC822)') email_body = data[0][1] mail = email.message_from_string(email_body) if mail['Subject'] == subject: timeNow = strftime('%d.%m.%Y %H:%M:%S', gmtime()) print('[{}] New EMail with Subject "{}" received, checking.. '.format(timeNow, mail['Subject'])) countIt=False nextmail=False confirm_link='' if mail.is_multipart(): for part in mail.walk(): if part.get_content_type() == 'text/html': body = part.get_payload() body = body.decode() for line in body.split('\r\n'): if nextmail: continue if line == '': # skip empty lines continue if 'Click the button above to confirm your hostname' in line: countIt=True continue if countIt and 'www.noip.com' in line: if DEBUG: print(line) confirm_link = line.split('&')[0].strip() confirm_link = confirm_link.replace('?n=3D', '?n=') print('Confirm Link extracted: %s' % confirm_link) nextmail=True # send notice to telegram notice = telegram_notice_text.replace('%confirmlink%', confirm_link) send_message(TELEGRAM_CHAT_ID, notice) else: # mark other mails back to unread/unseen m.store(emailid, '-FLAGS', '(\Seen)') try: m.logout() except: pass print('Done.') if __name__ == '__main__': try: check_mails() except Exception, error: print('Error...: {}'.format(error)) except (KeyboardInterrupt, SystemExit): print('Schliesse Programm.') #EOF
Linus Ich habe das soweit verstanden dass es genau aus dem Grund wie jetzt gerade ungünstig ist das except so zu nutzen da die Fehlerbeschreibungen einfach geschluckt werden. Besser wäre es den Error abzufangen um eine entsprechende Meldung auszugeben damit das Script ned wortlos abschmiert. Ist das so richtig?
-
die check_mails() Funktion ist schon alleine ein Verbrechen
-
Reines meckern ist unterste Schublade. Wenn ihr Beiträge macht dann bitte konstruktiv - ansonsten unterdrückt bitte euren python-forum.de-like-style. Werde ich künftig immer wieder kritisieren weils langsam echt nervt.
Besser wäre es den Error abzufangen um eine entsprechende Meldung auszugeben damit das Script ned wortlos abschmiert.
Wortlos abschmieren tuts i.d.R. nicht. Besser wäre der entsprechenden Fehlermeldung zu handeln und somit gezielt die möglicherweise auftretenden Fehler abzufangen. In dem Fall war es ein IndexError was man hätte gezielt behandeln würde/könnte.
-
meigrafd ja da kann ich nur zustimmen. Dieser Beitrag von bootsmann ist weder hilfreich noch weiterführend, daher bin ich darauf auch nicht eingegangen.
Bezüglich dem IndexError müsste dann das inetwa so aussehen?
Das müsste mir dann den entsprechenden Index angeben welcher den Error verursacht hat wenn ich das so richtig verstanden habe.
-
Einen Index gibt dir error nicht wirklich aus, sondern nur list index out of range.
Siehe dazu:
https://wiki.python.org/moin/HandlingExceptions
https://docs.python.org/3/library/exceptions.html
https://docs.python.org/2/tutorial/errors.html
http://www.pythonforbeginners.com/error-handling…-try-and-except
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!