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中星号变量的几种特殊用法
Sep 07 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
Python计算两个矩形重合面积代码实例
Sep 16 Python
python同时替换多个字符串方法示例
Sep 17 Python
python计算无向图节点度的实例代码
Nov 22 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
Python读取文件夹下的所有文件实例代码
Apr 02 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
PHP 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
我的论坛源代码(四)
2006/10/09 PHP
laravel安装和配置教程
2014/10/29 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
PHP echo()函数讲解
2019/02/15 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
keras导入weights方式
2020/06/12 Python
python编写实现抽奖器
2020/09/10 Python
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
不听老师话的万能检讨书
2014/10/04 职场文书
佛光寺导游词
2015/02/10 职场文书
超市员工辞职信范文
2015/05/12 职场文书
学校体育节班级口号
2015/12/25 职场文书
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android