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 代码优化详解
Oct 27 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
详谈python read readline readlines的区别
Sep 22 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
详解python播放音频的三种方法
Sep 23 Python
Python程序控制语句用法实例分析
Jan 14 Python
Python requests设置代理的方法步骤
Feb 23 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 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
一个MYSQL操作类
2006/11/16 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python自动化生成IOS的图标
2018/11/13 Python
flask-restful使用总结
2018/12/04 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python如何快速生成时间戳
2020/07/21 Python
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
JDO的含义
2012/11/17 面试题
校运会广播稿100字
2014/01/27 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2014年除四害工作总结
2014/12/06 职场文书
捐助倡议书
2015/01/19 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android