Python 之自动获取公网IP

2017年9月30日

文档下载:https://wenku.baidu.com/view/ff40aef7f021dd36a32d7375a417866fb84ac0fd

0.预备知识

0.1 SQL基础

ubuntu、Debian系列安装:

1 root@raspberrypi:~/python-script#  apt-get install mysql-server 

Redhat、Centos 系列安装:

1 [root@localhost ~]# yum install  mysql-server

登录数据库

 1 pi@raspberrypi:~ $ mysql -uroot -p -hlocalhost
 2 Enter password:
 3 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 4 Your MariaDB connection id is 36
 5 Server version: 10.0.30-MariaDB-0+deb8u2 (Raspbian)
 6
 7 Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
 8
 9 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
10
11 MariaDB [(none)]> 

其中,mysql是客户端命令 -u是指定用户 -p是密码 -h是主机

创建数据库、创建数据表

创建数据库语法如下

 1 MariaDB [(none)]> help create database
 2 Name: 'CREATE DATABASE'
 3 Description:
 4 Syntax:
 5 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
 6     [create_specification] ...
 7
 8 create_specification:
 9     [DEFAULT] CHARACTER SET [=] charset_name
10   | [DEFAULT] COLLATE [=] collation_name
11
12 CREATE DATABASE creates a database with the given name. To use this
13 statement, you need the CREATE privilege for the database. CREATE
14 SCHEMA is a synonym for CREATE DATABASE.
15
16 URL: https://mariadb.com/kb/en/create-database/
17
18
19 MariaDB [(none)]> 

创建数据表语法如下

 1 MariaDB [(none)]> help create table
 2 Name: 'CREATE TABLE'
 3 Description:
 4 Syntax:
 5 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
 6     (create_definition,...)
 7     [table_options]
 8     [partition_options]
 9
10 Or:
11
12 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
13     [(create_definition,...)]
14     [table_options]
15     [partition_options]
16     select_statement

创建数据库ServiceLogs

1 MariaDB [(none)]> CREATE DATABASE `ServiceLogs`

创建数据表

1 MariaDB [(none)]> CREATE TABLE `python_ip_logs` (
2   `serial_number` bigint(20) NOT NULL AUTO_INCREMENT,
3   `time` datetime DEFAULT NULL,
4   `old_data` varchar(50) DEFAULT NULL,
5   `new_data` varchar(50) DEFAULT NULL,
6   PRIMARY KEY (`serial_number`)
7 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 

表内容的查询

1 MariaDB [ServiceLogs]> select * from python_ip_logs;
2 Empty set (0.00 sec)

0.2 python连接操作MySQL

模块下载安装

下载路径: https://pypi.python.org/pypi/MySQL-python

安装:

 1 安装:
 2 解压
 3 unzip MySQL-python-1.2.5.zip
 4 进入解压后目录
 5 cd MySQL-python-1.2.5/
 6 安装依赖
 7 apt-get install libmysqlclient-dev
 8 安装
 9 python setup.py install
10 如果为0则安装OK
11 echo $?

连接Mysql

 1 root@raspberrypi:~/python-script# cat p_mysql_3.py
 2 #!/usr/bin/env python
 3
 4 import MySQLdb
 5
 6 try :
 7         conn = MySQLdb.connect("主机","用户名","密码","ServiceLogs")
 8         print ("Connect Mysql successful")
 9 except:
10         print ("Connect MySQL Fail")
11 root@raspberrypi:~/python-script# 

如果输出Connect Mysql successful则说明连接OK

Python MySQL insert语句

 1 root@raspberrypi:~/python-script# cat p_mysql1.py
 2 #!/usr/bin/env python
 3
 4 import MySQLdb
 5
 6 db = MySQLdb.connect("localhost","root","root","ServiceLogs")
 7
 8 cursor = db.cursor()
 9
10 sql = "insert INTO python_ip_logs VALUES (DEFAULT,'2017-09-29 22:46:00','123','456')"
11
12 cursor.execute(sql)
13 db.commit()
14
15 db.close()
16 root@raspberrypi:~/python-script# 

执行完成后可以mysql客户端SELECT语句查看结果

1.需求

1.1 需求

由于宽带每次重启都会重新获得一个新的IP,那么在这种状态下,在进行ssh连接的时候会出现诸多的不便,好在之前还有花生壳软件,它能够通过域名来找到你的IP地址,进行访问,这样是最好的,不过最近花生壳也要进行实名认证才能够使用,于是乎,这就催发了我写一个python脚本来获取公网IP的冲动。

实现效果:当IP变更时,能够通过邮件进行通知,且在数据库中写入数据

1.2 大致思路

1.3 流程图

其他代码均没有什么好画的

2.代码编写

2.1.1 编写python代码

getnetworkip.py

 1 root@raspberrypi:~/python-script# cat getnetworkip.py
 2 #!/usr/bin/env python
 3 # coding:UTF-8
 4
 5 import requests
 6 import send_mail
 7 import savedb
 8
 9 def get_out_ip() :
10         url = r'http://www.trackip.net/'
11         r = requests.get(url)
12         txt = r.text
13         ip = txt[txt.find('title')+6:txt.find('/title')-1]
14         return (ip)
15
16 def main() :
17         try:
18                 savedb.general_files()
19
20                 tip = get_out_ip()
21                 cip = savedb.read_files()
22
23
24                 if savedb.write_files(cip,tip) :
25                         send_mail.SamMail(get_out_ip())
26         except :
27                 return False
28
29 if __name__=="__main__" :
30         main()
31 root@raspberrypi:~/python-script# 

savedb.py

 1 root@raspberrypi:~/python-script# cat savedb.py
 2 #!/usr/bin/env python
 3
 4 import MySQLdb
 5 import os
 6 import time
 7
 8 dirname = "logs"
 9 filename = "logs/.ip_tmp"
10
11 def general_files(Default_String="Null") :
12
13         var1 = Default_String
14
15         if not os.path.exists(dirname) :
16                 os.makedirs(dirname)
17
18         if not os.path.exists(filename) :
19                 f = open(filename,'w')
20                 f.write(var1)
21                 f.close()
22
23 def read_files() :
24         f = open(filename,'r')
25         txt = f.readline()
26         return (txt)
27
28 def write_files(txt,new_ip) :
29         if not txt == new_ip :
30                 NowTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
31                 old_ip = read_files()
32                 os.remove(filename)
33                 general_files(new_ip)
34                 write_db(NowTime,old_ip,new_ip)
35                 return True
36         else:
37                 return False
38
39
40 def write_db(NowTime,Old_ip,New_ip) :
41         db = MySQLdb.connect("主机","用户名","密码","库名")
42
43         cursor = db.cursor()
44
45         sql = """
46                 INSERT INTO python_ip_logs
47                 VALUES
48                 (DEFAULT,"%s","%s","%s")
49         """ %(NowTime,Old_ip,New_ip)
50
51         try:
52                 cursor.execute(sql)
53                 db.commit()
54         except:
55                 db.rollback()
56
57         db.close()
58 root@raspberrypi:~/python-script# 

send_mail.py

 1 root@raspberrypi:~/python-script# cat send_mail.py
 2 #!/usr/bin/env python
 3
 4 import smtplib
 5 import email.mime.text
 6
 7 def SamMail(HtmlString) :
 8     HOST = "smtp.163.com"
 9     SUBJECT = "主题"
10     TO = "对方的邮箱地址"
11     FROM = "来自于哪里"
12     Remask = "The IP address has been changed"
13
14     msg = email.mime.text.MIMEText("""
15         <html>
16                 <head>
17                         <meta charset="utf-8" />
18                 </head>
19                 <body>
20                         <em><h1>ip:%s</h1></em>
21                 </body>
22         </html>
23         """ %(HtmlString),"html","utf-8")
24
25     msg['Subject'] = SUBJECT
26     msg['From'] = FROM
27     msg['TO'] = TO
28
29     try:
30         server = smtplib.SMTP()
31         server.connect(HOST,'25')
32         server.starttls()
33         server.login("用户名","密码")
34         server.sendmail(FROM,TO,msg.as_string())
35         server.quit()
36     except:
37         print ("Send mail Error")
38 root@raspberrypi:~/python-script#
39     print ("%s" %(line),end='')

3.效果

收到的邮件如下:

利用SELECT查看表,效果如下:

把脚本放入crontab中,让它执行定时任务即可

转载于:https://www.cnblogs.com/wang-li/p/7615118.html

Python 之自动获取公网IP相关推荐

  1. 优酷路由宝设置虚拟服务器,优酷路由宝添加“黑科技”,ROOT后加脚本,自动获取公网IP...

    文章背景: 网友是江苏省中国移动的宽带用户,移动宽带上网需要拨号,而且有时候拨号获得的是公网IP,有时候获取到的是内网IP,向我求助帮忙,编写个脚本,让路由器自动判断.获取到内网IP就自动重启,直到获 ...

  2. 一种获取公网ip地址并发送邮件至指定邮箱的实现方法

    背景   在之前一篇文章中介绍了利用路由器的端口映射功能实现内网穿透的方法.   ubuntu SSH内网穿透 + Vscode远程访问   在实际的使用过程中,发现这一实现途径存在一些不足之处,即当 ...

  3. 服务器搭建网站公网ip,如何获取公网ip,自己搭建公网ip服务器的方法

    #Go语言初体验 – 获取公网IP小服务.由于免费的动态dns刷新IP很慢, 手动实时获取办公室网络公网IP. #GetIp.go 是服务端程序, 用于返回当前访问的请求的公网IP. demo地址: ...

  4. golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商

    目录 简要简介net包 什么是外网IP和内网IP? 获取公网ip 获取本地ip 判断是否是公网ip ip地址string转int ip地址int转string 判断ip地址区间 通过淘宝接口根据公网i ...

  5. QT udp自动获取对方ip和端口号

    Tip: 用printf打印QString方法如下: QString output printf("%s\n",output.toStdString().data()); 正文:Q ...

  6. 用python做生物信息数据分析_基于Python的自动获取生物信息数据的软件设计

    基于 Python 的自动获取生物信息数据的软件设计 * 周斯涵,刘月兰 ** [摘 要] [摘 要] 从国际生物信息学数据库中采集数据来进行相关领域的分析, 但随着数据库规模不断扩大 , 数据来源种 ...

  7. 斐讯N1刷Armbian_5.62,无法自动获取到ip怎么办?

    N1刷Armbian_5.62,但无法自动获取到ip,现获取的是169开头的ip,可以进行手动设置IP吗? findlike提供如下方案: Armbian_5.60之后,dtb读取方式变更.下载 ar ...

  8. android公网ip,android 获取公网ip 内网ip

    /** * 获取公网ip * @return */ public String getNetIp() { URL infoUrl = null; InputStream inStream = null ...

  9. java自动获取ip_java自动获取电脑ip和MAC地址

    java自动获取电脑ip和MAC地址 利用getLocalHost获得计算机名称和ip getByInetAddress可以确定一个IP地址属于哪一个网络接口,这个IP地址通过命令行参数传入 用get ...

最新文章

  1. Java中实现多线程关键词整理
  2. Python读取保存在hdf5文件中的脑电数据
  3. 关于共享单车,说点什么
  4. 相机视场角和焦距_按照工业镜头的视场的分类
  5. 【击败时间100%】剑指 Offer 38. 字符串的排列
  6. 生成Apk遇到的问题
  7. Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维
  8. 在两个ASP.NET页面之间传递变量【转】
  9. oracle mysql 透明网关_如何在Oracle中建立透明网关
  10. 速读-高级技能二:并行输入训练
  11. 算法岗面试整理 | 腾讯、字节、美团、阿里
  12. 机器学习实现计算不规则图形面积_【名师课堂】苏教数学五年级上2.11校园绿地面积...
  13. 家用台式计算机安装的软件,爱福窝家庭装修设计软件
  14. 微信商户平台 扣款测试规则
  15. kindle电子书200G分享
  16. 论文阅读及代码学习-Directed Acyclic Graph Network for Conversational Emotion Recognition
  17. 【Mysql】Mysql为什么使用B+树
  18. Java系统环境变量配置
  19. 现在seo还好做吗(SEO越来越好做了吗)
  20. linux+4t分区+扩容lvm,Linux中利用LVM实现分区动态扩容

热门文章

  1. 【Delphi】让APP“鸡鸣鸟叫”(同时支持ios\android\windows\macos)
  2. 微信小程序 ssm装潢装修订单设计案例app
  3. java钢材出入库管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  4. 广义线性模型(Generalized Linear Model)
  5. 实例:ABAP权限对象设计与权限检查的实现(详细)
  6. UE4 编辑器下修改蓝图类继承的父类 ReparentBlueprint C++
  7. 孔板流量计计算公式_十二种流量计工作原理
  8. Glance支持镜像的格式
  9. 图解|高性能服务器设计之缓存系统一致性
  10. linux图片相似度检测软件下载,文档相似性检测工具