如果想要实现一个将公众号文章搬运到某个社区中去发布的功能,除了使用爬虫等方法,还可以通过微信开放平台授权,调用官方接口来获取公众号文章。
类似于腾讯云开发者社区自媒体分享计划、OSCHINA 开源中国 OSC 源创计划,这两个平台都有搬家的功能。
开源中国应该百分百使用了此接口,而腾讯云开发者社区就不一定了,通过查看公众号设置中的授权管理,腾讯云官网只授权了
公众号账号信息服务
和获取认证状态信息
两个权限集。
而开源中国的授权权限就是本文中要说明的两个:公众号账号信息服务
和素材管理
。
公众号账号信息服务
用于获取授权公众号的信息,例如头像、名称、二维码地址、头像地址、简介等素材管理
用于获取发布的文章等
配置
开始之前需要先注册微信开放平台,有一个发布过文章的公众号用于测试。
在微信开发平台中进行配置:
- 获取
APPID
和AppSecret
; - 开发配置中配置公众号权限集:
3 公众号账号信息服务
和11 素材管理
; - 开发配置中配置开发资料,设置授权流程相关的域名和白名单等。
开发资料
开发资料填写示例如下:
- 授权事件接收配置:
example.com/events.php
,用于接收平台推送给第三方平台账号的消息与事件,如授权事件通知、component_verify_ticket 等。 - 消息与事件接收配置:
example.com/$APPID$/events.php
。本文中的场景应该用不到。 - 授权发起页域名:
example.com
,必须从本域名内网页跳转到登录授权页,才可完成登录授权 - 其他的就按提示说明进行填写配置。
测试使用
使用 PHP 语言为例,ngrok 进行内网穿透。
使用 easywechat
的 SDK:
composer require w7corp/easywechat:^6.7
新建4
个文件,实际开发中应结合所使用的框架进行封装。
auth.php
用于生成微信授权的链接,这里需要生成链接可点击,因为微信的授权链接需要携带referer
才正常授权。不然可能会遇到错误提示:请确认授权入口页所在域名,与授权后回调页所在域名相同,并且,此两者都必须与申请第三方平台时填写的授权发起页域名相同
;events.php
用于接收授权事件;callback.php
授权后的回调地址;test.php
用来编写获取公众号账号信息、文章的代码。
首先初始化 SDK,这部分代码在4
个文件中都要添加,下文会省略。
include __DIR__ . '/vendor/autoload.php';
use EasyWeChat\OpenPlatform\Application;
$config = [
'app_id' => '', // 开放平台账号的 appid
'secret' => '', // 开放平台账号的 secret
'token' => '', // 开发资料中配置的消息校验Token
'aes_key' => '', // 开发资料中配置的消息加解密Key
];
$app = new Application($config);
events.php
SDK 默认会处理事件 component_verify_ticket
,并会缓存 verify_ticket
。暂时不需要处理其他事件,所以直接这样使用:
include __DIR__ . '/vendor/autoload.php';
use EasyWeChat\OpenPlatform\Application;
$config = [
'app_id' => '', // 开放平台账号的 appid
'secret' => '', // 开放平台账号的 secret
'token' => '', // 开发资料中配置的消息校验Token
'aes_key' => '', // 开发资料中配置的消息加解密Key
];
$app = new Application($config);
$server = $app->getServer();
return $server->serve();
auth.php
$app = new Application($config);
# 使用对应的回调地址,授权后会跳转到该地址
$url = $app->createPreAuthorizationUrl('https://example.com/callback.php');
# 需要通过点击携带referer
echo "<a href='{$url}'>{$url}</a>";
点击生成后的链接,扫码进行授权,扫码完成并授权后,页面将跳转到callback.php
。
callback.php
$app = new Application($config);
$authorization = $app->getAuthorization($_GET['auth_code']);
$authorizationInfo = $authorization->toArray()['authorization_info'];
var_dump($authorizationInfo);
$authorizerAppid = $authorizationInfo['authorizer_appid'];
$authorizerAccessToken = $authorizationInfo['authorizer_access_token'];
$authorizerRefreshToken = $authorizationInfo['authorizer_refresh_token'];
获取到授权公众号的appid
、access_token
、refresh_token
,需要结合业务保存到数据库中。
test.php
获取到所需要的信息以后,就可以调用官方的接口来获取信息了:
$app = new Application($config);
# callback.php 中返回的信息
$authorizerAppid = '';
$authorizerAccessToken = '';
$authorizerRefreshToken = '';
// 获取账号信息 https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/authorization-management/getAuthorizerInfo.html
$response = $app->getClient()->post('cgi-bin/component/api_get_authorizer_info', ['json' => ['component_appid' => $config['app_id'], 'authorizer_appid' => $authorizerAppid]]);
var_dump($response->toArray());
// 获取已发布的文章素材 https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Get_materials_list.html
$officialAccount = $app->getOfficialAccountWithAccessToken($authorizerAppid, $authorizerRefreshToken);
$response = $officialAccount->getClient()->post('cgi-bin/material/batchget_material', ['json' => ['type' => 'news', 'offset' => 0, 'count' => 20]]);
var_dump($response->toArray());
这样就可以通过$officialAccount
来调用公众号的所授权的接口来获取需要的数据了。
这个方便了许多