Python登录微信公众号后台编辑素材界面的原理和解析

优采云 发布时间: 2021-04-28 03:11

  Python登录微信公众号后台编辑素材界面的原理和解析

  准备阶段

  为了实现此采集器,我们需要使用以下工具

  此外,此抓取程序使用微信官方帐户后端编辑资料界面。原理是,当我们插入超链接时,微信将调用特殊的API(请参见下图)以获取指定官方帐户的文章列表。因此,我们还需要拥有一个官方帐户。

  

  fig1

  正式开始

  我们需要登录到WeChat官方帐户,依次单击“物料管理”,“新建图形消息”,然后单击上方的超链接。

  

  fig2

  下一步,按F12键,打开Chrome的开发者工具,然后选择“网络”

  

  fig3

  这时,在上一个超链接界面中,单击“选择另一个官方帐户”,然后输入您要抓取的官方帐户(例如,中国移动)

  

  fig4

  这时,先前的网络将刷新一些链接,其中以“ appmsg”开头的内容是我们需要分析的

  

  fig5

  我们解析请求的网址

  https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=143406284&lang=zh_CN&f=json&ajax=1

  分为三部分

  通过不断浏览下一页,我们发现每次开始都只会更改一次,每次都会增加5,这就是count的值。

  接下来,我们使用Python获取相同的资源,但是无法通过直接运行以下代码来获取资源。

  import requests

url = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=1957521839&lang=zh_CN&f=json&ajax=1"

requests.get(url).json()

# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}

  之所以能够在浏览器上获取资源,是因为我们登录了微信官方账号后端。而且Python没有我们的登录信息,因此该请求无效。我们需要在请求中设置headers参数,并传入Cookie和User-Agent以模拟登录

  因为标题信息的内容每次都会改变,所以我将这些内容放在一个单独的文件“ wechat.yaml”中,信息如下

  cookie: ua_id=wuzWM9FKE14...

user_agent: Mozilla/5.0...

  您只需要稍后阅读

  # 读取cookie和user_agent

import yaml

with open("wechat.yaml", "r") as file:

file_data = file.read()

config = yaml.safe_load(file_data)

headers = {

"Cookie": config['cookie'],

"User-Agent": config['user_agent']

}

requests.get(url, headers=headers, verify=False).json()

  在返回的JSON中,我们可以看到每个文章的标题(标题),摘要(摘要),链接(链接),推送时间(update_time)和封面地址(封面)。

  appmsgid是每个推文的唯一标识符,而aid是每个推文的唯一标识符。

  

  fig6

  实际上,除了cookie之外,URL中的token参数还将用于限制采集器,因此上述代码的输出可能为{'base_resp':{'ret':200040,'err_msg ':'无效的csrf令牌'}}

  接下来,我们编写一个循环以获取文章的所有JSON并保存。

  import json

import requests

import time

import random

import yaml

with open("wechat.yaml", "r") as file:

file_data = file.read()

config = yaml.safe_load(file_data)

headers = {

"Cookie": config['cookie'],

"User-Agent": config['user_agent']

}

# 请求参数

url = "https://mp.weixin.qq.com/cgi-bin/appmsg"

begin = "0"

params = {

"action": "list_ex",

"begin": begin,

"count": "5",

"fakeid": config['fakeid'],

"type": "9",

"token": config['token'],

"lang": "zh_CN",

"f": "json",

"ajax": "1"

}

# 存放结果

app_msg_list = []

# 在不知道公众号有多少文章的情况下,使用while语句

# 也方便重新运行时设置页数

i = 0

while True:

begin = i * 5

params["begin"] = str(begin)

# 随机暂停几秒,避免过快的请求导致过快的被查到

time.sleep(random.randint(1,10))

resp = requests.get(url, headers=headers, params = params, verify=False)

# 微信流量控制, 退出

if resp.json()['base_resp']['ret'] == 200013:

print("frequencey control, stop at {}".format(str(begin)))

break

# 如果返回的内容中为空则结束

if len(resp.json()['app_msg_list']) == 0:

print("all ariticle parsed")

break

app_msg_list.append(resp.json())

# 翻页

i += 1

  在上面的代码中,我还将伪造品和令牌存储在“ wechat.yaml”文件中。这是因为fakeid是每个官方帐户唯一的标识符,并且令牌会经常更改。此信息可以通过解析URL获得,也可以从开发人员工具中查看

  

  fig7

  爬行一段时间后,您会遇到以下问题

  {'base_resp': {'err_msg': 'freq control', 'ret': 200013}}

  这时,当您尝试在官方帐户的背景中插入超链接时,会出现以下提示

  

  fig8

  这是官方帐户的流量限制,通常需要等待30-60分钟才能继续。为了完美解决此问题,您可能需要申请多个官方帐户,您可能需要与微信官方帐户登录系统进行对抗,或者您可能需要建立代理池。

  但是我不需要工业级的采集器,我只想搜寻我自己的官方帐户信息,因此请等待一个小时,再次登录到官方帐户,获取Cookie和令牌并运行它。我不想为自己的利益挑战别人的工作。

  最后,将结果保存为JSON格式。

  # 保存结果为JSON

json_name = "mp_data_{}.json".format(str(begin))

with open(json_name, "w") as file:

file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

  或提取文章标识符,标题,URL和发布时间的四列,并将它们保存为CSV。

  info_list = []

for msg in app_msg_list:

if "app_msg_list" in msg:

for item in msg["app_msg_list"]:

info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))

info_list.append(info)

# save as csv

with open("app_msg_list.csv", "w") as file:

file.writelines("\n".join(info_list))

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线