腾讯文档多人协作

要多人共同同时操作一个表或者文档时,可以用腾讯文档,石墨文档等,如下面说下腾讯文档

进腾讯文档后,可新建在线文档,在线EXCEL表,在线PPT,在线信息收集表,在线思维图等,创建人有所有权,

如创建在线表格后,可以通过右上解的分享等功能,或者其它人可扫微信等来得到查看和编辑权限,

有编辑权限后就可以一起操作表格了,如可以进行筛选等表格常用操作,可以用数据验证来设置单元格的格式为下位选框,复选框,日期等,

可以套用模板,用插件等

总体比较好用,别人在编辑一个单元格时也会有标示,以免两个人同时编辑一个单元格,但偶尔会出现别人编辑完,你这边还没显示的情况,

下载评论多的抖音视频和相关的评论

抖音有些评论相当的精彩,所以这次用python加fiddler来下载评论多的视频和相应的评论

刚开始打算用fiddler来抓抖音手机APP的包,按如下配置:

1、fiddler只能抓http/https协议的包,默认只能抓http协议包

如果要抓https协议包,需要如下配置:

Tools-Options-HTTPS-依次勾选全部

2、Actions里面-Trust Root Certificate-确定 来trust信用证书

3、Connections,设置端口号,fiddler默认8888

如果是手机用数据线连电脑就要把里面的 允许远程电脑连接也点上

4、如果是模拟器里装抖音或者手机装抖音并通过WIFI连接网络来抓包就在模拟器或者手机里设置网络代理为装fiddler的电脑IP

5、在手机上打开装fiddler的电脑的IP:8888,下载证书安装

按网上这个步骤来会导致抖音上不了网,按分析有可能是抖音应用证书问题,用了SSL Pinning主要就是来防止中间人攻击的,安卓应用会在HTTPS建立时对服务端返回的证书作校验,如果不一致则无法建立连接,我们用到的抓包工具fiddler或burpsuite实际上就是在起一个中间人的作用。具体可以参考https://zhuanlan.zhihu.com/p/511136064,以后再按这个来试下,今天还是按抖音网页版来抓包分析吧,

此段代码放到fiddler中的script的response中

 if (m_Hide304s && oSession.responseCode == 304) {
      oSession["ui-hide"] = "true";
    }
    
    if (oSession.uriContains("https://aweme.snssdk.com/aweme/v1/general/search/single/")){
      var strBody=oSession.GetResponseBodyAsString();
      var sps = oSession.PathAndQuery.slice(-58,);
      //FiddlerObject.alert(sps)
      var timestamp=new Date().getTime();
      var filename = "D:\抖音评论资料" + "/" + sps + timestamp + ".json";
      var curDate = new Date(); 
      var sw : System.IO.StreamWriter; 
      if (System.IO.File.Exists(filename)){ 
        sw = System.IO.File.AppendText(filename); 
        sw.Write(strBody); 
      } 
      else{ 
        sw = System.IO.File.CreateText(filename); 
        sw.Write(strBody); 
      } 
      sw.Close(); 
      sw.Dispose(); 

替换掉上面的网址和保存地址,这样网页版刷抖音时会把评论的JSON文件下载下来,视频信息JSON也同理操作

下载后用python分析JSON数据,把评论数大于36000的视频下载,并把相应的评论,视频信息插入数据库,相关代码见pycharm代码库

后面将把视频和评论在网站上展示出来。

NAT类型

下载并运行《NatTypeTester》,因工具原地址已失效,将STUN server栏中的地址修改成“stun.voipbuster.com”或者stun.qq.com,点击“GET”即可测试类型。

1. Full Cone NAT:NAT1将来自同一个内部元组X的的所有请求转换为同一个外部元组Y,无论这些请求属于同一个应用程序还是多个应用程序。此外,当X-Y转换关系建立后,任何外部主机都可以随时使用Y中的地址和端口作为目标地址和端口,向内部主机发送UDP消息。因为对外部请求的来源没有限制,所以这个方法足够简单,但是不那么安全。(任何外部主机/端口都可以与前一个内部节点映射到的外部元组通信)


2.Restricted Cone NAT:它是Full Cone的受限版本:来自同一个内部元组X的的所有请求都被NAT转换为同一个外部元组Y,与Full
Cone相同,但不同的是只有当内部主机已经向外部主机发送了消息(假设其IP地址为Z)时,
外部主机可以以Y中的信息作为目标地址和端口向内部主机发送UDP请求消息,这意味着NAT设备只转发(转换目标地址/端口)那些来自当前已知外部主机的UDP消息,从而保证了外部请求源的安全性。
(IP相同,端口任意,可以与前一个内部节点映射到的外部Tuple通信)

Port Restricted Cone NAT(NAT3)

端口受限锥型NAT,相比NAT2,NAT3 又增加了端口限制,也就是说IP、端口都会受限。


Symmetric NAT(NAT4) 

对称型NAT,具有端口受限锥型的受限特性,内部地址每一次请求一个特定的外部地址,都可能会绑定到一个新的端口号。也就是请求不同的外部地址映射的端口号是可能不同的。这种类型基本上就告别 P2P 了。


由上面可以看出从NAT1到NAT4限制越来越多,为了各种需求,我们希望提升NAT类型。提升NAT类型的好处有,浏览网页、观看视频、游戏等更顺畅,下载速度更稳定快速,尤其是对喜欢玩游戏的用户,提升NAT类型后更容易进入游戏房间连线等。

IPv6

IPv6地址表示

  我们知道,IPv4地址长度为32位(4个字节)。书写IPv4的地址是用一个字节来代表一个无符号十进制整数,四个字节写成由3个点分开的四个十进制数,例如:

  10.1.123.56

  对于128位的IPv6地址,定义相似的表示方法是必要的。 考虑到IPv6地址的长度是原来的四倍,RFC1884规定的标准语法建议把IPv6地址的128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,这些数之间用冒号(:)分开,例如:

  3ffe:3201:1401:1:280:c8ff:fe4d:db39

  从上面的例子我们看到了手工管理IPv6地址的难度,也看到了DHCP和DNS的必要性。为了进一步简化IPv6的地址表示,可以用0来表示0000,用1来表示0001,用20来表示0020, 用300来表示0300,只要保证数值不便,就可以将前面的0省略。比如:

  1080:0000:0000:0000:0008:0800:200C:417A

  0000:0000:0000:0000:0000:0000:0A00:0001

  可以简写为:

  1080:0:0:0:8:800:200C:417A

  0:0:0:0:0:0:A00:1

  另外,还规定可以用符号::表示一系列的0。那么上面的地址又可以简化为:

  1080::0:8:800:200C:417A

  A00:1

和IPv4一样,IPv6也分公网和内网,开头只要不是F开头,都是公网IP。

国内三大运营商的IPv6地址分配情况分别是:

电信为240e开头的(240e::/20);移动为2409开头的(2409:8000::/20);联通为2408开头的(2408:8000::/20)。 如果外网获取到的是fe80开头的地址,是不能拿来上网的。

fe80::/10,做内网地址,本地链路地址,用于单一链路,适用于自动配置、邻机发现等,路由器不转发以fe80开头的地址,私网地址是fd00::/8,这相当于IPv4的10.0.0.0/8、172.16.0.0/12、192.168.0.0/16

  IPv6地址的前缀(FP, Format Prefix)的表示和IPv4地址前缀在CIDR中的表示方法类似。比如 0020:0250:f002::/48表示一个前缀为48位的网络地址空间。

IPv6:前缀ID+接口ID/前缀长度,如2001:0000:0000:0000:0011:0000:0000:0010/64

IPv6的数字太多,多到地球上每粒沙子都能分配一个,这么多的ip怎么来划分一块一块的呢、如何区分呢?所以就有了前缀这个概念。

IPv6的前缀就是把IPv6的地址,转换为二进制,从左向右的个数。

例如:fe80::/10

这个/10就是fe80的前缀,我们把fe80转换为二进制,就是:1111 1110 1000 0000,我们从左向右数,十位二进制分别为1111 1110 10,这十位是不能动的,就意味着,前缀是不能动的,固定的,只有后面的118位是可以变动的。那么这个二进制后面就可以写为: 1111 1110 1011 1111 11111 11111 1111 1111………….

综上,fe80::/10的ip范围就是:fe80::—-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

比如电信给我家里分配的地址为:240e:fc:b841:700::/56 ,其实就是240e:00fc:b841:0700::,前面不能变动,后面的都属于我,想一想,这得有多少个IPv6,多的数不完。

运营商提供的IPv6线路主要分为支持前缀授权和不支持前缀授权两种,支持前缀授权就是把一整个网段直接给你自己去用,可在路由器设置中开启前缀授权功能,在外部网络/WAN配置里面,连接类型选择Native DHCP即可,有些路由器会是自动获取这个选项,需要注意的是获取到外网IPv6的IP后,可能还需要手动开启内网的DHCP v6用于给该路由器下联的设备分配IP,无特殊需求用默认的stateless即可,设置好路由器的相关参数后,终端(电脑、手机等)勾选IPv6协议,并开启自动获取IPv6地址和DNS服务器即可,

对于不支持前缀授权的运营商线路,无法由路由器给终端分配IPv6地址,终端IPv6地址统一由运营商进行分配,因此需要路由器支持IPV6桥模式,打开桥模式,再把wan和lan的V6功能禁用就可以了

设置好后打开浏览器输入www.test-ipv6.com,就可以看到线路是否支持IPv6了。

::1/128,即0:0:0:0:0:0:0:1,回环地址,就是IPv4中的localhost(127.0.0.1)

RFC1884中指出了三种类型的IPv6地址,他们分别占用不同的地址空间:

  单点传送:这种类型的地址是单个接口的地址。发送到一个单点传送地址的信息包只会送到地址为这个地址的接口。

  任意点传送:这种类型的地址是一组接口的地址,发送到一个任意点传送地址的信息包只会发送到这组地址中的一个(根据路由距离的远近来选择)

  多点传送:这种类型的地址是一组接口的地址,发送到一个多点传送地址的信息包会发送到属于这个组的全部接口。 和IPv4不同的是,IPv6中出现了任意点传送地址,并以多点传送地址代替了IPv4中的广播地址。

  

IPV6地址在线ping

Emoji表情插入Mysql时表字符集要转改成 utf8mb4

问题描述:

  插入Mysql时失败了,python代码报如下异常:

  pymysql.err.InternalError: (1366, “Incorrect string value: ‘\\xF0\\x9D\\x90\\xBF;……

原因分析:

  UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方案:

  修改Mysql表的字符集和Pymysql连接库时的字符集。

  1、修改Mysql表的字符集

    说明:将已经建好的表字符集转改成 utf8mb4,排序规则改为 utf8mb4_bin

    命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)

    注意:排序规则不是 utf8mb4_general_ci,而是utf8mb4_bin,不要想当然

  2、修改数据库连接的字符集        

    conn = pymysql.connect(host=’localhost’, user=’root’, password=’root’, port=3306, db=’cncb’, charset=’utf8mb4′)

安全访问服务边缘 (SASE),SD-WAN

远距离组网一般的解决方案是向ISP购买服务、申请专网、专线,通过对方协助来完成对私有WAN的搭建,

SD-WAN,Software Defined Wide Area Network,即软件定义广域网,是将SDN技术应用到广域网场景中所形成的一种服务,这种服务用于连接广阔地理范围的企业网络、数据中心、互联网应用及云服务。这种服务的典型特征是将网络控制能力通过软件方式‘云化’,支持应用可感知的网络能力开放。

SD-WAN的具体原理与云计算有点相像,将控制机制进行分离,并使网络硬件虚拟化,具有灵活、可靠等优势。

在实际运用方面,SD-WAN不仅可在物理硬件上实现,在软件上也能轻松实现。也就是说,基于SD-WAN的应用不受底层硬件和协议的约束,对公网IP没有要求,甚至可基于Internet之类的公共网络搭建私有WAN。得益于软件层面的特殊性,用户可以对网络进行控制,提升数据传输安全性。

由于SD-WAN对底层硬件的虚拟化,可使流量具备较高的可见性,并将数据进行针对性分流,期间通过多手段进行加速。

SD-WAN优势总结:

1、无需公网IP支持多种连接类型,可利用Internet或4G、5G网络搭建私有WAN,

2、拥有线路选择能力,能够实现负载均衡或分流

3、具备简单、快速的部署过程及管理界面

4、能够支持防火墙、流量控制、虚拟私人网络等服务和应用

SASE将 SD-WAN和网络安全解决方案(FWaaS、CASB、SWG 和ZTNA)融合到统一的云原生服务中。

相比传统VPN的用户名密码的安全接入方案,SASE更强调最小化的安全控制策略,即除了用户认证之外,还对用户所使用的设备、所在的网络环境进行安全认证,解决了传统VPN方案的固有安全隐患。SASE平台上的所有通信都是加密的。

gevent部署python网站

上篇我们用flask部署了一个很简单的网站,但是在开发环境下,不稳定,我们可以用gevent再来部署一个

可以先在命令行pip install gevent装好,然后

from flask import Flask
from gevent import pywsgi
app = Flask(name)

@app.route(‘/’)
def hello_world():
return ‘hello world’

server = pywsgi.WSGIServer((‘0.0.0.0’,12345),app)
server.serve_forever()

if name == ‘main‘:
app.run()

运行后会发现什么信息都没显示,但是用IP:12345正常访问!不知道这算不算是用wsgi 服务启动了!

另外会发现读取 .flaskenv 的值是读取不了,代码如下:

import os

mysql_config = {
‘DIALECT’ : os.getenv(‘MYSQL_DIALECT’),
‘DRIVER’ : os.getenv(‘MYSQL_DRIVER’),
‘USERNAME’ : os.getenv(‘MYSQL_USERNAME’),
‘PASSWORD’ : os.getenv(‘MYSQL_PASSWORD’),
‘HOST’ : os.getenv(‘MYSQL_HOST’),
‘PORT’ : os.getenv(‘MYSQL_PORT’),
‘DATABASE’ : os.getenv(‘MYSQL_DATABASE’)
}
需要加上以下代码才能读取

from dotenv import load_dotenv
load_dotenv(dotenv_path=’.flaskenv’,override=True)

python用flask搭建一个简单网站

我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。

首先我们来安装Flask。最简单的办法就是使用pip,当你装好了python后,直接在命令行下输入。

pip install flask

然后打开一个文件,输入下面的内容并保存为app.py,然后在命令行下换到文件所在目录,再(python app.py)运行该文件。然后浏览器访问IP:5000,我们应当可以看到浏览器上输出了hello world。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'hello world'

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)

路径变量

如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/<converter:varname>。在路径变量前还可以使用可选的转换器,有以下几种转换器。

转换器作用
string默认选项,接受除了斜杠之外的字符串
int接受整数
float接受浮点数
path和string类似,不过可以接受带斜杠的字符串
any匹配任何一种转换器
uuid接受UUID字符串

下面是Flask官方的例子。

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

构造URL

通过构建URL的方式直接在代码中拼URL的原因有两点:
1.将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
2. url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮助我们搞定。

在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for('方法名')来构造对应方法的URL。下面是Flask官方的例子。

>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route('/')
... def index(): pass
...
>>> @app.route('/login')
... def login(): pass
...
>>> @app.route('/user/<username>')
... def profile(username): pass
...
>>> with app.test_request_context():
...  print url_for('index')
...  print url_for('login')
...  print url_for('login', next='/')
...  print url_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe

HTTP方法

如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。

get和post 请求区别:
get是将请求写在url里的。
而post是写在form表单中的。

在route的methods中,写好post方法,否则默认是get,一旦请求方式是post会报错。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

静态文件

Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。

url_for('static', filename='style.css')

模板生成

Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。

使用 Jinja 模板,只需要在python文件中使用render_template函数并传入模板文件名和参数名即可。

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

相应的templates文件夹里的HTML模板文件如下。用两个大括号写变量,用大括号加百分号写语句,访问时输入IP:端口/hello/就可以访问

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

编程资源&&Python常用库

https://github.com/vipstone/faceai python的AI人脸识别等
https://blog.csdn.net/SGDBS233/article/details/119192444 JS库D3使用介绍
echarts.apache.org 百度图表 JS库echarts
https://www.jianshu.com/p/e81a1ee6dca3 用JS实现的3D效果库threejs介绍

superset python轻量级开源可视化BI工具

Python常用库

(1)python模块:包含并且有组织的代码片段为模块。表现形式为:写的代码保存为文件。这个文件就是一个模块。a.py 其中文件名a为模块名字。
(2)python包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。通俗一点:包是一个包含init.py 文件的目录,该目录下一定得有这个init.py文件和其它模块或子包。
(3)库的概念是具有相关功能模块的集合。这也是Python的一大特色之一,即具有强大的标准库、第三方库以及自定义模块。

GUI图形界面

wxPython是Python语言的一套优秀的GUI图形库。允许Python程序员很方便的创建完整的、功能键全的GUI用户界面。 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。

WEB框架

Django是一个开放源代码的Web应用框架,由Python写成。 是Python生态中最流行的开源Web应用框架,Django采用模型、模板和视图的编写模式,称为MTV模式。

Flask是轻量级Web应用框架,相比Django和Pyramid,它也被称为微框架。使用Flask开发Web应用十分方便,甚至几行代码即可建立一个小型网站。Flask核心十分简单,并不直接包含诸如数据库访问等的抽象访问层,而是通过扩展模块形式来支持。

科学计算及数据分析处理及可视化

NumPy 是使用 Python 进行科学计算所需的基础包。用来存储和处理大型矩阵,如矩阵运算、矢量处理、N维数据变换等。

Matplotlib 是一个 Python 的 2D绘图库

SciPy:算法和数据工具集

爬虫相关
requests对HTTP协议进行高度封装,支持非常丰富的链接访问功能。

scrapy很强大的爬虫框架,用于抓取网站并从其页面中提取结构化数据。可用于从数据挖掘到监控和自动化测试的各种用途。

pyspider是一个国人编写的强大的网络爬虫系统并带有强大的WebUI。

bs4-beautifulsoup4库是用于解析和处理HTML和XML。

Crawley是用来高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。

Portia是可视化爬取网页内容。

webbrowser

【标准库】

操纵当前系统的默认浏览器,访问指定 URL 的页面。

代码示例——用默认浏览器打开 Google 主页

import webbrowser
webbrowser.open("http://www.google.com")

机器学习

NLTK是一个自然语言处理的第三方库,NLP领域中常用,可建立词袋模型(单词计数),支持词频分析(单词出现次数)、模式识别、关联分析、情感分析(词频分析+度量指标)、可视化(+matploylib做分析图)等

TensorFlow是谷歌的第二代机器学习系统

Keras 是一个高级神经网络 API,用 Python 编写,能够在 TensorFlow,CNTK 或 Theano 之上运行。它旨在实现快速实验,能够以最小的延迟把想法变成结果,这是进行研究的关键。”
Caffe是一个深度学习框架,主要用于计算机视觉,它对图像识别的分类具有很好的应用效果。

theano是深度学习库。

办公自动化
XlsxWriter-操作Excel工作表的文字,数字,公式,图表等

smtplib-发送电子邮件模块

selenium-一个调用浏览器的driver,通过这个库可以直接调用浏览器完成某些操作,比如输入验证码,常用来进行浏览器的自动化工作

pdfminer-一个可以从PDF文档中提取各类信息的第三方库

pywin32:与windows交互的

其它

pillow:是PIL的友好分支,更友好

Twisted:网络应用程序开发最重要的工具

Pygame:2D游戏开发

Pyglet:3D动画和游戏创作引擎

还有其它:

https://github.com/csy512889371/learnDoc/blob/master/wiki/python.wiki#111_-2

正则表达式疑点

.*和.*?区别

1. .*

. 表示匹配除换行符 \n 之外的任何单字符,*表示零次或多次。所以.*在一起就表示任意字符出现零次或多次。没有?表示贪婪模式。比如a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
又比如模式src=`.*`, 它将会匹配最长的以 src=` 开始,以`结束的最长的字符串。用它来搜索 <img src=“test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=“test.jpg` width=`60px` height=`80px`

2. .*?

?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就是匹配尽可能少的字符。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
又比如模式 src=`.*?`,它将会匹配 src=` 开始,以 ` 结束的尽可能短的字符串。且开始和结束中间可以没有字符,因为*表示零到多个。用它来搜索 <img src=``test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=“。

3. .+?

同上,?跟在*或者+后边用时,表示懒惰模式。也称非贪婪模式。就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.+?b匹配最短的,以a开始,以b结束的字符串,但a和b中间至少要有一个字符。如果把它应用于ababccaab的话,它会匹配abab(第一到第四个字符)和aab(第七到第九个字符)。注意此时匹配结果不是ab,ab和aab。因为a和b中间至少要有一个字符。
又比如模式 src=`.+?`,它将会匹配 src=` 开始,以 ` 结束的尽可能短的字符串。且开始和结束中间必须有字符,因为+表示1到多个。用它来搜索 <img src=“test.jpg` width=`60px` height=`80px`/> 时,将会返回 src=“test.jpg`。注意与.*?时的区别,此时不会匹配src=“,因为src=` 和 ` 之间至少有一个字符。