文章采集接口(折腾一个微信公众号新增永久图文素材|微信开放文档)
优采云 发布时间: 2022-01-31 10:15文章采集接口(折腾一个微信公众号新增永久图文素材|微信开放文档)
前言
都说懒惰是人类进步的动力,古人没有骗我。最近在折腾一个微信公众号。一开始是在网上找了一些资源,然后做了二次创作,然后发布到了微信公众号上。不过,我得把里面的图片下载下来,复制文字,然后慢慢上传到微信公众号。经过几天的工作,我发现这太低效了。我每天都在做重复的事情。这对于程序员来说是无法忍受的。任何重复的东西都有自动化的价值,我们不能浪费它们。人生就在这种地方,不废话,做就做。
一、需求和难点从指定页面爬取数据只爬取我们需要的内容(什么样的广告,不需要导航),然后将文字上传到微信公众号的草稿箱。微信的草稿箱界面只能放图片上传到微信,所以我们需要做一个额外的操作,从网页中提取图片上传到微信公众号,然后将文中的图片链接替换为微信公众号中的图片二、使用工具和接口将封面图片上传到微信公众号添加永久图文素材 | 微信开文档()上传文字图片到微信公众号
http请求方式: POST,https协议 https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F [email protected] "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"
上传文字至公众号草稿箱接口请求说明 | 微信打开文档()
这里主要使用Python:requests、BeautifulSoup、json
三、实施步骤1.分析网页
这是我们要分析的网页截图:
我们可以看到这个网页有自己的导航,右侧的推荐栏和底部的导航。如果我们直接扣除上传到整个网页的微信公众号,无疑会给我们的后期处理带来很大的工作量。所以我们只需要body,也就是html中的内容
2. 调用接口我们先来看看上传草稿API接口
接口请求说明
http 请求方式:POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN
调用示例
{
"articles": [
{
"title":TITLE,
"author":AUTHOR,
"digest":DIGEST,
"content":CONTENT,
"content_source_url":CONTENT_SOURCE_URL,
"thumb_media_id":THUMB_MEDIA_ID,
"show_cover_pic":1,
"need_open_comment":0,
"only_fans_can_comment":0
}
//若新增的是多图文素材,则此处应还有几段articles结构
]
}
请求参数说明
范围
有必要吗
操作说明
标题
是的
标题
内容
是的
图片和短信的具体内容支持HTML标签,且必须小于20000字符且小于1M,这里会去掉JS,图片的url必须从“上传图片获取网址”中获取图片和文字信息”界面。外部图片网址将被过滤
thumb_media_id
是的
图文信息的封面图片素材id(必须是永久MediaID)
可以看出这个接口需要3个参数,那我们就去网页的代码看看如何获取这3个参数
通过分析网页,我们可以发现我们想要的标题在class='entry-title'的a标签中,我们还可以在class='entry-title'的div中得到文章的摘要概括'
所以我们先爬取页面,得到标题和摘要
baseUrl = 'https://www.test.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.57'
}
res = requests.get(baseUrl, verify=False, headers=headers)
root_soup = BeautifulSoup(res.content, 'html.parser')
title = root_soup.select('.entry-title')[0].text
summary = root_soup.select('.entry-summary p')[0].text
print(title)
print(summary)
接下来,我们需要准备封面。现在我们将使用微信公众号接口,但是在使用公众号接口之前,我们需要获取一个令牌,以便我们有权访问公众号的API接口。获取token的文档在这里:Wechat Open Document() 通过分析文字我们知道这个文章里面有很多图片,那么我们就以第一张图片为封面,先定义一个方法用于上传封面
然后获取body中的所有图片,将第一个传入这个方法获取cover id
content_soup = root_soup.select('.entry-content')[0]
imgs = content_soup.select('.wp-block-image')
fmId = updFm(imgs[0].img['src'], title)
接下来我们在文本中定义一个上传其他图片的方法,因为其他图片需要返回的url不是media_id,所以调用了另外一个接口。
def updImg(url):
base_folder = 'D:\\tempDir'
res = requests.get(url, verify=False)
file_name = '{}.jpg'.format(random.randint(10000, 99999))
with open(base_folder + file_name, 'wb') as f:
f.write(res.content)
vx_img_url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
request_file = {
'media': (file_name, open(base_folder + file_name, 'rb'), 'image/jpeg')}
data = {
'access_token': access_token
}
vx_res = requests.post(url=vx_img_url, files=request_file, data=data)
obj = json.loads(vx_res.content)
print(obj)
return obj['url']
然后将文中的图片全部上传到微信公众号的素材库,替换为文中的图片地址
for img_content in imgs:
img_content.noscript.decompose()
current_url = img_content.img['data-original']
upd_url = updImg(current_url)
img_content.img['src'] = upd_url
img_content.img['data-original'] = upd_url
最后我们可以开始准备上传文章到草稿箱,或者先定义方法,因为草稿界面的标题和摘要都有长度限制,所以这个方法开始做限制。如果长度超过,字符串将被截取
def updCG(title, summary, content, fmId):
if len(title) > 64:
title = title[:63]
if len(summary) > 120:
summary = summary[:119]
url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token='+access_token
data = {
"articles": [
{
"title": title,
"author": '作者',
"digest": summary,
"content": content,
"show_cover_pic": 1,
"need_open_comment": 0,
"only_fans_can_comment": 0,
"thumb_media_id": fmId
}
]
}
vx_res = requests.post(url=url, data=json.dumps(
data, ensure_ascii=False).encode("utf-8"))
obj = json.loads(vx_res.content)
print(obj)
return obj['media_id']
然后在总方法中调用我们的上传草稿方法
print(content_soup.prettify())
updCG(title, summary, content_soup.prettify(), fmId)
查看结果,可以看到文章已经自动提交到草稿箱了,然后我们就可以进去二次创建发布了
总结
这可以在半天总共100多行代码中完成。其实这主要需要你去分析网页,因为每个网站的情况都不一样,后面的技术实现也差不多。生活中,我们会遇到很多需要时时刻刻重复的事情。这个时候,我们可以多花点脑力,以后节省不少时间。如果我们掌握了一些别人无法做到的事情,那么我们就可以做一些不同的事情。好吧,技术改变生活,不是吗?