2回答

1收藏

[经验] 获取树莓派的变动外网ip

Raspberry Pi Raspberry Pi 12185 人阅读 | 2 人回复 | 2014-09-25

因为树莓派放在家里用,家里的电信宽带ip老是变动,就用了这两个方法。

1.ip变化时发邮件通知
config.py 配置邮箱信息
  1. #!/usr/bin/env python
  2. #-*-coding:utf-8-*-
  3. smtpServer='smtp.126.com' #邮件发送帐户的smtp服务器地址
  4. smtpPort='25' #邮件发送帐户的smtp服务器发送端口
  5. smtpUser='xxxxx@126.com' #邮件发送帐户名
  6. smtpPwd='xxxx' #邮件发送帐户密码,我这里打X号示例,但老兄得填真的
  7. sendTo='xxxx@163.com' #接收邮箱地址
复制代码
  1. #!/usr/bin/env python
  2. #-*-coding:utf-8-*-
  3. import smtplib,config,email,sys,socket,threading
  4. from email.Message import Message
  5. import re,urllib2

  6. class Getmyip:
  7.         def getip(self):
  8.                 try:
  9.                         myip = self.visit("http://www.whereismyip.com/")
  10. #                   return myip
  11.                 except:
  12.                         try:
  13.                                 myip = self.visit("http://www.bliao.com/ip.phtml")
  14. #                           return myip
  15.                         except:
  16.                                 try:
  17.                                         myip = self.visit("http://www.whereismyip.com/")
  18. #                                   return myip
  19.                                 except:
  20.                                         myip = "So sorry!!!"
  21.                 return myip

  22.         def visit(self,url):
  23.                 opener = urllib2.urlopen(url)
  24.                 if url == opener.geturl():
  25.                         str = opener.read()
  26. #                        print str
  27.                         asd=re.search('\d+\.\d+\.\d+\.\d+',str).group(0)
  28.                         return asd

  29. def connect():
  30.         try:
  31.                 server=smtplib.SMTP(config.smtpServer,config.smtpPort)
  32.                 server.ehlo()
  33.                 server.login(config.smtpUser,config.smtpPwd)
  34.                 return server
  35.         except Exception:
  36.                 print 'connect smtp server failed!'
  37.        
  38. def sendmessage(server,to,subj,content):
  39.         msg = Message()
  40.         msg['Mime-Version']='1.0'
  41.         msg['From']        = config.smtpUser
  42.         msg['To']          = to
  43.         msg['Subject'] = subj
  44.         msg.set_payload(content)
  45.         try:       
  46.                 failed = server.sendmail(config.smtpUser,to,str(msg))
  47.         except Exception ,ex:
  48.                 print Exception,ex
  49.                 print 'Error - send failed'
  50.         else:
  51.                 print 'send succeed!'

  52. #每隔10s检查一次IP,间隔时间可以适当调大一点
  53. def checkIP():
  54.         global text
  55.         #getmyip = Getmyip()
  56.         print text
  57.         ipnow=getmyip.getip()
  58.         print ipnow
  59.         if  text!=ipnow:
  60.                 text=ipnow
  61.                 server=connect()
  62.                 sendmessage(server,to,subj,text)
  63.         t = threading.Timer(600.0, checkIP)
  64.         t.start()
  65.                
  66. if __name__=="__main__":
  67.         getmyip = Getmyip()
  68.         to=config.sendTo
  69.         subj='ip changed'
  70.         text = getmyip.getip() #这个就是获取本机IP的
  71.         server=connect()
  72.         sendmessage(server,to,subj,text)
  73.         t = threading.Timer(600.0, checkIP)
  74.         t.start()
复制代码
SendIP.py脚本负责检查发送。
用 nohup python ./SendIP.py & 后台启动服务就好啦

第二种:原先在家里搭建了个服务,要更改域名地址,用花生壳又不太方便,就用dnspod提供的api接口写个py脚本,用于动态更新域名地址,不过生效不是很快。也发出来给大家看下。
  1. 1 #!/usr/bin/env python
  2. 2 #-*-coding:utf-8-*-
  3. 3 import httplib,urllib
  4. 4 import json
  5. 5 import re,urllib2
  6. 6 import time
  7. 7
  8. 8 class Getmyip:
  9. 9     def getip(self):
  10. 10         try:
  11. 11             myip = self.visit("http://www.whereismyip.com/")
  12. 12 #           return myip
  13. 13         except:
  14. 14             try:
  15. 15                 myip = self.visit("http://www.bliao.com/ip.phtml")
  16. 16 #               return myip
  17. 17             except:
  18. 18                 try:
  19. 19                     myip = self.visit("http://www.whereismyip.com/")
  20. 20 #                   return myip
  21. 21                 except:   
  22. 22                     myip = "So sorry!!!"
  23. 23         return myip
  24. 24   
  25. 25     def visit(self,url):
  26. 26         opener = urllib2.urlopen(url)
  27. 27         if url == opener.geturl():
  28. 28             str = opener.read()
  29. 29             asd=re.search('\d+\.\d+\.\d+\.\d+',str).group(0)
  30. 30             return asd
  31. 31
  32. 32 def setdnspod(newip):
  33. 34     params = 'login_email=xxxxx&login_password=xxxxx&format=json&domain_id=16415545&record_id=67237927&record_line=默认&sub_domain=www&value='+ newip +'&record_type=A'
  34. 35     header = {"Content-type": "application/x-www-form-urlencoded",   
  35. 36              "Accept": "text/plain"}   
  36. 37     conn = httplib.HTTPSConnection("dnsapi.cn")
  37. 38     #获取api版本信息
  38. 39     #conn.request("POST","/Info.Version",params,header)
  39. 40     #获取domains列表
  40. 41     #已知"id": xxxx,"name": "xxxx"
  41. 42     #conn.request("POST","/Domain.List",params,header)
  42. 43     #设置ddns
  43. 44     conn.request("POST","/Record.Modify",params,header)
  44. 45     #获取记录列表
  45. 46     #已知 "id": "xxxx", "name": "blog",      "id": "xxxx","name": "www",
  46. 47     #conn.request("POST","/Record.List",params,header)
  47. 48     response = conn.getresponse()
  48. 49     #print response.status, response.reason
  49. 50     data = response.read()  
  50. 51     #print(data)
  51. 52     conn.close()
  52. 53     s = json.loads(data)
  53. 54     return s["status"]["code"],data
  54. 55
  55. 56 if __name__ == '__main__':  
  56. 57     getmyip = Getmyip()  
  57. 58     localip=0  
  58. 59     while(1):  
  59. 60         time.sleep(1)  
  60. 61         tm_str_start = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
  61. 62         print(tm_str_start+'\n')
  62. 63         localtmp = getmyip.getip()
  63. 64         if (localtmp == None):        
  64. 65             print('GET LOCAL IP ERROR!\n')
  65. 66         else:
  66. 67             if (localip != localtmp):
  67. 68                 localip = localtmp
  68. 69                 code,data = setdnspod(localip)
  69. 70                 if (code == '1'):
  70. 71                     print('set new ip success:' + localip +'\n')
  71. 72                 else:
  72. 73                     print('set new ip failed:' + code + ':' + data + '\n')
  73. 74             else:
  74. 75                 print('new ip == old ip'+':'+localip+':'+localtmp+'\n')
复制代码
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

haothree

发表于 2014-9-25 16:25:07 | 只看该作者

多谢分享!
板凳

Cain丶ST

发表于 2014-9-28 08:45:24 | 只看该作者

谢楼主
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条