利用ForgeryPy生成虚拟数据

在程序研发过程中,我们往往需要大量的虚拟实验数据。Python中有多个包可以用于生成虚拟数据,其中功能较为完善的是ForgeryPy。


0x01 安装

采用pip进行安装:

pip install ForgeryPy


0x02 模块

打开源码:

# -*- coding: utf-8 -*-
# Copyright (C) 2012 by Tomasz Wójcik <labs@tomekwojcik.pl>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

"""Easy to use generator of various forged data."""

from .forgery import address
from .forgery import basic
from .forgery import currency
from .forgery import date
from .forgery import internet
from .forgery import lorem_ipsum
from .forgery import name
from .forgery import personal

ForgeryPy包括了地理位置、日期、网络、名称等大量虚拟生成算法,非常方便我们用来生成虚拟数据。

0x03 例子

#coding:utf-8

import forgery_py

#地理信息(城市)
city=forgery_py.address.city()
#随机颜色
color=forgery_py.basic.hex_color()
#时间
data=forgery_py.date.date(True)
#电子邮箱
email=forgery_py.internet.email_address()
#姓名
name=forgery_py.name.full_name()
#公司
company=forgery_py.name.company_name()
#简介
about=forgery_py.lorem_ipsum.sentence()

print(city)
print(color)
print(data)
print(email)
print(name)
print(company)
print(about)

# 结果
Daly City
19648C
2019-03-08
sean@twimm.info
David Brown
Zoombeat
Nunc purus.

更多好玩的去看源码

使用python检查SSL证书到期情况

结合邮件告警和页面展示,再多的域名证书到期情况即可立马知道

# coding: utf-8 
# 查询域名证书到期情况

import re
import time
import subprocess
from datetime import datetime
from io import StringIO

def main(domain):
    f = StringIO()
    comm = f"curl -Ivs https://{domain} --connect-timeout 10"

    result = subprocess.getstatusoutput(comm)
    f.write(result[1])

    m = re.search('start date: (.*?)\n.*?expire date: (.*?)\n.*?common name: (.*?)\n.*?issuer: CN=(.*?)\n', f.getvalue(), re.S)
    start_date = m.group(1)
    expire_date = m.group(2)
    common_name = m.group(3)
    issuer = m.group(4)

    # time 字符串转时间数组
    start_date = time.strptime(start_date, "%b %d %H:%M:%S %Y GMT")
    start_date_st = time.strftime("%Y-%m-%d %H:%M:%S", start_date)
    # datetime 字符串转时间数组
    expire_date = datetime.strptime(expire_date, "%b %d %H:%M:%S %Y GMT")
    expire_date_st = datetime.strftime(expire_date,"%Y-%m-%d %H:%M:%S")

    # 剩余天数
    remaining = (expire_date-datetime.now()).days

    print ('域名:', domain)
    print ('通用名:', common_name)
    print ('开始时间:', start_date_st)
    print ('到期时间:', expire_date_st)
    print (f'剩余时间: {remaining}天')
    print ('颁发机构:', issuer)
    print ('*'*30)

    time.sleep(0.5)

if __name__ == "__main__":
    domains = ['www.01314.cn', 'www.51bbo.com'] 
    for domain in domains:
        main(domain)

结果

域名: www.01314.cn
通用名: www.01314.cn
开始时间: 2018-10-18 00:00:00
到期时间: 2019-10-18 12:00:00
剩余时间: 307天
颁发机构: Encryption Everywhere DV TLS CA - G1,OU=www.digicert.com,O=DigiCert Inc,C=US
******************************
域名: www.51bbo.com
通用名: 51bbo.com
开始时间: 2018-09-27 00:00:00
到期时间: 2019-09-27 12:00:00
剩余时间: 286天
颁发机构: Encryption Everywhere DV TLS CA - G1,OU=www.digicert.com,O=DigiCert Inc,C=US
******************************

python pdb调试以及sublime3快捷键设置

sublime设置

sublime设置快捷键F5为运行,Ctrl+F5调试。就会对python调试方便很多。

  • Package Control中下载SublimeREPL(Read-Eval-Print-Loop)
  • 首选项 -> 按键绑定-用户 进行设置 

[
  {
    "keys": [
      "f5"
    ],
    "caption": "SublimeREPL: Python - RUN current file",
    "command": "run_existing_window_command",
    "args": {
      "id": "repl_python_run",
      "file": "config/Python/Main.sublime-menu"
    }
  },
  {
    "keys": [
      "ctrl+f5"
    ],
    "caption": "SublimeREPL: Python - PDB current file",
    "command": "run_existing_window_command",
    "args":
    {
        "id": "repl_python_pdb",
        "file": "config/Python/Main.sublime-menu"
    }
  }
]

pdb调试

c(continue): 继续执行,直到下一断点
w(where): 显示当前正在执行的代码行的上下文信息
a(args): 打印当前函数的参数列表
s(step): 执行当前代码行,并停在第一个能停的地方(相当于单步进入)
n(next): 继续执行到当前函数的下一行,或者当前行直接返回(单步跳过)
l(list): 列表,会打印出一个友好的总结,它能够显示出此刻你在代码中的位置
b(break): 动态添加断点,
q(quit): 结束

更多信息直接输入help查看

单步跳过(next)和单步进入(step)的区别在于, 单步进入会进入当前行调用的函数内部并停在里面, 而单步跳过会(几乎)全速执行完当前行调用的函数,并停在当前函数的下一行。

一个有意思的Web API框架:apistar

Github地址:https://github.com/encode/apistar

Install API Star:

$ pip3 install apistar

Create a new project in app.py:

from apistar import App, Route

def welcome(name=None):
    if name is None:
        return {'message': 'Welcome to API Star!'}
    return {'message': 'Welcome to API Star, %s!' % name}

routes = [
    Route('/', method='GET', handler=welcome),
]

app = App(routes=routes)

if __name__ == '__main__':
    app.serve('0.0.0.0', 5000, debug=True)

Run app.py

(py3) [root@localhost star]# python app.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 684-460-626

Open http://localhost:5000/docs/ in your browser:

使用python requests模块来发消息到钉钉自定义机器人webhook

# coding: utf-8

import json
import requests

def dingding_robot(data):
    dingding_robot_token = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxx"

    headers = {'content-type': 'application/json'}
    r = requests.post(dingding_robot_token, headers=headers, data=json.dumps(data))
    r.encoding = 'utf-8'
    return (r.text)

if __name__ == "__main__":
    data = {
        "msgtype": "link", 
        "link": {
            "text":"群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。", 
            "title": "自定义机器人", 
            "picUrl": "", 
            "messageUrl": "https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.Rqyvqo&treeId=257&articleId=105735&docType=1"
        }
    }
    res = dingding_robot(data)
    print (res)

python之IP地址或IP段处理模块-ipaddr

IPy基本处理8位、16位、24位掩码的网段,其他的网段处理起来就会出现问题。

ipaddr是google出的一个模块,很好的可以处理模块IPy不能解决这个问题,所以建议使用模块ipaddr 

IPy模块地址:https://pypi.python.org/pypi/IPy/
ipaddr模块地址:https://pypi.python.org/pypi/ipaddr

使用介绍:

Class总共分为:BaseIP、IPv4、IPv6

ipaddr.IPv4Network()    ipv4网段对象建立

ipaddr.IPv6Network()    ipv6网段对象建立

ipaddr.IPAddress(address, version)    单个ipv4地址对象建立


部分对象方法描述:

Contains()     网段中是否包含某个IP
is_private     是否是私网地址
is_multicast   是否是广播地址
is_loopback    是否是loop地址
IsLoopback     是否是回环地址
IsMulticast    是否是多播地址
broadcast      查看广播地址
hostmask       查看子网掩码
iterhost       创建一个网段中一个IP地址列表的迭代器对象
is_reserved    是否是保留地址


实例讲解:

#!/usr/bin/python
# coding: utf-8

import ipaddr

MIP = "192.168.1.0/29"

### 创建一个网段的对象,ipv4的网段地址
ips = ipaddr.IPNetwork(MIP)

### 查看对象ips的类型
print type(ips)

### 查看网段的广播地址
print ipaddr.IPv4Network(MIP).broadcast

### 查看网段地址的掩码
print ipaddr.IPv4Network(MIP).hostmask

### 创建一个网段中一个IP地址列表的迭代器对象
hosts = ipaddr.IPv4Network(MIP).iterhosts()

### 使用循环读取对象中的每个IP
print type(hosts)
for IP in hosts:
    print IP

Python实例:找第n个默尼森数

经典程序设计问题:找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2**P-1,则称M为默尼森数。例如,P=5,M=2**P-1=31,5和31都是素数,因此31是默尼森数。


# -*- coding: utf-8 -*-
"""
Spyder zrex

This is a temporary script file.
"""

from math import sqrt

def is_prime(n):
    if n == 1:
        return False
    for i in range(2, int(sqrt(n))+1):
        if n % i == 0:
            return False
    return True

def is_monisen(n):
    m = 2 ** n - 1
    if is_prime(m):
        return True

if __name__ == "__main__":
    
    monisen = []
    for n in range(1,20):
        if is_prime(n):
            if is_monisen(n):
                monisen.append(2**n-1)
    print (monisen)

Python模块学习37 — tarfile

The tarfile module makes it possible to read and write tar archives, including those using gzip, bz2 and lzma compression. Use the zipfile module to read or write .zip files, or the higher-level functions in shutil.

官方文档:https://docs.python.org/2.7/library/tarfile.html

  • 打包及重命名文件
>>> import tarfile
# 以w模式创建文件
>>> tar = tarfile.open('tar_file.tar','w')
# 添加一个文件,arcname可以重命名文件
>>> tar.add('/tmp/folder/file.txt', arcname='file.log')
# 添加一个目录
>>> tar.add('/tmp/folder/tmp')                         
# 关闭
>>> tar.close()
  • 查看文件列表
>>> tar = tarfile.open('tar_file.tar','r')             
# 获取包内的所有文件列表
>>> tar.getmembers()
[<TarInfo 'file.log' at 0x7f737af2da70>, <TarInfo 'tmp/folder/tmp' at 0x7f737af2dd90>]
  • 追加
# 以w模式创建文件
>>> tar = tarfile.open('tar_file.tar','a')
>>> tar.add('/tmp/folder/sc.pyc')
>>> tar.close()
>>> tar = tarfile.open('tar_file.tar','r')
>>> tar.getmembers()
[<TarInfo 'file.log' at 0x7ff8d4fa1110>, <TarInfo 'tmp/folder/tmp' at 0x7ff8d4fa11d8>, <TarInfo 'tmp/folder/sc.pyc' at 0x7ff8d4fa12a0>]
  • 解压全部文件
>>> import os
>>> import tarfile
>>> os.system("ls -l")
总用量 12
-rw-rw-r-- 1 ansheng ansheng 10240 5月  26 17:40 tar_file.tar
0
>>> tar = tarfile.open('tar_file.tar','r')
>>> tar.extractall()
>>> tar.close()
>>> os.system("ls -l")
总用量 16
-rw-rw-r-- 1 ansheng ansheng     0 5月  26 16:05 file.log
-rw-rw-r-- 1 ansheng ansheng 10240 5月  26 17:40 tar_file.tar
drwxrwxr-x 3 ansheng ansheng  4096 5月  26 17:48 tmp
0

  • 解压单个文件

如果我们的压缩包很大的情况下,就不能够一次性解压了,那样太耗内存了,可以通过下面的方式进行解压,其原理就是一个文件一个文件的解压。

import tarfile
tar = tarfile.open('tar_file.tar','r')
for n in tar.getmembers():
    tar.extract(n,"/tmp")
tar.close()

Python下安装Numpy、Scipy、Matlotlib等依赖库时需要面对的问题

ImportError: DLL load failed: 找不到指定的模块
ImportError: DLL load failed: The specified module could not be found

安装这些科学计算包,免不了要被多坑几次,这些原因是跟当前的python版本不兼容,多半是通过pip install package或者 easy_install install package 直接安装导致。

所以针对上面问题,最好先卸载之前的问题包,然后使用官方的地址,重新安装

卸载方式:pip uninstall package

然后下载官方包whl:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy
http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib

安装过程中最重要的地方就是版本需要兼容。其中cp27表示CPython 2.7版本,cp34表示CPython 3.4,win_amd64指的是64位版本。在官方顶部位置也有说明。

安装whl文件方法:pip install matplotlib-1.5.1-cp27-none-win_amd64.whl (pip安装whl文件的前提是要先安装wheel包:pip install wheel)


如何使用官方包还有啥问题,那就只能必杀技:套件安装:Anacondawinpython,使用之后整个人都变好了。


备注pip用法:

pip install numpy             --安装包numpy
pip uninstall numpy           --卸载包numpy
pip show --files PackageName  --查看已安装包
pip list outdated             --查看待更新包信息
pip install --upgrade numpy   --升级包
pip install -U PackageName    --升级包
pip search PackageName        --搜索包
pip help                      --显示帮助信息

python获取本机IP方法

python获取本机IP方法,记录下

import fcntl
import struct
import socket

def get_local_ip(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24]) 

local_ip = get_local_ip('eth0')

print local_ip