使用 Senparc 取得微信公众平台的粉丝

使用 Senparc 取得微信公众平台的粉丝

功能说明

通过 UserApi.Get 接口可以快速获取公众号的关注粉丝列表。由于微信接口每次最多返回 10000 条数据,当粉丝数量超过 10000 时,需要通过 next_openid 参数进行分页循环获取。获取到 openid 列表后,再逐条调用 UserApi.Info 获取每个粉丝的详细信息。

实现代码

/// <summary>
/// 取得所有微信关注的粉丝
/// </summary>
/// <returns></returns>
public JsonResult GetUserList()
{
    var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
    OpenIdResultJson openIdResultJson = null;
    string nextOpenid = string.Empty;
    List<UserInfoJson> list = new List<UserInfoJson>();

    do
    {
        openIdResultJson = UserApi.Get(accessToken, nextOpenid);
        nextOpenid = openIdResultJson.next_openid;

        if (openIdResultJson.data != null)
        {
            foreach (string openid in openIdResultJson.data.openid)
            {
                UserInfoJson userJson = UserApi.Info(accessToken, openid);
                list.Add(userJson);
            }
        }

    } while (openIdResultJson != null && !string.IsNullOrEmpty(openIdResultJson.next_openid));

    return Json(list, JsonRequestBehavior.AllowGet);
}Code language: PHP (php)

关键点说明

  • UserApi.Get(accessToken, nextOpenid):获取粉丝 openid 列表。首次调用时 nextOpenid 传空字符串,后续传入上次返回的 next_openid 实现分页。
  • UserApi.Info(accessToken, openid):根据 openid 获取单个粉丝的详细信息,返回 UserInfoJson 对象,包含以下常用属性:
    • openid:用户唯一标识
    • nickname:昵称
    • sex:性别(1 男,2 女,0 未知)
    • city / province / country:城市、省份、国家
    • headimgurl:头像地址
    • subscribe:是否关注(1 关注,0 未关注)
    • subscribe_time:关注时间
    • remark:备注名
    • groupid:所属分组 ID
  • OpenIdResultJson 主要属性:
    • total:关注总数
    • count:本次获取的数量
    • data:包含 openid 列表的对象
    • next_openid:下一个 openid,为空时表示已获取完毕
  • do...while 循环确保当粉丝数超过 10000 时,能自动翻页获取全部数据。
  • 返回 JsonResult 并设置 JsonRequestBehavior.AllowGet,允许 GET 请求直接访问。

注意事项

  • 当粉丝数量较大时,逐条调用 UserApi.Info 会导致请求次数较多,可能触发微信 API 调用频率限制。建议在实际项目中增加缓存或批量处理机制。
  • 测试账号的关注粉丝数量有限,可用于功能验证;正式环境需注意接口调用配额。
  • AccessTokenContainer.TryGetAccessToken() 内部已处理 Token 缓存,无需每次手动刷新。

提示:如果仅需获取 openid 列表而不需要详细信息,可直接返回 openIdResultJson 以减少 API 调用次数。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注