Python之自动获取公网IP的实例讲解


Posted in Python onOctober 01, 2017

0.预备知识

0.1 SQL基础

ubuntu、Debian系列安装:

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

Redhat、Centos 系列安装:

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

登录数据库

pi@raspberrypi:~ $ mysql -uroot -p -hlocalhost
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 10.0.30-MariaDB-0+deb8u2 (Raspbian)

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

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

创建数据库、创建数据表

创建数据库语法如下

MariaDB [(none)]> help create database
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
 [create_specification] ...

create_specification:
 [DEFAULT] CHARACTER SET [=] charset_name
 | [DEFAULT] COLLATE [=] collation_name

CREATE DATABASE creates a database with the given name. To use this
statement, you need the CREATE privilege for the database. CREATE
SCHEMA is a synonym for CREATE DATABASE.

URL: https://mariadb.com/kb/en/create-database/


MariaDB [(none)]>

创建数据表语法如下

MariaDB [(none)]> help create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
 (create_definition,...)
 [table_options]
 [partition_options]

Or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
 [(create_definition,...)]
 [table_options]
 [partition_options]
 select_statement

创建数据库ServiceLogs

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

创建数据表

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

表内容的查询

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

0.2 python连接操作MySQL

模块下载安装

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

安装:

安装:
解压
unzip MySQL-python-1.2.5.zip
进入解压后目录
cd MySQL-python-1.2.5/
安装依赖
apt-get install libmysqlclient-dev
安装
python setup.py install
如果为0则安装OK
echo $?

连接Mysql

root@raspberrypi:~/python-script# cat p_mysql_3.py 
#!/usr/bin/env python

import MySQLdb

try :
  conn = MySQLdb.connect("主机","用户名","密码","ServiceLogs")
  print ("Connect Mysql successful")
except:
  print ("Connect MySQL Fail")
root@raspberrypi:~/python-script#

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

Python MySQL insert语句

root@raspberrypi:~/python-script# cat p_mysql1.py 
#!/usr/bin/env python

import MySQLdb

db = MySQLdb.connect("localhost","root","root","ServiceLogs")

cursor = db.cursor()

sql = "insert INTO python_ip_logs VALUES (DEFAULT,'2017-09-29 22:46:00','123','456')"

cursor.execute(sql)
db.commit()

db.close()
root@raspberrypi:~/python-script#

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

1.需求

1.1 需求

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

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

1.2 大致思路

Python之自动获取公网IP的实例讲解

1.3 流程图

Python之自动获取公网IP的实例讲解

Python之自动获取公网IP的实例讲解

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

2.代码编写

2.1.1 编写python代码

getnetworkip.py

root@raspberrypi:~/python-script# cat getnetworkip.py 
#!/usr/bin/env python
# coding:UTF-8

import requests
import send_mail
import savedb

def get_out_ip() :
  url = r'http://www.trackip.net/'
  r = requests.get(url)
  txt = r.text
  ip = txt[txt.find('title')+6:txt.find('/title')-1]
  return (ip)

def main() :
  try:
    savedb.general_files()

    tip = get_out_ip()
    cip = savedb.read_files()


    if savedb.write_files(cip,tip) :
      send_mail.SamMail(get_out_ip())
  except :
    return False

if __name__=="__main__" :
  main()
root@raspberrypi:~/python-script#

savedb.py

root@raspberrypi:~/python-script# cat savedb.py
#!/usr/bin/env python

import MySQLdb
import os
import time

dirname = "logs"
filename = "logs/.ip_tmp"

def general_files(Default_String="Null") :

  var1 = Default_String

  if not os.path.exists(dirname) :
    os.makedirs(dirname)

  if not os.path.exists(filename) :
    f = open(filename,'w')
    f.write(var1)
    f.close()

def read_files() :
  f = open(filename,'r')
  txt = f.readline()
  return (txt)

def write_files(txt,new_ip) :
  if not txt == new_ip :
    NowTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    old_ip = read_files()
    os.remove(filename)
    general_files(new_ip)
    write_db(NowTime,old_ip,new_ip)
    return True
  else:
    return False


def write_db(NowTime,Old_ip,New_ip) :
  db = MySQLdb.connect("主机","用户名","密码","库名")

  cursor = db.cursor()

  sql = """
    INSERT INTO python_ip_logs 
    VALUES
    (DEFAULT,"%s","%s","%s")
  """ %(NowTime,Old_ip,New_ip)

  try:
    cursor.execute(sql)
    db.commit()
  except:
    db.rollback()

  db.close()
root@raspberrypi:~/python-script#

send_mail.py

root@raspberrypi:~/python-script# cat send_mail.py
#!/usr/bin/env python

import smtplib
import email.mime.text

def SamMail(HtmlString) :
 HOST = "smtp.163.com"
 SUBJECT = "主题"
 TO = "对方的邮箱地址"
 FROM = "来自于哪里"
 Remask = "The IP address has been changed"

 msg = email.mime.text.MIMEText("""
  <html>
    <head>
      <meta charset="utf-8" />
    </head>
    <body>
      <em><h1>ip:%s</h1></em>
    </body>
  </html>
  """ %(HtmlString),"html","utf-8")

 msg['Subject'] = SUBJECT
 msg['From'] = FROM
 msg['TO'] = TO

 try:
  server = smtplib.SMTP()
  server.connect(HOST,'25')
  server.starttls()
  server.login("用户名","密码")
  server.sendmail(FROM,TO,msg.as_string())
  server.quit()
 except:
  print ("Send mail Error")
root@raspberrypi:~/python-script# 
 print ("%s" %(line),end='')

3.效果

收到的邮件如下:

Python之自动获取公网IP的实例讲解

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

Python之自动获取公网IP的实例讲解

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

以上这篇Python之自动获取公网IP的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python计算最小优先级队列代码分享
Dec 18 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 #Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 #Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 #Python
Python实现字符串反转的常用方法分析【4种方法】
Sep 30 #Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 #Python
Python基于pygame模块播放MP3的方法示例
Sep 30 #Python
Python实现自动为照片添加日期并分类的方法
Sep 30 #Python
You might like
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
jQuery插件开发汇总
2016/05/15 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
python实现感知器算法(批处理)
2019/01/18 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
学前教育学生自荐信范文
2013/12/31 职场文书
工作表现评语
2014/01/19 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
机械专业技术员求职信
2014/06/14 职场文书
超市开店计划书
2014/09/15 职场文书
标准发言稿结尾
2019/07/18 职场文书
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server