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语言的12个基础知识点小结
Jul 10 Python
Django返回json数据用法示例
Sep 18 Python
Python 高级专用类方法的实例详解
Sep 11 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
Python网络编程详解
Oct 31 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
python pygame实现挡板弹球游戏
Nov 25 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
Python控制台实现交互式环境执行
Jun 09 Python
python递归函数用法详解
Oct 26 Python
python实现三阶魔方还原的示例代码
Apr 28 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读取xml方法介绍
2013/01/12 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
JavaScript 常用函数
2009/12/30 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
用Python实现大文本文件切割的方法
2019/01/12 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
Python新手学习装饰器
2020/06/04 Python
python属于解释型语言么
2020/06/15 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
小学教师培训感言
2014/02/11 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android