☰
Python-100-Days 公开课实战:用 Python 玩转图像处理、微信群发与热点新闻推送
2026/9/30 6:42:12 网站建设 项目流程
  • 文档
  • 教程

【免费下载链接】Python-100-Days

Python - 100天从新手到大师

项目地址:https://gitcode.com/GitHub_Trending/py/Python-100-Days
点击查看免费下载

本篇文章源自 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 最直观的四个优点:

  1. 帮助系统:使用?或??可以获取对象、函数、方法的帮助文档,??还能看到源码级别的信息;
  2. 系统命令:使用!前缀可以直接调用系统命令,例如!ls、!pwd,无需退出交互式环境;
  3. 自动补全:键入变量或函数名的前几个字符后按 Tab 键,即可自动补全或弹出候选列表;
  4. 魔法指令:内置%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天从新手到大师

项目地址:https://gitcode.com/GitHub_Trending/py/Python-100-Days
点击查看免费下载
上一篇:GitHub_Trending/ad/adk-samples音频制作代理:播客脚本与剪辑建议生成
下一篇:终极对比分析:I-SOLAR-10.7B与其他韩语大模型的性能差异完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询