update:修改微信粉丝同步
This commit is contained in:
parent
78bb8bccd7
commit
0fb344fcf3
@ -11,6 +11,7 @@
|
||||
|
||||
namespace catchAdmin\wechat\command;
|
||||
|
||||
use catchAdmin\wechat\library\SyncWechatUsers;
|
||||
use catchAdmin\wechat\model\WechatUsers;
|
||||
use catcher\exceptions\FailedException;
|
||||
use catcher\facade\Trie;
|
||||
@ -33,153 +34,15 @@ class SyncUsersCommand extends Command
|
||||
->setDescription('sync wechat users');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @time 2020年07月19日
|
||||
* @param Input $input
|
||||
* @param Output $output
|
||||
* @return int|void|null
|
||||
*/
|
||||
public function execute(Input $input, Output $output)
|
||||
{
|
||||
$this->officialAccount = WeChat::officialAccount();
|
||||
|
||||
$latest = WechatUsers::order('subscribe_time')->find();
|
||||
|
||||
if ($latest) {
|
||||
throw new FailedException('暂时无法增量同步');
|
||||
}
|
||||
|
||||
$this->sync($latest ? $latest->openid : null);
|
||||
|
||||
$this->syncTags();
|
||||
}
|
||||
|
||||
protected function syncTags()
|
||||
{
|
||||
$users = WechatUsers::cursor();
|
||||
|
||||
foreach ($users as $user) {
|
||||
if ($user->tag_list) {
|
||||
$tagIds = Utils::stringToArrayBy($user->tag_list);
|
||||
$relate = [];
|
||||
|
||||
foreach ($tagIds as $id) {
|
||||
$relate[] = [
|
||||
'user_id' => $user->id,
|
||||
'tag_id' => $id,
|
||||
];
|
||||
}
|
||||
|
||||
Db::name('wechat_user_has_tags')->insertAll($relate);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 同步
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $nextOpenid
|
||||
* @return void
|
||||
*/
|
||||
protected function sync($nextOpenid)
|
||||
{
|
||||
$userOpenids = $this->getWechatUserOpenids($nextOpenid);
|
||||
|
||||
if ($userOpenids['next_openid']) {
|
||||
$this->getUsersBy($userOpenids['data']['openid']);
|
||||
$this->sync($userOpenids['next_openid']);
|
||||
} else {
|
||||
if ($userOpenids['count']) {
|
||||
$openids = $userOpenids['data']['openid'];
|
||||
$this->getUsersBy($openids);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $openids
|
||||
* @return void
|
||||
*/
|
||||
protected function getUsersBy($openids)
|
||||
{
|
||||
$chunks = array_chunk($openids, $this->getChunkSize($openids));
|
||||
|
||||
$total = count($chunks);
|
||||
|
||||
$bar = new ProgressBar($this->output, $total);
|
||||
|
||||
$bar->setHeader('[开始同步]');
|
||||
|
||||
$bar->start();
|
||||
foreach ($chunks as $chunk) {
|
||||
$users = $this->officialAccount->user->select($chunk);
|
||||
$this->syncToDatabase($users);
|
||||
$bar->advance();
|
||||
}
|
||||
$bar->finished();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 同步到数据库
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $users
|
||||
* @return void
|
||||
*/
|
||||
protected function syncToDatabase($users)
|
||||
{
|
||||
$users = $users['user_info_list'];
|
||||
|
||||
foreach ($users as &$user) {
|
||||
$user['avatar'] = $user['headimgurl'];
|
||||
$user['unionid'] = $user['unionid'] ?? '';
|
||||
$user['created_at'] = time();
|
||||
$user['updated_at'] = time();
|
||||
if (!empty($user['tagid_list'])) {
|
||||
$user['tagid_list'] = trim(implode(',', $user['tagid_list']), ',');
|
||||
}
|
||||
unset($user['headimgurl']);
|
||||
unset($user['qr_scene'], $user['qr_scene_str']);
|
||||
}
|
||||
|
||||
WechatUsers::insertAll($users);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 chunk size
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $openids
|
||||
* @return int
|
||||
*/
|
||||
protected function getChunkSize($openids)
|
||||
{
|
||||
$size = count($openids);
|
||||
|
||||
if ($size < 10) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ($size > 10 && $size < 100) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
if ($size > 100 && $size < 1000) {
|
||||
return 100;
|
||||
}
|
||||
|
||||
if ($size > 1000 && $size < 10000) {
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信 openids
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $nextOpenId
|
||||
* @return mixed
|
||||
*/
|
||||
public function getWechatUserOpenids($nextOpenId)
|
||||
{
|
||||
return $this->officialAccount->user->list($nextOpenId);
|
||||
(new SyncWechatUsers())->start();
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
*/
|
||||
namespace catchAdmin\wechat\controller;
|
||||
|
||||
use catchAdmin\wechat\library\SyncWechatUsers;
|
||||
use catchAdmin\wechat\repository\WechatUsersRepository;
|
||||
use catcher\base\CatchController;
|
||||
use catcher\CatchResponse;
|
||||
@ -80,13 +81,12 @@ class Users extends CatchController
|
||||
* 用户同步
|
||||
*
|
||||
* @time 2020年06月26日
|
||||
* @param SyncWechatUsers $users
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function sync()
|
||||
public function sync(SyncWechatUsers $users)
|
||||
{
|
||||
Console::call('sync:users');
|
||||
|
||||
return CatchResponse::success('', 'success');
|
||||
return CatchResponse::success($users->start(), 'success');
|
||||
}
|
||||
|
||||
public function subscribe()
|
||||
|
173
catch/wechat/library/SyncWechatUsers.php
Normal file
173
catch/wechat/library/SyncWechatUsers.php
Normal file
@ -0,0 +1,173 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | CatchAdmin [Just Like ~ ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: JaguarJack [ njphper@gmail.com ]
|
||||
// +----------------------------------------------------------------------
|
||||
namespace catchAdmin\wechat\library;
|
||||
|
||||
use catchAdmin\wechat\model\WechatUsers;
|
||||
use catcher\exceptions\FailedException;
|
||||
use catcher\library\ProgressBar;
|
||||
use catcher\library\WeChat;
|
||||
use catcher\Utils;
|
||||
use think\Db;
|
||||
|
||||
class SyncWechatUsers
|
||||
{
|
||||
protected $officialAccount;
|
||||
|
||||
public function start()
|
||||
{
|
||||
$this->officialAccount = WeChat::officialAccount();
|
||||
|
||||
$latest = WechatUsers::order('subscribe_time')->find();
|
||||
|
||||
if ($latest) {
|
||||
throw new FailedException('暂时无法增量同步');
|
||||
}
|
||||
|
||||
$this->sync($latest ? $latest->openid : null);
|
||||
|
||||
$this->syncTags();
|
||||
}
|
||||
|
||||
protected function syncTags()
|
||||
{
|
||||
$users = WechatUsers::cursor();
|
||||
|
||||
foreach ($users as $user) {
|
||||
if ($user->tag_list) {
|
||||
$tagIds = Utils::stringToArrayBy($user->tag_list);
|
||||
$relate = [];
|
||||
|
||||
foreach ($tagIds as $id) {
|
||||
$relate[] = [
|
||||
'user_id' => $user->id,
|
||||
'tag_id' => $id,
|
||||
];
|
||||
}
|
||||
|
||||
Db::name('wechat_user_has_tags')->insertAll($relate);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 同步
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $nextOpenid
|
||||
* @return void
|
||||
*/
|
||||
protected function sync($nextOpenid)
|
||||
{
|
||||
$userOpenids = $this->getWechatUserOpenids($nextOpenid);
|
||||
|
||||
if ($userOpenids['next_openid']) {
|
||||
$this->getUsersBy($userOpenids['data']['openid']);
|
||||
$this->sync($userOpenids['next_openid']);
|
||||
} else {
|
||||
if ($userOpenids['count']) {
|
||||
$openids = $userOpenids['data']['openid'];
|
||||
$this->getUsersBy($openids);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $openids
|
||||
* @return void
|
||||
*/
|
||||
protected function getUsersBy($openids)
|
||||
{
|
||||
$chunks = array_chunk($openids, $this->getChunkSize($openids));
|
||||
|
||||
$total = count($chunks);
|
||||
|
||||
$bar = new ProgressBar($this->output, $total);
|
||||
|
||||
$bar->setHeader('[开始同步]');
|
||||
|
||||
$bar->start();
|
||||
foreach ($chunks as $chunk) {
|
||||
$users = $this->officialAccount->user->select($chunk);
|
||||
$this->syncToDatabase($users);
|
||||
$bar->advance();
|
||||
}
|
||||
$bar->finished();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 同步到数据库
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $users
|
||||
* @return void
|
||||
*/
|
||||
protected function syncToDatabase($users)
|
||||
{
|
||||
$users = $users['user_info_list'];
|
||||
|
||||
foreach ($users as &$user) {
|
||||
$user['avatar'] = $user['headimgurl'];
|
||||
$user['unionid'] = $user['unionid'] ?? '';
|
||||
$user['created_at'] = time();
|
||||
$user['updated_at'] = time();
|
||||
if (!empty($user['tagid_list'])) {
|
||||
$user['tagid_list'] = trim(implode(',', $user['tagid_list']), ',');
|
||||
}
|
||||
unset($user['headimgurl']);
|
||||
unset($user['qr_scene'], $user['qr_scene_str']);
|
||||
}
|
||||
|
||||
WechatUsers::insertAll($users);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 chunk size
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $openids
|
||||
* @return int
|
||||
*/
|
||||
protected function getChunkSize($openids)
|
||||
{
|
||||
$size = count($openids);
|
||||
|
||||
if ($size < 10) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ($size > 10 && $size < 100) {
|
||||
return 10;
|
||||
}
|
||||
|
||||
if ($size > 100 && $size < 1000) {
|
||||
return 100;
|
||||
}
|
||||
|
||||
if ($size > 1000 && $size < 10000) {
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信 openids
|
||||
*
|
||||
* @time 2020年06月20日
|
||||
* @param $nextOpenId
|
||||
* @return mixed
|
||||
*/
|
||||
public function getWechatUserOpenids($nextOpenId)
|
||||
{
|
||||
return $this->officialAccount->user->list($nextOpenId);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user