- 文档
- 教程
【免费下载链接】Python-100-Days
Python - 100天从新手到大师
本篇文章源自 Python-100-Days 项目「第04次公开课-好玩的Python」的内容,是一份面向初学者的趣味实战指南:全程只需要 Python 的交互式环境与少量三方库,就能完成"代码 P 图"、"向微信好友群发祝福视频"、"不用客户端查看热点新闻"三个真实可运行的小项目。读完本文,你将掌握 ipython 的高效交互技巧、Pillow 图像处理 API、itchat 微信接口的基本用法,以及 requests 抓取接口数据并配合短信网关做消息推送的完整流程。
环境准备:用 ipython 打造好玩的交互式环境
本节所有代码都非常简单,简单到直接在交互式环境中就能运行。官方 Python 自带的交互式环境(REPL)功能相对简陋,推荐使用 ipython 替代。安装只需一条命令:
pip install ipython如果系统中同时存在 Python 2 和 Python 3 等多套环境,也可以使用:
pip3 install ipython安装成功后,在终端键入ipython命令即可进入交互式环境。ipython 最直观的四个优点:
- 帮助系统:使用
?或??可以获取对象、函数、方法的帮助文档,??还能看到源码级别的信息; - 系统命令:使用
!前缀可以直接调用系统命令,例如!ls、!pwd,无需退出交互式环境; - 自动补全:键入变量或函数名的前几个字符后按 Tab 键,即可自动补全或弹出候选列表;
- 魔法指令:内置
%timeit、%run、%pdb等魔法命令,例如%timeit可以精确测量一小段代码的执行耗时,这对入门阶段调试代码非常友好。
没有工具用代码也能 P 图
安装 Pillow
PIL(Python Imaging Library)是 Python 平台上事实上的图像处理标准库,功能强大且 API 简单易用。但 PIL 仅支持到 Python 2.7,且长期无人维护;于是一群志愿者在 PIL 基础上创建了兼容的继承者——Pillow,它既支持 Python 3.x,又加入了许多有用且有趣的新特性。安装命令:
pip install pillow同样,多环境情况下可使用:
pip3 install pillow加载图片
Pillow 的核心是Image类,通过Image模块的open函数读取图片并获得Image对象:
from PIL import Image chiling = Image.open('chiling.jpg') chiling.show()Image对象还提供了三个查看图像基本信息的重要属性:format(图像格式,如 JPEG)、size(图像的宽高尺寸)、mode(图像模式,如 RGB)。在仓库配套文档 Day21-30/28.Python处理图像.md 中,这些属性均有完整示例;该文档还系统讲解了 RGB/RGBA 颜色模型与像素概念——计算机中红、绿、蓝三种色光以不同比例叠加即可组合出其他颜色,图像最小单位就是带有明确位置和色彩数值的像素。
使用滤镜
ImageFilter模块提供了多种预设滤镜,配合filter方法一行代码即可完成风格化处理:
from PIL import ImageFilter chiling.filter(ImageFilter.EMBOSS).show() chiling.filter(ImageFilter.CONTOUR).show()其中EMBOSS产生浮雕效果,CONTOUR提取图像轮廓。ImageFilter还内置了GaussianBlur(高斯模糊)、BLUR(模糊)、SHARPEN(锐化)等常用滤镜,且支持自定义滤镜。
图像剪裁和粘贴
指定一个四元组(left, top, right, bottom)作为剪裁区域,即可用crop方法取出图像局部;剪裁出的局部还能继续叠加滤镜,再通过paste方法贴回原图:
rect = 220, 690, 265, 740 watch = chiling.crop(rect) watch.show() blured_watch = watch.filter(ImageFilter.GaussianBlur(4)) chiling.paste(blured_watch, (220, 690)) chiling.show()这段代码演示了一个非常实用的"局部打码"思路:把照片中手表所在区域裁出来,施加高斯模糊后贴回原位,敏感细节就被隐藏了。值得注意的是,paste粘贴的图像尺寸必须与目标位置匹配;如果需要调整尺寸,可以使用resize方法。在 Day21-30/28.Python处理图像.md 中就有先crop出吉多的头像、再用resize调整大小后paste到另一张照片上的完整案例。
生成镜像
利用transpose方法配合翻转常量,可以快速生成水平镜像或垂直翻转的图像:
chiling2 = chiling.transpose(Image.FLIP_LEFT_RIGHT) chiling2.show()Image.FLIP_LEFT_RIGHT表示水平翻转(左右镜像),Image.FLIP_TOP_BOTTOM表示垂直翻转;此外transpose还支持Image.ROTATE_90、ROTATE_180、ROTATE_270等旋转模式,rotate方法则可以实现任意角度的旋转。
生成缩略图
thumbnail方法会按比例把图片缩小到指定尺寸范围内,是批量处理图片、生成预览图的常用手段:
width, height = chiling.size width, height = int(width * 0.4), int(height * 0.4) chiling.thumbnail((width, height))注意thumbnail是原地修改Image对象,且会保持原始宽高比,不会产生变形。
合成图片
把两张处理好的图片粘贴到同一个画框中,就能拼出一张完整的合成图:
frame = Image.open('frame.jpg') frame.show() frame.paste(chiling, (210, 150)) frame.paste(chiling2, (522, 150)) frame.show()仓库配套的完整图像处理脚本
公开课目录下提供了配套脚本 公开课/第04次公开课-好玩的Python/code/example01.py,将上述滤镜、镜像、模糊、缩略图操作串成了一段可整体运行的代码:
from PIL import Image, ImageFilter chiling = Image.open('resources/chiling.jpg') width, height = chiling.size chiling.show() chiling.transpose(Image.FLIP_LEFT_RIGHT).show() chiling.filter(ImageFilter.GaussianBlur(4)).show() chiling.filter(ImageFilter.EMBOSS).show() chiling.thumbnail((width // 4, height // 4)) chiling.show()与本文中的逐步演示相比,该脚本把整图尺寸的 1/4 作为缩略图目标,展示了//整除运算在图像尺寸计算中的实际应用。需要说明的是,脚本运行前要在脚本所在目录准备resources/chiling.jpg图片文件。
更进一步:用 Pillow 绘图
如果觉得"P 图"还不够尽兴,Pillow 还提供了ImageDraw模块用于凭空作画:ImageDraw.Draw函数返回ImageDraw对象,通过其arc、line、rectangle、ellipse、polygon等方法可以绘制圆弧、线条、矩形、椭圆、多边形等图形,通过text方法可以在图像上添加文字。在 Day21-30/28.Python处理图像.md 中,就有一段生成 800×600 随机彩色图案的完整示例——用Image.new创建空白画布、ImageFont.truetype加载字体、ImageDraw绘制对角线和椭圆,最后image.save('result.png')保存成文件,所用字体文件需要自行准备并放置在代码目录下。
向微信好友群发祝福视频
安装 itchat 并登录
itchat 是一个开源的微信个人号接口,它让"用 Python 调用微信"变得非常简单。安装命令:
pip install itchat多环境情况下使用:
pip3 install itchat登录只需一行代码:
import itchat itchat.auto_login()运行后用微信扫描屏幕上出现的二维码即可完成登录,登录之后才能获取好友信息以及向好友发送消息。
获取好友列表
get_friends方法返回所有好友的信息列表,列表的第一个元素就是自己:
friends_list = itchat.get_friends(update=True) print(len(friends_list)) luohao = friends_list[0] props = ['NickName', 'Signature', 'Sex'] for prop in props: print(luohao[prop])每个好友是一个字典对象,NickName(昵称)、Signature(签名)、Sex(性别)、City(城市)等都是它的字段;update=True表示强制从服务端刷新数据。
随机选出幸运好友
用random.sample从好友列表中随机抽样 5 人(从索引 1 开始,即排除自己),并逐个打印他们的信息:
lucky_friends = random.sample(friends_list[1:], 5) props = ['NickName', 'Signature', 'City'] for friend in lucky_friends: for prop in props: print(friend[prop] or '没有此项信息') print('-' * 80)这里friend[prop] or '没有此项信息'利用了or运算符的短路特性,当字段值为空时输出兜底文案。
发送文字消息
send_msg方法可以向指定好友发送文本消息,toUserName参数是好友的唯一标识:
itchat.send_msg('急需一个红包来拯救堕落的灵魂!!!', toUserName='@8e06606db03f0e28d0ff884083f727e6')群发视频
把"随机抽 5 人 + 发送视频"组合起来,就能向幸运好友群发祝福视频,视频路径需要替换为本地实际文件路径:
lucky_friends = random.sample(friends_list[1:], 5) for friend in lucky_friends: username = friend['UserName'] itchat.send_video('/Users/Hao/Desktop/my_test_video.mp4', toUserName=username)itchat 还能做什么
利用 itchat 还能做很多事情:
- 查看撤回的消息:注册一个接收消息的钩子函数(
@itchat.msg_register),当好友发消息又撤回时,就能在本地捕获并查看被撤回的内容; - 检测好友关系:想知道某个好友是否把自己删除或拉入黑名单,可以利用 itchat 封装的群聊功能——非好友和黑名单用户不会被拉入群聊,通过创建群聊函数的返回值即可判定你和指定用户之间的关系。
需要提醒的是,微信个人号接口存在账号风控风险,自动化操作需谨慎使用、控制频率,并遵守微信平台的使用规则。
不用客户端查看热点新闻
安装 requests
requests 是 Python 生态中最流行的 HTTP 请求库,它把 URL 请求、会话管理、JSON 解析等能力封装得极其简洁。安装命令:
pip install requests多环境情况下使用:
pip3 install requests仓库公开课目录下提供了 requests 官方文档首页的截图 公开课/第04次公开课-好玩的Python/res/requests.png,可以看到该库支持的 Python 版本与安装说明入口,是理解"requests 让 HTTP 服务人类"这一口号的最佳注脚。
通过 API 获取新闻数据
爬取新闻数据通常有两种途径:直接爬取页面,或调用现成的数据接口。本例使用"天行数据"提供的新闻聚合接口(需自行注册并申请 Key):
import requests resp = requests.get('http://api.tianapi.com/allnews/?key=请使用自己申请的Key&col=7&num=50')调用接口时需要把key参数替换为注册成功后系统分配的 key,col指定栏目编号,num指定返回条数(此处为 50 条)。
反序列化并筛选新闻
接口返回的是 JSON 字符串,用json.loads将其解析为字典,取出newslist新闻列表:
import json newslist = json.loads(resp.text)['newslist']然后循环遍历,筛选出自己感兴趣的新闻(例如标题中包含"华为"):
for news in newslist: title = news['title'] url = news['url'] if '华为' in title: print(title) print(url)调用短信网关推送新闻到手机
找到感兴趣的新闻后,可以把标题和链接通过短信发送到手机上。本例使用"螺丝帽"短信网关服务(发送短信需要付费,但一般平台会提供若干条免费测试短信),先用正则从原始 URL 中提取出可拼接的路径部分:
import re pattern = re.compile(r'https*:\/\/[^\/]*\/(?P<url>.*)') matcher = pattern.match(url) if matcher: url = matcher.group('url') resp = requests.post( url='http://sms-api.luosimao.com/v1/send.json', auth=('api', 'key-请使用你自己申请的Key'), data={ 'mobile': '13548041193', 'message': f'发现一条您可能感兴趣的新闻 - {title},详情点击https://news.china.com/{url} 查看。【Python小课】' }, timeout=10, verify=False )这段代码的要点:
auth参数传入('api', 'key-...')形式的 HTTP Basic 认证元组,其中 key 需要替换为你自己的密钥;data中的mobile是接收短信的手机号,message是短信内容;timeout=10设置请求超时时间,避免网络异常时长时间阻塞;verify=False表示跳过 SSL 证书校验(仅适合测试环境,生产环境应保留证书校验)。
重要说明:发送短信必须遵守平台规则,违规短信无法发送。上面短信中使用的模板("发现一条您可能感兴趣的新闻 - ###,详情点击https://news.china.com/### 查看。")和短信签名("【Python小课】")需要登录螺丝帽管理平台提前配置,若不熟悉配置流程,可以联系平台客服咨询。
小结
本公开课的三个小项目覆盖了 Python 生态中三组高频三方库:ipython(交互式开发)、Pillow(图像处理)、itchat(微信接口)与 requests(HTTP 请求)+ json(数据解析)的组合。它们共同展示了编程的乐趣所在——日常中许多繁琐乏味的任务(P 图、群发消息、盯新闻)都可以通过几十行 Python 代码自动完成。相关技能在 Day21-30/28.Python处理图像.md 中有更系统的讲解(RGB 颜色模型、像素、crop/thumbnail/paste/transpose/filter/rotate/putpixel等 API 及ImageDraw绘图),公开课配套脚本 公开课/第04次公开课-好玩的Python/code/example01.py 则可以直接运行体验。继续学习 Python-100-Days 的后续内容,你会发现 Python 能做的事情远不止这些。
- 文档
- 教程
【免费下载链接】Python-100-Days
Python - 100天从新手到大师
相关推荐
终极FF14钓鱼计时器:渔人的直感完整使用指南
终极FF14钓鱼计时器:渔人的直感完整使用指南 你是否在《最终幻想14》中为错过幻海流而懊恼?是否因为分心而错失稀有鱼种? 渔人的直感 ,这款专为FF14钓鱼爱
桌面应用Python-100-Days项目部署与运维实战
Python 100 Days项目部署与运维实战 本文详细介绍了Python 100 Days项目的完整部署与运维实战方案,涵盖Docker容器化部署、环境配置
文档教程LastAdapter vs 传统适配器:性能对比与最佳实践指南
LastAdapter vs 传统适配器:性能对比与最佳实践指南 还在为Android开发中的RecyclerView适配器编写而烦恼吗?LastAdapter
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考