记一次,使用python实现一键在爱发电发布带图片的动态
1、背景
本人喜欢转载一些youtube上的视频到b站上面,然后就会有些观众想要视频的封面,那我总不可能一个一个发吧,太麻烦了。故打算将资源发布到爱发电上面。但是爱发电却没有公开对应的api,只能自己动手了呀。
2、思路
发布一条动态,抓包看看调用了哪些api
写代码仿照其中的参数调用api
封装起来,增加易用性
3、发布一条动态,抓包看看调用了哪些api
3.1、发布动态
首先,发布动态长这个样子
这里我们直接发布一条动态
3.2、抓包

可以看到这个发布动态的请求地址为:https://afdian.net/api/post/publish,接下来我们看看我们的请求体是什么
可以看到这个表单挺简单的,但是有一个不太对劲的情况,就是字段"pics"的值不是我上传的地址的值("./img.jpg"),所以我猜,在调用api/post/publish接口前肯定调用了某个接口,将本地的图片转换成上图的链接,然后再拼接到上图中的字段"pics"中一起提交
3.3、抓取本地图片转换成爱发电链接的api
在发布动态的界面直接点击上传图片
选择好图片,加载完毕之后,你就可以看见,调用了一个接口api/upload/common-pic,到这里我还没有点击发布

可以看到的确是和猜想的一样,在提交发布动态的表单前,先提交图片,获取到图片的链接之后,再拼接到发布动态的表单,进行发布
3.4、总结
到这里我们可以知道,一个完整的发布动态流程包括两个部分
1、将本地图片转换成一个官方链接,对应api(/upload/common-pic)
2、将表单中的信息(包括上面提到的链接)进行发布,对应api(/post/publish)
4、代码实现
首先我们初步选定了技术为python + request库
补充:代码中cookies你登陆爱发电后直接按F12,随便点几下有发送请求的按钮,然后在request中翻翻就可以看见了
4.1、将本地图片转换成爱发电官方链接
4.1.1、前期分析
我们先来看看我们需要模拟的request请求

上网搜了一下,这里大概的意思就是爱发电的这个接口需要的content-type是比较少见的类型:multipart/form-data
然后第二张图就是我这次上传的数据的数据体
参考:https://www.jianshu.com/p/902452189ca9,这个给了我大概的思路,request库对于这种类型的支持不是太好,需要借助库requests_toolbelt。然后因为我的数据是文件类型,而该博客中的是文本,所以不能直接照搬
参考:https://www.cnblogs.com/yoyoketang/p/8024039.html,https://pypi.org/project/requests-toolbelt/终于把代码写出来了
4.1.2、代码
import requests
from requests_toolbelt import MultipartEncoder
# 1、初始化需要的数据,包括目标网址、请求头、cookies、图片路径等信息
url = 'https://afdian.net/api/upload/common-pic'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
img_path = 'img.jpg'
# 2、使用 MultipartEncoder 创建文件上传的 payload
file_payload = {
"name":"file",
"filename":img_path,
'file':(img_path,open(img_path,'rb'))
}
m = MultipartEncoder(file_payload)
# 3、补充头
headers['Content-Type'] = m.content_type # multipart/form-data;boundary=29cf7f1b13584a73a6630a738be8274a
# 4、发送请求
response = requests.post(url, headers=headers, data = m, cookies=cookies)
# 5、输出响应内容
print(response.text)

注意:这里我开启了转义,实际上我们需要的也是转义后的数据,不过到现在我还没进行处理
值得一提的是,我还没有进行“发布”呢,返回的链接就可以直接打开了,按道理来说,可以用作图床,但是不知道爱发电会不会进行检测,类似上传了的图片在多久没进行发布就会删除。不过,还是不要用作图床了,厚道一点,毕竟爱发电
4.1.3、进一步封装
因为我们需要的是这个官方链接,所以,这里我对此进行封装成一个函数
import json
import requests
from requests_toolbelt import MultipartEncoder
# 参数:图片地址
# 返回:官方链接
def get_link(img_path):
# 1、初始化需要的数据,包括目标网址、请求头、cookies、图片路径等信息
url = 'https://afdian.net/api/upload/common-pic'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
# 2、使用 MultipartEncoder 创建文件上传的 payload
file_payload = {
"name":"file",
"filename":img_path,
'file':(img_path,open(img_path,'rb'))
}
m = MultipartEncoder(file_payload)
# 3、补充头
headers['Content-Type'] = m.content_type # multipart/form-data; boundary=29cf7f1b13584a73a6630a738be8274a
# 4、发送请求
response = requests.post(url, headers=headers, data = m, cookies=cookies)
response.encoding = "unicode_escape" # 将utf-8 转换成 unicode
# 5、返回响应内容
# 5.1、将响应内容转换成json
response_json = json.loads(response.text)
# 5.2、返回想要的字段link
link = response_json['link']
return link
if __name__ == "__main__":
img_path = "img.jpg"
link = get_link(img_path)
print(link)
'''
输出:
https://pic1.afdiancdn.com/user/bc58exxxxxxx2540025c377/common/5239daxxxxxxxxxx80_h720_s117.jpg
'''
4.2、发布动态
4.2.1、前期分析

可以看到这里是json类型的数据,对应的数据字段太多,这里就不一一展示,等下在代码中你就知道了
4.2.2、代码
import json
import requests
from requests_toolbelt import MultipartEncoder
# 参数:图片地址
# 返回:官方链接
def get_link(img_path):
# 1、初始化需要的数据,包括目标网址、请求头、cookies、图片路径等信息
url = 'https://afdian.net/api/upload/common-pic'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
# 2、使用 MultipartEncoder 创建文件上传的 payload
file_payload = {
"name":"file",
"filename":img_path,
'file':(img_path,open(img_path,'rb'))
}
m = MultipartEncoder(file_payload)
# 3、补充头
headers['Content-Type'] = m.content_type # multipart/form-data; boundary=29cf7f1b13584a73a6630a738be8274a
# 4、发送请求
response = requests.post(url, headers=headers, data = m, cookies=cookies)
response.encoding = "unicode_escape" # 将utf-8 转换成 unicode
# 5、返回响应内容
# 5.1、将响应内容转换成json
response_json = json.loads(response.text)
# 5.2、返回想要的字段link
link = response_json['link']
return link
# 发布函数
# 传入:一个字典类型的数据,包含:标题、内容、图片链接
# 返回:响应数据
def publish(publish_data):
# 1、初始化需要的数据,包括目标网址、请求头、cookies、请求数据等信息
url = 'https://afdian.net/api/post/publish'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'}
cookies = {
'auth_token': 'xxxx',
'_gid':'xxxx',
'_ga_6STWKR7T9E': 'xxxx',
'_ga': 'xxxx'
}
title = publish_data['title']
content = publish_data['content']
link = publish_data['link']
data_dict = {
"post_id":"",
"vote_id":"",
"cate":"normal",
"title":title,
"content":content,
"pics":link,
"is_public":"1",
"min_price":"0",
"audio":"",
"video":"",
"audio_thumb":"",
"video_thumb":"",
"type":"0",
"cover":"",
"group_id":"",
"is_feed":"0",
"plan_ids":"",
"album_ids":"",
"attachment":"[]",
"timing":"",
"optype":"publish",
"preview_text":""
}
# 4、发送请求
response = requests.post(url, headers=headers, data = data_dict, cookies=cookies)
# 5、返回响应内容
response.encoding = "unicode_escape" # 将utf-8 转换成 unicode
return response.text
if __name__ == "__main__":
img_path = "img.jpg"
link = get_link(img_path)
publish_data = {
"title" : "标题测试",
"content" : "内容测试",
"link" : link
}
rep = publish(publish_data)
print(rep)
4.2.3、成功

5、总结
5.1、完整代码 Github地址
https://github.com/Canwaiting/afdian-api
5.2、总结
写完这篇博文,自己也学到了不少,这是我写的最长的一篇博客,本来是当作记录自己思路的草稿,写着写着,整理整理,就发出来了。还有很多可以优化的地方,例如每个字段,我也没搞清具体是什么回事,还有上传多张图片要怎么办等等
记一次,使用python实现一键在爱发电发布带图片的动态的更多相关文章
- 记一次用python 的ConfigParser读取配置文件编码报错
记一次用python 的ConfigParser读取配置文件编码报错 ...... raise MissingSectionHeaderError(fpname, lineno, line)Confi ...
- [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈
我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点: 1.可以了解Python简单爬取图片的一些思路和方法 ...
- 记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)
记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的, ...
- python连续爬取多个网页的图片分别保存到不同的文件夹
python连续爬取多个网页的图片分别保存到不同的文件夹 作者:vpoet mail:vpoet_sir@163.com #coding:utf-8 import urllib import ur ...
- Python中使用Flask、MongoDB搭建简易图片服务器
主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...
- python模块之imghdr(识别不同格式的图片文件)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之imghdr(识别不同格式的图片文件) import imghdr '''>> ...
- Python(三) PIL, Image生成验证图片
Python(三) PIL, Image生成验证图片 安装好PIL,开始使用. 在PyCharm中新建一个文件:PIL_Test1.py 1 # PIL 应用练习 2 # 3 # import PIL ...
- *** Python版一键安装脚本
本脚本适用环境:系统支持:CentOS 6,7,Debian,Ubuntu内存要求:≥128M日期:2018 年 02 月 07 日 关于本脚本:一键安装 Python 版 *** 的最新版.友情提示 ...
- 【2020Python修炼记3】初识Python,你需要知道哪些(一)
一.编程语言简介 机器语言 计算机能直接理解的就是二进制指令,所以机器语言就是直接用二进制编程,这意味着机器语言是直接操作硬件的,因此机器语言属于低级语言, 此处的低级指的是底层.贴近计算机硬件(贴近 ...
- python模块一键安装
利用bat文件 在不懂电脑的小白电脑上一键安装你python环境所需要的模块(你想让她一个个安装,你会疯的) 先新建一个txt文件,把你需要安装的模块和版本号写进去: 然后再新建一个txt文件 然后把 ...
随机推荐
- React数字滚动组件 numbers-scroll
数字滚动组件,也可以叫数字轮播组件,这个名字一听就是非常普通常见的组件,第一反应就是想找找网上大佬的东西顶礼膜拜一下,这一搜,还真是没找到趁手的╮(╯▽╰)╭. 最近接了大屏的需求,数字滚动肯定是免不 ...
- RPA的概念和优势
大多数人每天都会使用到一些机器人流程自动化的工具,例如读取邮件和系统,计算.生成文件和报告.而在未来,那些你不想做的枯燥的工作,也许真的可以不做了,重复化.标准化的工作都可以让机器人帮你完成.想必此刻 ...
- 开源不易、安全慎行,中国软件如何走向文明?丨RTE 技术环境月报 202205
各位开发者小伙伴: 这里是 2022 年第 5 期的 RTE<技术环境月报>--致力于成为对大家"有用"的 Highlight 看板--每月初通过 RTC 开发者社区( ...
- 程序员必须掌握的java进制转换(全网最详细讲解)
前言 在上一篇文章中,壹哥给大家讲了Java里的各种运算符.其中在讲解位运算符时,我给大家提到了计算机中进制的概念.但是现在很多小白同学,对进制的概念还不够了解,比如二进制.八进制.十六进制都是怎么回 ...
- Maven 的仓库、周期和插件
一.Maven 仓库 在 Maven 的世界中,任何一个依赖.插件或者项目构建的输出,都可以称为构建.Maven 在某个统一的位置存储所有项目的共享的构建,这个统一的位置,我们就称之为仓库.任何的构建 ...
- 2PC(两阶段提交)【XA 与 Seata方案】
更多内容,前往 IT-BLOG 一.概述 2PC(two phase commit protocol,2PC)即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase).提 ...
- 一次spark任务提交参数的优化
起因 新接触一个spark集群,明明集群资源(core,内存)还有剩余,但是提交的任务却申请不到资源. 分析 环境 spark 2.2.0 基于yarn集群 参数 spark任务提交参数中最重要的几个 ...
- QGIS 导入文本数据(WKT)
在做GIS数据处理的时候,经常会遇到原始数据是 text.csv.Excel 等格式的数据.要使用数据前提是要先转换数据. 这里是介绍用 QGIS 导入数据.打开导入方式如下(根据自己的文本类型选择不 ...
- golang pprof 监控系列(1) —— go trace 统计原理与使用
golang pprof 监控系列(1) -- go trace 统计原理与使用 服务监控系列文章 服务监控系列视频 关于go tool trace的使用,网上有相当多的资料,但拿我之前初学golan ...
- 蓝桥杯十一届JavaA组-C++解题
本人随便乱写,目前正确性未知 C.本质上升序列 #include<bits/stdc++.h> using namespace std; bool access[4][4]; int df ...