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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
解决python 输出是省略号的问题
Apr 19 Python
基于pip install django失败时的解决方法
Jun 12 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
Python 字典中的所有方法及用法
Jun 10 Python
Python Selenium异常处理的实例分析
Feb 28 Python
Python时间操作之pytz模块使用详解
Jun 14 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获取当前url路径的函数以及服务器变量
2013/06/29 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
PHP闭包函数详解
2016/02/13 PHP
各种快递查询--Api接口
2016/04/26 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
python多线程扫描端口示例
2014/01/16 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
建筑系毕业生自我鉴定
2014/01/24 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
2015年保送生自荐信
2015/03/24 职场文书
计划生育工作总结2015
2015/04/03 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
公司员工离职感言
2015/08/03 职场文书