用Python蹭别人家图片接口,做一个【免费图床】吧

news/2024/5/18 12:03:12/文章来源:https://blog.csdn.net/hihell/article/details/128052624

打开本文,相信你确实需要一个免费且稳定的图床,这篇博客就让你实现。

文章目录

    • ⛳️ 谁家的图床
    • ⛳️ 实战编码
    • ⛳️ 第一轮编码
    • ⛳️ 第二轮编码
    • ⛳️ 第三轮编码
    • ⛳️ 第四轮编码

⛳️ 谁家的图床

这次咱们用新浪微博来实现【免费图床应用】,通过代码实现图片上传,然后再进行移花接木,获取图片可读地址。

正式编码前,先做一下准备工作。

  1. 注册一个微博账号,或者用自己旧的也行;
  2. 安装 Python 环境;
  3. 安装 requests 模块。

上述后两步,作为一个合格的 Python 程序员,相信对你来说没有任何难度。

本案例不做自动化微博登录,直接获取 Cookie 信息。

⛳️ 实战编码

首先通过操作微博各个终端界面,找到最简单的图片上传接口和对应参数。

在切换到苹果设备访问时,得到如下界面,发现一个精选图片上传按钮。

在这里插入图片描述

点击按钮之后,任选一张图片,得到如下接口信息。

接口地址:https://m.weibo.cn/api/statuses/uploadPic
参数表如下(关键信息自行获取即可,博客中进行打码操作):

  • type: json
  • pic: (二进制)
  • st: 参数值位置
    _spr: screen:390x844

其中 pic 是图片的二进制编码,一会实战的时候,我们可以对参数表进行删项测试,查看哪些为必填参数。

用户上传图片时,还必须携带 cookie 值,这个通过开发者工具获取即可。

⛳️ 第一轮编码

既然知道请求接口和参数了,那直接使用 requests 模块,模拟用户上传操作,查看一下效果。

import requestsdef upload_img():headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1","Cookie": "请自行复制登录之后的 Cookie"}data = {'type': 'json','st': 'e940df','_spr': 'screen:390x844','pic': open('./test_img.png', 'rb')}res = requests.post('https://m.weibo.cn/api/statuses/uploadPic',data=data, headers=headers)print(res.text)if __name__ == '__main__':upload_img()

本想着一次性就成功,结果得到如下信息。

{"ok":0,"errno":"100015","msg":"\u4e0d\u5408\u6cd5\u7684\u8bf7\u6c42"}

将 unicode 编码的 msg 参数转码之后,错误提示为 不合法的请求。看来没有想象中那么容易完成。

既然是请求非法,那一定是在请求头中加入了识别标记,查看请求头信息,发现如下参数。

在这里插入图片描述

⛳️ 第二轮编码

在请求头中出现了 token 值,非常典型的加密参数,而且这个参数和代码请求中传递的 st 参数一致。那继续修改代码,在请求头中加入该参数。

import requestsdef upload_img():headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1","Cookie": "请自行复制登录之后的 Cookie"}st = 'e940df'headers["x-xsrf-token"] = stdata = {'type': 'json','st': st,'_spr': 'screen:390x844','pic': open('./test_img.png', 'rb')}res = requests.post('https://m.weibo.cn/api/statuses/uploadPic',data=data, headers=headers)print(res.text)

结果得到的信息依旧是请求非法,那继续在请求头中增加参数。当补齐之后,发现得到的错误信息变了,具体如下所示。

 headers = {"accept": "application/json, text/plain, */*","origin": "https://m.weibo.cn","referer": "https://m.weibo.cn/","mweibo-pwa": "1","x-requested-with": "XMLHttpRequest","User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1","Cookie": "请自行复制登录之后的 Cookie"}

新的错误信息依旧是请求非法。

{"ok":0,"errno":"100006","msg":"\u8bf7\u6c42\u975e\u6cd5"}

⛳️ 第三轮编码

那既然增加 x-xsrf-token 还是无法得到数据,那只能多次测试上传,查看该参数变化。

再次测试之后,发现该值会动态获取,调用的接口信息如下所示。

请求地址:https://m.weibo.cn/api/config
无请求参数,微博默认是间隔一段时间自动修改该值,这里我们修改为手动触发,新版代码如下所示。

import requestsdef upload_img():headers = {"accept": "application/json, text/plain, */*","origin": "https://m.weibo.cn","referer": "https://m.weibo.cn/","mweibo-pwa": "1","x-requested-with": "XMLHttpRequest","User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1","Cookie": "请自行复制登录之后的 Cookie"}res = requests.get('https://m.weibo.cn/api/config', headers=headers)st = res.json()['data']['st']print(st)headers["x-xsrf-token"] = stdata = {'type': 'json','st': st,'_spr': 'screen:390x844'}data = {'type': 'json','st': st,'_spr': 'screen:390x844','pic': open('./test_img.png', 'rb')}res = requests.post('https://m.weibo.cn/api/statuses/uploadPic',data=data, headers=headers)print(res.text)if __name__ == '__main__':upload_img()

结果没有错误码了,又出现新的提示信息了。

{"ok":0,"msg":"\u4e0a\u4f20\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5"}

转义之后,最新的提示是上传失败,请稍后重试,看来已经接近成功了,下面的代码实现是多年爬虫编码经验实现的。

既然接口提示的仅仅是上传失败,那再次回到开发者工具中查看,通过载荷卡片,可以看到是上传的表单数据,那我们使用 data 参数是完全没有问题的,但是切换到源代码视图就会发现问题。下面是两张对比图。

在这里插入图片描述
在这里插入图片描述

⛳️ 第四轮编码

在源代码视图中发现微博的该接口是使用的 multipart/from-data 类型数据,在 Python 中有两种方式来实现,分别如下。

  • 手动创建 form-data 并通过 headers 传递;
  • 通过 files 参数传递。

那咱们采用第二种实现,在 requests 的官方手册中也是推荐该方式,使用 requests 模拟一个表单的数据格式,语法如下。

files = {{name}: (<filename>, <file object>,<content type>, <per-part headers>)}

该行代码模拟出来的 POST 数据格式恰好和刚才的图片格式一致。

Content-Disposition: form-data; name={name};filename=<filename>
Content-Type: <content type><file object>
--boundary

其中各参数留空,使用 None 进行占位。

所以本案例中请求参数修改为如下格式。

file = {'pic': ('test_img.png', open('./test_img.png', 'rb'), 'image/png'),'type': (None, 'json'),'st': (None, st),'_spr': (None, 'screen:390x844')}

同时在 requests 模块调用 POST 方法的时候,使用 files 参数,完整代码如下所示。

import requestsdef upload_img():headers = {"accept": "application/json, text/plain, */*","origin": "https://m.weibo.cn","referer": "https://m.weibo.cn/","mweibo-pwa": "1","x-requested-with": "XMLHttpRequest","User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1","Cookie": "请自行复制登录之后的 Cookie"}res = requests.get('https://m.weibo.cn/api/config', headers=headers)st = res.json()['data']['st']print(st)headers["x-xsrf-token"] = stdata = {'type': 'json','st': st,'_spr': 'screen:390x844'}# data = {#     'type': 'json',#     'st': st,#     '_spr': 'screen:390x844',#     'pic': open('./test_img.png', 'rb')# }file = {'pic': ('test_img.png', open('./test_img.png', 'rb'), 'image/png'),'type': (None, 'json'),'st': (None, st),'_spr': (None, 'screen:390x844')}res = requests.post('https://m.weibo.cn/api/statuses/uploadPic',files=file, headers=headers)print(res.text)if __name__ == '__main__':upload_img()

运行代码,得到最终结果,响应数据如下所示。

{"pic_id":"xxxxxx","thumbnail_pic":"xxxxxxx","bmiddle_pic":"xxxxxxx","original_pic":"xxxxxx"}

但是这个图床案例还没有完结,你得到的图片地址,如果直接使用浏览器访问,会被禁止(403 Forbidden),即限制了外链调用。

使用下述代码进行修复,即可外联访问。

pic_id = res.json()["pic_id"]
# 拼接图片地址
img = 'http://ww1.sinaimg.cn/large/{pid}.jpg'.format(pid=pic_id)
print(img)

不要问我,为什么 ww1 就可以访问到图片,这是前贤们探究出来的。

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 621 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_226082.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于keras 卷积神经外网络搭建的手写数字识别 完整代码+数据可直接运行

项目介绍: 适合新手入门学习代码数据很简洁 上结果: 主要的卷积神经网络: 卷积是指在滑动中提取特征的过程,可以形象地理解为用放大镜把每步都放大并且拍下来,再把拍下来的图片拼接成一个新的大图片的过程。 2D卷积是一个相当简单的操作: 我们先从一个小小的权重矩阵…

十个值得珍藏的正则表达式

正则表达式常学常忘&#xff0c;记规则不如记例子&#xff0c;记多不如记精&#xff0c;记例子就记最经典的。下面是本人珍藏的十个有用的正则表达式&#xff0c;不吝分享&#xff0c;以飨读者。 正则表达式要点 小括号&#xff1a;代表分组 中括号&#xff1a;代表集合 大括号…

外卖项目08---Linux

目录 一、 Linux简介 119 二、Linux安装 120 三、常用命令 122 3.1Linux命令初体验 3.1.1 command [-options] [parameter] 3.2Linux常用命令---文件目录操作命令-ls&-cd&-cat 124 3.2.1list 3.2.2 cd 3.2.3 cat 3.3 Linux常用命令---文件目录操作命令…

机器学习模型与backtrader框架整合

原创文章第116篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 北京疫情似乎还没有到拐点&#xff0c;但这三天结束后应该会到来。 今天重点说说&#xff0c;机器学习模型整合到我们的回测框架中&#xff0c;并与backtrader连接起来回测…

傻白入门芯片设计,先进封装技术(五)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作&#xff0c;封装对芯片来说是必不可少的&#xff0c;随着IC生产技术的进步&#xff0c;封装技术也不断更新换代&#xff0c;每一代IC都与新一代的IC封装技术紧密相连。 目录 一、什么是封装&am…

详解设计模式:抽象工厂模式

工厂方法模式&#xff0c;又称工厂模式、多态工厂模式和虚拟构造器模式&#xff0c;通过工厂父类定义负责创建产品的公共接口&#xff0c;子类负责生产具体对象。可以理解为简单工程模式的升级&#xff0c;解决简单工厂模式的弊端。 &#xff5e; 本篇内容包括&#xff1a;关于…

java基本语法 下

目录 运算符 运算符&#xff1a;算术运算符 运算符&#xff1a;赋值运算符 运算符&#xff1a;比较运算符 运算符&#xff1a;逻辑运算符 运算符&#xff1a;三元运算符 运算符的优先级 程序流程控制 概念 顺序结构 if-else结构 switch-case结构 循环结构 循环结构…

你不能错过的【Python爬虫】测试3(爬取所有内容 + 完整源代码 + 架构 + 结果)

目录 一、主要工具包 以及 版本二、架构展示三、各部分code3.1 yjs.py (重要)3.2 items.py3.3 middlewares.py3.4 pipelines.py3.5 settings.py3.6 start.py四、结果展示一、主要工具包 以及 版本 scrapy:2.7.1版本(这里主要用到的工具包) 二、架构展示 三、各部分code 3…

8、MyBatis核心配置文件之typeAliases(mybatis-config.xml)

MyBatis核心配置文件之typeAliases&#xff08;mybatis-config.xml&#xff09; 1、&#xff01;&#xff01;&#xff01;&#xff01;注意 2、 设置类型别名&#xff08;比如有的全类名&#xff08;resultType&#xff09;太长了不好使用&#xff09; typeAlias :设置某个类…

AOP实现方式-P20,21,22

项目的包&#xff1a; pom依赖导入有关aop的包&#xff1a; <dependencies><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactI…

mysql-6-主从复制搭建

1 总结 1&#xff1a;主从复制最大缺陷就是延迟。 2 搭建前的准备 2.1复制的基本原则 每个slave只有一个master每个slave只能有一个唯一的服务器ID每个master可以有多个slavemysql版本尽量一致&#xff0c;防止出问题。两台服务能ping通MySQL主从是基于binlog的&#xff0c;主上…

【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

好久不见&#xff0c;我又回来了&#xff0c;这段时间把路径规划的一系列算法整理一下&#xff0c;感兴趣的点个关注。今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法&#xff0c;文末有 python 完整代码&#xff0c;那我们开始吧。 1. 算法介绍 1959 年&#xff0c…

FAIRNESS IN MACHINE LEARNING: A SURVEY 阅读笔记

论文链接 刚读完一篇关于机器学习领域研究公平性的综述&#xff0c;这篇综述想必与其有许多共通之处&#xff0c;重合部分不再整理笔记&#xff0c;可详见上一篇论文的笔记&#xff1a; A Survey on Bias and Fairness in Machine Learning 阅读笔记_Catherine_he_ye的博客 S…

scrapy的入门使用

目录 一、 安装scrapy 1.windonws/Mac安装命令&#xff1a; 2. 安装依赖包&#xff1a;pip install pypiwin32 二、 scrapy项目开发流程 1.创建项目:    2.生成一个爬虫: 3.提取数据: 4.保存数据: 三、 创建项目 四、创建爬虫 五、完善爬虫 5.2 定位元素以及提取…

浅识vue的虚拟DOM和渲染器

虚拟DOM本质上是对DOM的抽象描述&#xff0c;就是一个普通的js对象。他身上的属性要比真实DOM的属性要少得多。 在一定情况下&#xff0c;使用虚拟DOM的性能要逊于直接使用真实DOM。 例如&#xff0c;在页面一开始的时候&#xff0c;Vue需要先通过生成虚拟DOM树&#xff0c;在…

【面试】揭秘面试背后的那点真实

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录前言/背景面试流程资料总结/刷题指南个人经验总结寄语&#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢&#xff1a;木芯工作室 、Ivan from Russia 金…

QT:debug日志—打不开头文件以及qDebug和Q_CLASSINFO的使用

这个是因为链接器在给定路径上搜索不到对应的头文件&#xff0c;而大多数的Qt相关的头文件都集中在一个include文件夹里&#xff1a; 我电脑上的路径是&#xff1a;C:\Qt\Qt5.9.7\5.9.7\msvc2017_64\include 然后我们在项目设置里&#xff1a; 注意&#xff0c;这边要加上\*&…

计算机系统基础期末复习

C语言代码如下&#xff1a; void fun(int n){ int x n*12;int y n/32; }请将其中计算的部分优化为位运算、移位运算和加法运算的结合。 x n8n4 (n<<3)(n<<2) x (n(n>>31) & 0x1F)>>5 设32位的位串为x(x类型为unsigned int)&#xff0c;现要…

Flink常用Sink(elasticsearch(es)Sink、RedisSink、KafkaSink、MysqlSink、FileSink)

flink输出到es、redis、mysql、kafka、file 文章目录配置pom文件公共实体类KafkaSInkElasticsearchSink(EsSink)RedisSinkMysqlSink(JdbcSink)FileSink自己先准备一下相关环境 配置pom文件 <properties><maven.compiler.source>8</maven.compiler.source>&l…

测试用例设计方法之场景设计法

基本流&#xff1a;采用直黑线表示&#xff0c;是经过用例的最简单的路径&#xff08;无任何差错&#xff0c;程序从开始直接执行到结束&#xff09; 备选流&#xff1a;采用不同颜色表示&#xff0c;一个备选流可能从基本流开始&#xff0c;在某个特定条件下执行&#xff0c;…