查看: 11204|回复: 2

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

[复制链接]
  • TA的每日心情
    擦汗
    2015-3-20 17:00
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2014-9-25 15:15:08 | 显示全部楼层 |阅读模式
    分享到:
    因为树莓派放在家里用,家里的电信宽带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')
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-9-25 16:25:07 | 显示全部楼层
    多谢分享!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2015-3-4 09:55
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-9-28 08:45:24 | 显示全部楼层
    谢楼主
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 15:30 , Processed in 0.128320 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.