среда, 7 октября 2009 г.

Python+smtp+urllib=?

Возникла проблема: на домашнем компьютере установлен тестовый апач и еще пара сервисов, которыми хотелось бы управлять удаленно (мало ли что произойдет). Машина закрыта роутером, на роутере прокинуты нужные мне порты. Но т.к. мой ip динамический хотелось бы как-то узнавать о нем (вариант дойти до дома конечно не подходит). Идея написать скрипт который будет отправлять мой текущий внешний ip мне же на мыло пришла давно, все никак руки не доходили (об этом позже).Итак что имеем.Задача: получить удаленно внешний ip домашней машины.
Средства:

  1. python 2.6
  2. Сайт myip.ru

Неплохо было бы вынуть ip с этого сайта. Использовать поиск по тегу не рационально. Регулярные выражения напрашиваются сами собой (благо кроме целевого ip больше ничего нет). Немного полистав вики составил простенькое выражение:

([1-2]{0,1})([0-9]{1,2})(\.([1-2]{0,1})([0-9]{1,2})){3}
Но оно меня не удовлетворило. Порылся в гугле толком ничего не нашел. Спросил на конфе питона (python@conference.jabber.ru) отправили на хабр и посоветовали такой вариант:
(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}
Собственно его я и использовал.
import re
import urllib
def getMyIP():
 f = urllib.urlopen("http://www.myip.ru/get_ip.php?loc=")
 m = re.search("(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}",f.read())
 f.close()
 if m is not None:
  return m.group(0)
 else: 
  return None

Дальше, надо бы как-то отправить сообщение себе на почту... Нашел простую реализацию (я бы и сам до нее дошел просто первое что вышло под запрос оказалось в самую точку):

import smtplib
from email.MIMEText import MIMEText
def sendToMail(IP):
 # отправитель
 me = 'segyrn@yandex.ru'
 # текст письма
 text = str(IP)
 # заголовок письма
 subj = 'Новый IP!'
 
 # параметры SMTP-сервера
 server = "smtp.yandex.ru" # "smtp.yandex.ru"
 port = 25
 user_name = "mymail@mymail.net"
 user_passwd = "mypassword"
 
 # формирование сообщения
 msg = MIMEText(text, "", "utf-8")
 msg['Subject'] = subj
 msg['From'] = me
 msg['To'] = me
 
 # отправка
 s = smtplib.SMTP(server, port)
 s.starttls()
 s.login(user_name, user_passwd)
 s.sendmail(me, you, msg.as_string())
 s.quit()
 return "ok"

Ну и не гоже каждый раз отправлять письма, спама мне и так хватает.

import os
def check():
 IP = getMyIP()
 dFile = open(".curentIp","r")
 curIP = dFile.readline()
 dFile.close()
 if str(IP) == curIP:
  return None
 else:
  os.remove(".curentIp")
  dFile = open(".curentIp","w")
  dFile.write(str(IP))
  dFile.close()
  sendToMail(IP)
 return "ok"

Теперь этот скрипт можем спокойно ложить в cron:

0    8-18    *    *    1-5    ~/scripts/forWork/sendip.py
Запускать скрипт каждый час с 8-18, с понедельника по пятницу.

PS: на самом деле после обсуждения статьи на linux_irk@conference.jabber.ru был найден еще более простой способ описан тут

Комментариев нет:

Отправить комментарий