通过微信开放平台授权获取公众号文章

如果想要实现一个将公众号文章搬运到某个社区中去发布的功能,除了使用爬虫等方法,还可以通过微信开放平台授权,调用官方接口来获取公众号文章。

类似于腾讯云开发者社区自媒体分享计划、OSCHINA 开源中国 OSC 源创计划,这两个平台都有搬家的功能。

开源中国应该百分百使用了此接口,而腾讯云开发者社区就不一定了,通过查看公众号设置中的授权管理,腾讯云官网只授权了公众号账号信息服务获取认证状态信息两个权限集。

而开源中国的授权权限就是本文中要说明的两个:公众号账号信息服务素材管理

  • 公众号账号信息服务 用于获取授权公众号的信息,例如头像、名称、二维码地址、头像地址、简介等
  • 素材管理 用于获取发布的文章等

配置

开始之前需要先注册微信开放平台,有一个发布过文章的公众号用于测试。

在微信开发平台中进行配置:

微信第三方平台详情

  1. 获取APPIDAppSecret
  2. 开发配置中配置公众号权限集:3 公众号账号信息服务11 素材管理
  3. 开发配置中配置开发资料,设置授权流程相关的域名和白名单等。

开发资料

开发资料填写示例如下:

  • 授权事件接收配置: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个文件,实际开发中应结合所使用的框架进行封装。

  1. auth.php 用于生成微信授权的链接,这里需要生成链接可点击,因为微信的授权链接需要携带referer才正常授权。不然可能会遇到错误提示:请确认授权入口页所在域名,与授权后回调页所在域名相同,并且,此两者都必须与申请第三方平台时填写的授权发起页域名相同
  2. events.php 用于接收授权事件;
  3. callback.php 授权后的回调地址;
  4. 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'];

获取到授权公众号的appidaccess_tokenrefresh_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来调用公众号的所授权的接口来获取需要的数据了。

1 条评论

发表评论

*