私信
文章
58
评论
10
点赞
75
原创 40
翻译 3
转载 15

文章
关注
粉丝
收藏

个人分类:

   2019-03-11 15:00:38   

网络
#### 事件   时间:`2019-03-11 9:00`   地点:`搬瓦工一台VPS`   人物:`博主、搬瓦工技术人员`   事件:`搬瓦工上的一台VPS服务器突然失联ssh登陆不了。因为上面搭建了一台邮件服务器,导致本博客的涉及到发邮件的地方都报500错误。不过没什么人访问,影响不大。`    #### 解决过程:   第一时间登陆搬瓦工控制台,重启服务器,结果还是连不上,使用不同的姿势再重试了几次,还是一样。   立马提交了工单给搬瓦工说明的情况,搬瓦工的技术要我试着重启,不行话的重装系统(傻眼)。同时推荐我去 Interactive console(控制台)重启。这句话立马提醒了我,忘了还有控制台可以进去。   立马控制台登陆VPS,看了下网卡,看到的画面是这样的。 ```bash $ ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:83999 errors:0 dropped:0 overruns:0 frame:0 TX packets:83999 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6722103 (6.4 MiB) TX bytes:6722103 (6.4 MiB) ``` 二话不说立马重启网卡,提示报错。 ```bash $ /etc/init.d/network restart Shutting down loopback insterface: [ OK ] Bringing up loopback insterface: [ OK ] Bringing up interface eth0: Device eth0 does not seem to be present,delaying initialization. [FAILED] ```   google了一下,都是类似这种解决方案`rm -rf /etc/udev/rules.d/70-persistent-net.rules&&restart`,试了几次,问题依旧。 于是乎,灵机一动,对比看了搬瓦工上另一台的网卡驱动模块,发现少了当前这台VPS少加载了两个驱动模块virtio_net和virtio_console 当前VPS ```bash $ lsmod |grep net net_failover 20480 1 virtio_net virtio_scsi 20480 2 virtio_pci 24576 0 virtio_ring 20480 4 virtio_scsi,virtio_pci virtio 16384 5 virtio_scsi,virtio_pci,virtio_ring ``` 搬瓦工另一台VPS ```bash $ lsmod |grep net virtio_net 36864 0 net_failover 20480 1 virtio_net virtio_console 24576 1 virtio_scsi 20480 2 virtio_pci 24576 0 virtio_ring 20480 4 virtio_net,virtio_console,virtio_scsi,virtio_pci virtio 16384 5 virtio_net,virtio_console,virtio_scsi,virtio_pci,virtio_ring ``` 然后试着手动加载这两个模块 ```bash $ modprobe virtio_net $ modprobe virtio_console ``` 再重启试试,OK,一切又回归平静。 ```bash $ /etc/init.d/network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining IP information for eth0... done. [ OK ] ``` 购买搬瓦工服务器通道:https://bandwagonhost.com/aff.php?aff=35573
阅读 31 评论 0 收藏 0
阅读 31
评论 0
收藏 0


   2019-03-06 16:56:03   

socks5
认证阶段 首先客户端需要和服务端有个握手认证的过程,可以采用 用户名/密码 认证或者无需认证方式。 格式如下 (数字表示位数) ```bash +----+----------+----------+ |VER | NMETHODS | METHODS | +----+----------+----------+ | 1 | 1 | 1~255 | +----+----------+----------+ ``` VER 字段是当前协议的版本号,也就是 5; NMETHODS 字段是 METHODS 字段占用的字节数; METHODS 字段的每一个字节表示一种认证方式,表示客户端支持的全部认证方式。 - 0x00: NO AUTHENTICATION REQUIRED - 0x01: GSSAPI - 0x02: USERNAME/PASSWORD - 0x03: to X’7F’ IANA ASSIGNED - 0x80: to X’FE’ RESERVED FOR PRIVATE METHODS - 0xFF: NO ACCEPTABLE METHODS 服务端返回格式 ```bash +----+--------+ |VER | METHOD | +----+--------+ | 1 | 1 | +----+--------+ ``` 一般情况下服务端返回两种情况 0x05 0x00:告诉客户端采用无认证的方式建立连接; 0x05 0xff:客户端的任意一种认证方式服务器都不支持。 举个例子, 服务器无需认证的情况如下 ``` client -> server: 0x05 0x01 0x00 server -> client: 0x05 0x00 ``` 连接阶段 认证完成,客户端向服务端发送请求: ```bash +----+-----+-------+------+----------+----------+ |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | +----+-----+-------+------+----------+----------+ | 1 | 1 | 1 | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+ ``` CMD 字段 command 的缩写: - 0x01:CONNECT 建立 TCP 连接 - 0x02: BIND 上报反向连接地址 - 0x03:关联 UDP 请求 RSV 字段:保留字段,值为 0x00 ATYP 字段:address type 的缩写,取值为: - 0x01:IPv4 - 0x03:域名 - 0x04:IPv6 DST.ADDR 字段:destination address 的缩写,取值随 ATYP 变化: - ATYP == 0x01:4 个字节的 IPv4 地址 - ATYP == 0x03:1 个字节表示域名长度,紧随其后的是对应的域名 - ATYP == 0x04:16 个字节的 IPv6 地址 - DST.PORT 字段:目的服务器的端口 服务端返回格式 ```bash +----+-----+-------+------+----------+----------+ |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | +----+-----+-------+------+----------+----------+ | 1 | 1 | 1 | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+ ``` REP 字段 - X'00' succeeded - X'01' general SOCKS server failure - X'02' connection not allowed by ruleset - X'03' Network unreachable - X'04' Host unreachable - X'05' Connection refused - X'06' TTL expired - X'07' Command not supported - X'08' Address type not supported - X'09' to X'FF' unassigned 举个例子,客户端通过 127.0.0.1:8000 的代理发送请求 # request: VER CMD RSV ATYP DST.ADDR DST.PORT client -> server: 0x05 0x01 0x00 0x01 0x7f 0x00 0x00 0x01 0x1f 0x40 # response: VER REP RSV ATYP BND.ADDR BND.PORT server -> client: 0x05 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x10 0x10 传输阶段 接下来就开始传输数据,socks5 服务器只做单纯的转发功能 整个过程如下 ``` 认证阶段 client -> server: 0x05 0x01 0x00 server -> client: 0x05 0x00 连接阶段 client -> server: 0x05 0x01 0x00 0x03 0x0a b'google.com' 0x00 0x50 server -> client: 0x05 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x10 0x10 传输阶段 client -> server -> remote remote -> server -> client ``` 转载:https://zhuanlan.zhihu.com/p/28645864
阅读 27 评论 0 收藏 0
阅读 27
评论 0
收藏 0


   2019-02-28 02:06:46   

openssl PKCS
X.509这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准. #### 一、存储格式 DER `DER:Distinguished Encoding Rules(可辨别编码规则),是ASN.1的一种。 ASN.1:Abstract Syntax Notation One(抽象语法标记),ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。 证书信息一般以二进制的DER格式存储在文件中以供RSA,SSL使用` PEM `DER一般是二进制文件形式存储,打印性较差,因此对DER内容进行base64编码,并补充说明key类型的头和尾就构成了PEM` 因此PEM,DER实质内容是相同的。 查看PEM格式证书 ```bash $ openssl x509 -in certificate.crt -text -noout ``` 查看DER格式证书 ```bash $ openssl x509 -in certificate.der -inform der -text -noout ```    证书编码的转换(转换KEY文件,把x509换成rsa,转换CSR文件,把x509换成req)   pem转为der ```bash $ openssl x509 -in cert.crt -outform der -out cert.der ``` der转为pem ```bash $ openssl x509 -in cert.crt -inform der -outform pem -out cert.pem ```    #### 二、公钥密码学标准 key以一定的结构存储的,不同的结构,补充的元信息也不同主要有两种组织形式PKCS#1,PKCS#8,PKCS#12 PKCS#1 `RSA密码编译标准(RSA Cryptography Standard)` 定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。1.5版本曾经遭到攻击[1]。 PKCS#8 `私钥消息表示标准(Private-Key Information Syntax Standard)` Apache读取证书私钥的标准。 PKCS#12 `个人消息交换标准(Personal Information Exchange Syntax Standard)` 定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。      #### 生成pkcs#1格式的私钥 ```bash $ openssl genrsa -out private_key.pem 1024 ``` #### 从私钥导出pkcs#8公钥 ```bash $ openssl rsa -in private_key.pem -pubout -out public_key.pem ``` #### 转换私钥格式 `pkcs#1 -> pkcs#8` ```bash $ openssl pkcs8 -topk8 -inform PEM -in private.key -outform pem -nocrypt -out pkcs8.pem ``` #### 转换私钥格式 `pkcs#8 -> pkcs#1` ```bash $ openssl pkcs8 -in pkcs8.pem -nocrypt -out pri_key.pem ``` #### 转换公钥格式 `pkcs#8 -> pkcs#1` ```bash $ openssl rsa -pubin -in public_key.pem -RSAPublicKey_out -out pkcs1_public_key.pem ```    #### 三、相关的文件扩展名 CRT `CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.` CER `还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.证书中没有私钥,DER 编码二进制格式的证书文件` KEY `通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.` CSR `Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.做过iOS APP的朋友都应该知道是怎么向苹果申请开发者证书的吧.` PFX/P12 `predecessor of PKCS#12,包含公钥和私钥的二进制格式证书,对nginx服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码。` p7b `以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。` JKS `即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.`    生成pfx文件 ```bash $ openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx ``` pfx转换为pem编码(默认的pfx为der格式) ```bash $ openssl pkcs12 -in certificate.pfx -out certificate.pfx.pem -nodes ``` pfx导出crt和key ```bash $ openssl pkcs12 -in certificate.pfx -nocerts -nodes -out privateKey.key $ openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out certificate.crt ``` crt和key合并成pfx ```bash $ openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx ``` 查看pem格式的key ```bash $ openssl rsa -in mykey.key -text -noout ``` 查看der格式的key ```bash $ openssl rsa -in mykey.key -text -noout -inform der ``` 查看pem格式的csr ```bash $ openssl req -noout -text -in my.csr ``` 查看der格式的csr ```bash $ openssl req -noout -text -in my.csr -inform der ``` 转载:https://blog.51cto.com/wushank/1915795
阅读 27 评论 0 收藏 0
阅读 27
评论 0
收藏 0


   2019-02-27 22:59:30   

openssl 数字签名 加密
`简单介绍:` `公钥加密,私钥解密(数据的安全性):发送方使用接收方的公钥加密的密文,仅有接收方的私钥才可解密,保证了数据的安全。(公私钥加解密的对象是对称加密算法的密码文件或钥匙,对称加密算法加密数据文件)` `私钥签名,公钥验签(数据的不可抵赖性/数据的完整性):接收方使用发送方的公钥验证数字签名(发送方通过自己的私钥对数据摘要信息做签名),验证成功,则数据是不可抵赖。接收方对数据内容做摘要信息同发送方的数字签名的摘要信息做对比,摘要信息一致,则数据是完整无篡改的。` ### openssl使用对称加密算法加密大文件 1、使用aes-128-cbc算法加密文件: ```bash $ openssl enc -e -aes-128-cbc -in abc.txt -out enc_abc.txt ``` 2、使用aes-128-cbc算法解密文件: ```bash $ openssl enc -d -aes-128-cbc -in enc_abc.txt -out abc.txt ``` 3、使用aes-128-cbc算法免交互输入密码加密文件: ```bash $ openssl enc -e -aes-128-cbc -in abc.txt -out enc_abc.txt -pass pass:123456 ``` 4、使用aes-128-cbc算法使用密码文件解密文件: ```bash $ echo 123456 > passwd $ openssl enc -d -aes-128-cbc -in enc_abc.txt -out abc.txt -pass file:123456 ``` ``` 对称加密的使用中,-pass本质是采用key和iv向量进行加密的,-pass会转换成key和iv ``` 5、使用aes-128-cbc算法指定IV和KEY进行加密 ```bash $ openssl enc -e -aes-128-cbc -K 12345 -iv f888 -in abc.txt -out enc_abc.txt -p ``` 6、使用aes-128-cbc算法指定IV和KEY进行解密 ```bash $ openssl enc -d -aes-128-cbc -K 12345 -iv f888 -in enc_abc.txt -out abc.txt ``` 7、不加盐值进行加密(默认会加入随机盐值,如果不加入盐值同时密码一样,则每次加密的密文都是一样的) ```bash $ openssl enc -e -aes-128-cbc -nosalt -in abc.txt -out enc_abc.txt -p ``` ``` key=E10ADC3949BA59ABBE56E057F20F883E iv =65B4AD270B3B98098D256AB32F5B8FBA ``` 8、不加盐值进行解密 ```bash $ openssl enc -d -aes-128-cbc -nosalt -in enc_abc.txt -out abc7.txt -p ``` ``` key=81DC9BDB52D04DC20036DBD8313ED055 iv =CC5776D16A1FB6E4AFA34B18395DA656 ```    ### openssl使用非对称加密算法加密小文件 生成私钥 ```bash $ openssl genrsa -out rsa.key 2048 ``` 通过私钥导出公钥 ```bash $ openssl rsa -in rsa.key -pubout -out pub.key ``` 公钥加密文件 ```bash $ openssl rsautl -encrypt -inkey pub.key -pubin -in abc.txt -out abc_rsa.txt ``` 私钥解密文件 ```bash $ openssl rsautl -decrypt -inkey rsa.key -in abc_rsa.txt -out abc_rsa_de.txt ```    ### openssl使用对称加密算法和非对称加密算法加密大文件 `这里以发送方A和接收方B为例` #### 发送方A A.1 生成随机密码文件 ```bash $ openssl rand -hex 64 -out key.bin ``` A.2 使用加密算法aes-256-cbc和密码文件加密大文件 ```bash $ openssl enc -aes-256-cbc -salt -in largefile.pdf -out largefile.pdf.enc -pass file:./bin.key ``` A.3 使用接收方B的公钥加密密码文件 ```bash $ openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc ``` A.4 发送方A发送加密文件 largefile.pdf.enc(对称加密文件)和key.bin.enc(非对称加密文件/公钥加密文件)以及加密算法-aes-256-cbc给接收方B ``` A----largefile.pdf.enc---->B A-------key.bin.enc------->B A---aes-256-cbc加密算法---->B ``` #### 接收方B B.1 使用接收方B的私钥解密密码文件 ```bash $ openssl rsautl -decrypt -inkey privatekey.pem -in key.bin.enc -out key.bin ``` B.2 使用解密算法aes-256-cbc以及密码文件解密文件 ```bash $ openssl enc -d -aes-256-cbc -in largefile.pdf.enc -out largefile.pdf -pass file:./bin.key ```    ### openssl使用非对称加密做数字签名(私钥签名,公钥验签) `注意:这里只是说明验签过程,没有对data.txt文件进行加密传送,加密请看上面` #### 发送方A 生成数字签名 ```bash $ openssl dgst -sha256 -sign private.key -out signature data.txt ``` A把文件和数字签名一起发送给B ``` A-----data.txt--->B A--signature----->B ```    #### 接收方B 验证数字签名 ```bash $ openssl dgst -sha256 -verify public.key -signature signature data.txt ``` ``` Verified OK 验签成功 Verification Failure 验签失败 ```
阅读 31 评论 0 收藏 0
阅读 31
评论 0
收藏 0


   2019-02-27 13:56:24   

CA openssl 证书
OpenSSL的配置文件说明(查看主要部分) `/etc/pki/tls/openssl.cnf` ```bash [ ca ] default_ca = CA_default # The default ca section [ CA_default ] dir = /etc/pki/CA # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert ```    ### 创建CA #### 一、生成CA相关文件 1.1 创建所需目录以及文件 ```bash $ mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private} $ touch /etc/pki/CA/{serial,index.txt} ``` 1.2 指明证书初始编号 ```bash $ echo 01 >>/etc/pki/CA/serial ``` 1.3 CA创建私钥 ```bash $ (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) ``` 1.4 CA自签名 ```bash $ openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 ``` ``` 命令中用到的选项: -new:表示生成一个新证书签署请求 -x509:专用于CA生成自签证书,如果不是自签证书则不需要此项 -key:生成请求时用到的私钥文件 -out:证书的保存路径 -days:证书的有效期限,单位是day(天),默认是365天 ```    #### 二、生成客户端证书请求 2.1 生成客户端私钥 ```bash $ (umask 077;openssl genrsa -out ynotes.key 2048) ``` 2.2 生成客户端证书签署请求 ```bash $ openssl req -new -key ynotes.key -out ynotes.csr -days 365 ```    #### 三、CA颁发证书 3.1 执行颁发证书操作 ```bash $ openssl ca -in ynotes.csr -out /etc/pki/CA/certs/ynotes.crt -days 365 ```    #### 四、CA吊销证书 4.1 获取客户端证书的serial和subject信息 ```bash $ openssl x509 -in ynotes.crt -noout -serial ``` ``` serial=01 ``` 4.2 执行吊销证书操作 ```bash $ openssl ca -revoke /etc/pki/CA/newcerts/01.pem #01为上面操作返回的serial值 ``` 4.3 生成吊销证书的吊销编号(第一次吊销证书时执行) ```bash $ echo 01 > /etc/pki/CA/crlnumber ``` 4.4 更新证书吊销列表 ```bash $ openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl ``` 4.5 查看crl文件命令 ```bash $ openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text ```    ### 创建自签名证书 #### 1.创建自签名证书 1.1 生成私钥 ```bash $ openssl genrsa -des3 -out server.key 1024 ``` 1.2 删除私钥密码 ```bash $ openssl rsa -in server.key -out server.key ``` 1.3 生成 CSR ```bash $ openssl req -new -key server.key -out server.csr ``` 1.4 生成自签名证书 ```bash $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt ``` 参考:`https://www.cnblogs.com/yangxiaolan/p/6256838.html` ### 其他 #### 通过证书生成证书请求 ```bash $ openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key ``` #### 校验证书请求文件 ```bash $ openssl req -text -noout -verify -in CSR.csr ``` #### 校验私钥文件 ```bash $ openssl rsa -in privateKey.key -check ``` #### 校验证书文件 ```bash $ openssl x509 -in certificate.crt -text -noout ``` #### 校验pkcs12文件 ```bash $ openssl pkcs12 -info -in keyStore.p12 ``` #### 校验证书、请求文件、私钥是否匹配 ```bash $ openssl x509 -noout -modulus -in certificate.crt | openssl md5 $ openssl rsa -noout -modulus -in privateKey.key | openssl md5 $ openssl req -noout -modulus -in CSR.csr | openssl md5 ``` #### 转换格式 DER--->PEM ```bash openssl x509 -inform der -in certificate.cer -out certificate.pem ``` #### 转换格式 PEM--->DER ```bash openssl x509 -outform der -in certificate.pem -out certificate.der ``` #### 转换PKCS#12(.pfx .p12)(包含私钥和证书)--->pem ```bash $ openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes ``` #### pem证书和私钥--->PKCS#12(.pfx .p12)(包含私钥和证书) ```bash $ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt ```
阅读 27 评论 0 收藏 0
阅读 27
评论 0
收藏 0


   2019-01-21 15:19:07   

python
#### 分析 微信认证名中一般都会附带地区名,通过数据库的省市县名和微信名做存在判断(```注意:此方法存在一定概率的误判```) #### 准备 需要省、市、县数据表的数据,需要的话请联系博主 #### 步骤 1.判断对应的省名是否在微信认证名中,如果在,则匹配出数据,并且判断如果是直辖市,获取对应的市级名字,id 2.如果省没匹配成功,则匹配市级数据的名字,如果成功,则获取对应的省名及对应省id 3.如果省市都没匹配成功,则匹配县区级数据的名字,如果成功,则获取对应的省市名及对应省市id ##### 数据表结构 ```sql CREATE TABLE `province` ( `id` bigint(19) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL COMMENT '省份名称', `short_name` varchar(32) DEFAULT NULL COMMENT '省份简称', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `created_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8; CREATE TABLE `city` ( `id` bigint(19) NOT NULL AUTO_INCREMENT COMMENT '标识', `name` varchar(32) NOT NULL COMMENT '城市名称', `short_name` varchar(32) DEFAULT NULL COMMENT '城市简称', `province_id` bigint(19) NOT NULL COMMENT '所属省份标识', `level` int(10) NOT NULL COMMENT '城市等级(0未知,1:一线,2:二线,3:三线,4:四线)', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`,`province_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=7471 DEFAULT CHARSET=utf8; CREATE TABLE `district` ( `id` bigint(19) NOT NULL AUTO_INCREMENT COMMENT '标识', `name` varchar(32) NOT NULL COMMENT '区县名称', `short_name` varchar(32) DEFAULT NULL COMMENT '区县简称', `city_id` bigint(19) NOT NULL COMMENT '所属城市标识', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`,`city_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=10069 DEFAULT CHARSET=utf8; ``` ##### python脚本 ```python vim get_loc.py ``` ```python #coding:utf-8 import pymysql db_host="xx.xx.xx.xx" db_user="root" db_pass="xxxxx" db_port=3306 db_name="xxxx" #微信认证名 file=open("weixin_auth.txt",'r',encoding="utf-8") def execute_query_sql(sql): #循环读取数据库状态是0的关键字100个 db= pymysql.connect(host=db_host,port=db_port,user=db_user, passwd=db_pass, db=db_name) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() #执行sql cursor.execute(sql) results=cursor.fetchall() # 关闭数据库连接 db.close() return results n=1 for f in file.readlines(): #获取省 pro_sql='select id,name from province;' result=execute_query_sql(pro_sql) is_has_pro=False pro_id=-1 city_id=-1 district_id=-1 pro_name="" for result_entry in result: if result_entry[1][0:2] in f: is_has_pro=True pro_name=result_entry[1] pro_id=result_entry[0] #这里写死id if pro_name=="北京市": city_id=7151 if pro_name=="上海市": city_id=7122 if pro_name=="天津市": city_id=7182 if pro_name=="重庆市": city_id=7430 break #获取市 is_has_city=False city_name="" if not is_has_pro: city_sql='select id,name from city where province_id>0;' result=execute_query_sql(city_sql) for result_entry in result: if result_entry[1].replace("市","").replace("县","") in f: is_has_city=True city_name=result_entry[1] city_id=result_entry[0] #获取省id pro_id_sql='select province_id from city where id='+str(city_id)+';' result=execute_query_sql(pro_id_sql) pro_id=result[0][0] break #获取区县 is_has_district=False district_name="" if not is_has_city and not is_has_pro: district_sql='select id,name from district where city_id>0;' result=execute_query_sql(district_sql) for result_entry in result: if result_entry[1].replace("市","").replace("县","") in f: is_has_district=True district_name=result_entry[1] district_id=result_entry[0] #获取市id city_id_sql='select city_id from district where id='+str(district_id)+';' result=execute_query_sql(city_id_sql) city_id=result[0][0] #获取省id pro_id_sql='select province_id from city where id='+str(city_id)+';' result=execute_query_sql(pro_id_sql) pro_id=result[0][0] break #打印对应的id #获取名字 if pro_id>0: sql='select name from province where id='+str(pro_id)+';' result=execute_query_sql(sql) pro_name=result[0][0] if city_id>0: sql='select name from city where id='+str(city_id)+';' result=execute_query_sql(sql) city_name=result[0][0] if district_id >0: sql='select name from district where id='+str(district_id)+';' result=execute_query_sql(sql) district_name=result[0][0] n+=1 print("当前执行到第"+str(n)+"行") print(f.strip()+","+str(pro_id)+","+str(city_id)+","+str(district_id)+","+pro_name+","+city_name+","+district_name+"\n") #把数据保存在文件中 file2=open("weixin_auth_loc.txt",'a',encoding="utf-8") file2.write(f.strip()+","+str(pro_id)+","+str(city_id)+","+str(district_id)+","+pro_name+","+city_name+","+district_name+"\n") file2.close() ```
阅读 30 评论 0 收藏 0
阅读 30
评论 0
收藏 0


第 2 页 / 共 10 页