电子邮件编程、json、API、天气、钉钉机器人

昨天回顾

  • 正则表达式

    • re模块
  • python 的第三方包

    • 在线安装

      pip3 install 包名
      pip install 包名

  • pymysql 模块

  • subprocess 模块

  • 多线程 threading 模块

paramiko 模块

此模块实现了 ssh 客户端的功能

ssh 命令 可以远程登录一台主机并远程操作这台主机

  • 安装 paramiko

pip3 install paramiko

  • 示例

    # 导入 paramiko 模块
    import paramiko
    
    # 创建一个paramko 客户端对象
    ssh_clint = paramiko.SSHClient()
    
    # 设置自动接受服务器的主机密钥
    ssh_clint.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    # 登陆远程主机
    ssh_clint.connect('192.168.1.64',   # 远程主机的IP
        username='root',  # 远程主机的用户名
        password='root',  # 远程主机的密码
        port=22  # ssh 的端口号
    )
    
    # 在此处操作远程主机
    result = ssh_clint.exec_command('id root; id zhangsan')   # 在远程主机上执行命令
    # print('len(result)=', len(result))  # result 绑定三个文件流对象的元组
    
    stdout = result[1]   # 得到标准输出
    stderr = result[2]   # 得到标准错误输出
    print("标准输出:", stdout.read().decode())
    print("标准错误输出:", stderr.read().decode())
    
    ssh_clint.exec_command('mkdir 魏老师的专用文件夹')
    
    # 关闭连接
    ssh_clint.close()  # 相当于在ssh 的内部执行  exit 命令
    

python 的电子邮件编程

  • 两个内建模块

    email 模块, 用于准备邮件内容的模块
    smtplib 模块, 用于与邮件服务器连接并发送邮件的模块
    
  • 使用 QQ 邮箱来发送电子邮件

    • 两步
      1. 配置QQ邮箱, 开启SMTP服务的设置, 获取验证码
      2. 编写 python 程序发送邮件
  • 配置 QQ邮箱的SMTP 服务

    • 网址: mail.qq.com

    • 授权码:

      aaaa bbbb cccc dddd

实验手册见: http://tedu.weimingze.com/static/py_library/python_email.html

json

json 全称( Javascript Object Notation) , 是一种轻量级的数据交互格式

json 是基于 Javascript 编程语言的格式

JSON 采用完全独立于编程语言的文本格式

标准JSON的合法符号:

  • {}(大括号)

  • "(双引号)

  • :(冒号)

  • ,(逗号)

  • [ ](中括号)

Json 的数据类型

  • 对象 object {}
  • 数组 array []
  • 字符串 string ""
  • 数值 number (整数和浮点数)
  • 布尔值 bool (true/false)
  • 空值: null

字典中的两个人

[
  {
    'name': 'weimingze',
    'age': 35
  },
  {
    'name': '小王',
    'age': 18,
    'score': [90, 100, 85]
  },
]

JSON中的两个人

[
  {
    "name": "weimingze",
    "age": 35
  },
  {
    "name": "小王",
    "age": 18,
    "score": [90, 100, 85]
  },
]
  • json 和 Python 的类型和值
Python Json
dict {}object(对象)
list, tuple []array数组
str "" string 字符串
int, float number 数字
True/False true/false
None null
  • json 模块

    内建模块

import json

json模块的四个常用函数

函数 说明
json.dump(obj, fw) 把python 对象编码为json 字符串并写入文件fw中
json.dumps(obj) 把python 对象编码为json 字符串并返回
json.load(fr) 从文件流对象fr中读取json数据解码后返回python对象
json.loads(json) 从json 字符串中解码Python 对象

示例见:

>>> infos = [
  {
   'name': 'weimingze',
   'age': 35,
   'gender': True,
   'score': None
  },
  {
   'name': '小王',
   'age': 18,
   'score': [90, 100, 85]
  },
]
>>> infos
[{'name': 'weimingze', 'age': 35, 'gender': True, 'score': None}, {'name': '小王', 'age': 18, 'score': [90, 100, 85]}]
>>> 
>>> import json
>>> s = json.dumps(infos)  # 将infos 绑定的对象转为json 的字符串
>>> s
'[{"name": "weimingze", "age": 35, "gender": true, "score": null}, {"name": "\\u5c0f\\u738b", "age": 18, "score": [90, 100, 85]}]'
>>> objs = json.loads(s)  # 将 json 的字符串,转为 python 的对象
>>> objs
[{'name': 'weimingze', 'age': 35, 'gender': True, 'score': None}, {'name': '小王', 'age': 18, 'score': [90, 100, 85]}]
>>> type(objs)
<class 'list'>

API

Application Programming Interface 应用程序接口。在Web中,API 通常指HTTP协议的接口

requests 模块

  • 作用

    发送HTTP 协议的请求,得到服务器响应的数据

    模拟浏览器的行为

  • 安装方法:

    pip3 install requests

  • HTTP 协议的请求方式:

    1. GET 请求

      相当于查看 ,get请求可以获取网站的数据,请求参数通常跟在URL 的后面

    2. POST请求

      原意是创建或者添加, post请求通常用于提交表单或上传文件等

    https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E9%AA%B0%E5%AD%90&fenlei=256&rsv_pq=854e3d6f00038104&rsv_t=920aUYsotvE%2BTTV%2B4%2Fpf%2Fv1geYxMZTZFzMYCH5Fw%2Bg%2FZaWsk5SmRve30MRQ&rqlang=cn&rsv_enter=1&rsv_dl=ih_2&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsv_btype=i&rsp=2&rsv_sug9=es_2_1&inputT=7546&rsv_sug4=8033&rsv_sug=9

  • 示例

    使用request模块获取网页数据

    >>> import requests
    # 向 https://www.baidu.com/s?wd=weimingze 发送GET请求得到响应
    >>> r = requests.get('https://www.baidu.com/s?wd=weimingze')
    >>> r.text  # 得到响应内容的文本信息
    '<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'
    >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg')
    >>> r.content  # 响应的字节串
    
  • 使用request模块下载文件

    >>> import requests
    >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg')
    >>> r.content  # 响应的字节串
    # 下载图片
    >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg')
    >>> 
    >>> with open('benz.jpg', 'wb') as fw:
    ...      fw.write(r.content)  # 将 响应的内容(bytes) 写入文件
    ... 
    155157
    
  • 用request模块获取 中国天气网的json 数据

    >>> import requests
    >>> url = 'http://www.weather.com.cn/data/sk/101010100.html'
    >>> r = requests.get(url)
    >>> r.content  # 返回字节串
    b'{"weatherinfo":{"city":"\xe5\x8c\x97\xe4\xba\xac","cityid":"101010100","temp":"27.9","WD":"\xe5\x8d\x97\xe9\xa3\x8e","WS":"\xe5\xb0\x8f\xe4\xba\x8e3\xe7\xba\xa7","SD":"28%","AP":"1002hPa","njd":"\xe6\x9a\x82\xe6\x97\xa0\xe5\xae\x9e\xe5\x86\xb5","WSE":"<3","time":"17:55","sm":"2.1","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}'
    >>> r.json()  # 将字节串,转化为python 的对象,相当于 json.loads(r.content.decode())
    {'weatherinfo': {'city': 'å\x8c\x97京', 'cityid': '101010100', 'temp': '27.9', 'WD': 'å\x8d\x97é£\x8e', 'WS': 'å°\x8fäº\x8e3级', 'SD': '28%', 'AP': '1002hPa', 'njd': 'æ\x9a\x82æ\x97\xa0å®\x9eå\x86µ', 'WSE': '<3', 'time': '17:55', 'sm': '2.1', 'isRadar': '1', 'Radar': 'JC_RADAR_AZ9010_JB'}}
    >>> r.encoding  # 查看当前的字符编码
    'ISO-8859-1'
    >>> r.encoding = 'utf8' # 将编码改为 UTF-8
    >>> r.json()
    {'weatherinfo': {'city': '北京', 'cityid': '101010100', 'temp': '27.9', 'WD': '南风', 'WS': '小于3级', 'SD': '28%', 'AP': '1002hPa', 'njd': '暂无实况', 'WSE': '<3', 'time': '17:55', 'sm': '2.1', 'isRadar': '1', 'Radar': 'JC_RADAR_AZ9010_JB'}}
    
  • requests.get ()为连接添加查询字符串使用params 字典完成

    import requests
    
    url = 'https://www.sogou.com/web'
    # https://www.sogou.com/web?query=linux
    s = input('请输入查询的内容:')
    params = {'query': s}
    r = requests.get(url, params=params)  # 发出get请求,传入 ?query=s 查询字符串
     # 相当于请求:https://www.sogou.com/web?query=linux
    with open('sogou_' + s + '.html', 'wb') as fw:
        fw.write(r.content)   # 把 r.content 字节串写入文件
    
    # https://www.sogou.com/web?query=linux
    s = input('请输入查询的内容:')
    params = {'query': s}
    r = requests.get(url, params=params)  # 发出get请求,传入 ?query=s 查询字符串
     # 相当于请求:https://www.sogou.com/web?query=linux
    with open('sogou_' + s + '.html', 'wb') as fw:
        fw.write(r.content)   # 把 r.content 字节串写入文件
    
  • request 可以通过 headers 传递请求头

    url = 'https://www.sogou.com/web'
    params = {'query': 'linux'}
    headers = {
     'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
    }   # 带上 'User-Agent' 请求头,把自己伪装成浏览者
    r = requests.get(url, params=params, headers=headers)
    r.text  # 返回网页的内容
    
  • 完整代码:

import requests

url = 'https://www.sogou.com/web'
# https://www.sogou.com/web?query=linux
s = input('请输入查询的内容:')
params = {'query': s}
headers = {
 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}   # 带上 'User-Agent' 请求头,把自己伪装成浏览者

r = requests.get(url, params=params, headers=headers)  # 发出get请求,传入 ?query=s 查询字符串
 # 相当于请求:https://www.sogou.com/web?query=linux
with open('sogou_' + s + '.html', 'wb') as fw:
 fw.write(r.content)   # 把 r.content 字节串写入文件

python 实验

自己实现

阿里云开发者平台

网址: www.aliyun.com

实验手册参见: http://tedu.weimingze.com/static/py_library/python_ali_api.html

AppCode:

e3e8438c45584a768f11eef0a99f2b9a

  • 示例代码
import requests

# API 的地址
url = 'http://jisuqgtq.market.alicloudapi.com/weather/query'

# 请求头
headers = {
    # 根据API的要求,定义相对应的Content - Type
    'Content-Type': 'application/json; charset=UTF-8',
    # 权限指定 APPCODE
    'Authorization': 'APPCODE e3e8438c45584a768f11eef0a99f2b9a'
}

# 设置查询参数
params = {'citycode': '101010100'}  # 城市代码

r = requests.get(url, headers=headers, params=params)
# print('r.json=', r.text)  # json 数据
# r 即为相应对象其中包括天气信息
data = r.json()  # data 绑定字典
# print(data)
# 使用pprint 模块进行打印
import pprint
# pprint.pprint(data)

print('今晚的最低温度:')
pprint.pprint(data['result']['daily'][0]['night']['templow'])

使用钉钉机器人

实验手册:http://tedu.weimingze.com/static/py_library/python_dingtalk.html

webhook API

https://oapi.dingtalk.com/robot/send?access_token=5c55ff3b8f338041a4b04e82c13c2fea3ff3edf3844fde2d99261607aae54a57

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 上网原理 1、爬虫概念 爬虫是什麽? 蜘蛛,蛆,代码中,就是写了一段代码,代码的功能从互联网中提取数据 互联网: ...
    riverstation阅读 8,020评论 1 2
  • title: python语法练习 参考阮一峰等多个文件用来练习python基本语法 [TOC] import文件...
    采香行处蹙连钱阅读 2,352评论 0 2
  • 爬虫的基本流程 一、发送HTTP请求(Request)通过Python库向目标站点发送HTTP请求,等待服务器响应...
    晓枫_0544阅读 753评论 0 0
  • 缘起: 早上和小伙伴提到了说自律的最高境界是把构造他律,也就是把自己放在一个受监督的环境下。 于是我想找个人监督我...
    王兵阅读 8,848评论 5 7
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53