ThinkAdmin/extend/service/FansService.php
2017-02-23 17:54:29 +08:00

188 lines
6.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | Think.Admin
// +----------------------------------------------------------------------
// | 版权所有 2016~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | github开源项目https://github.com/zoujingli/Think.Admin
// +----------------------------------------------------------------------
namespace service;
use library\Data;
use think\Cache;
use think\Db;
use think\Log;
/**
* 微信粉丝数据服务
*
* @author Anyon <zoujingli@qq.com>
* @date 2016/10/24 17:01
*/
class FansService {
/**
* 从微信服务器获取所有标签
* @param $appid
* @return bool
*/
static public function syncTags($appid) {
$wechat = &load_wechat("User", $appid);
if (($result = $wechat->getTags()) !== FALSE) {
$tags = $result['tags'];
foreach ($tags as &$tag) {
$tag['appid'] = $appid;
}
Db::table('wechat_fans_tags')->where('appid', $appid)->delete();
foreach (array_chunk($tags, 100) as $list) {
Db::table('wechat_fans_tags')->insertAll($list);
}
return true;
}
return true;
}
/**
* 同步粉丝的标签
* @param string $appid
* @param string $openid
* @return bool
*/
static public function syncFansTags($appid, $openid) {
$wechat = &load_wechat('User', $appid);
$tagsid = $wechat->getUserTags($openid);
if ($tagsid === false || !is_array($tagsid)) {
return false;
}
return Data::save('wechat_fans', ['appid' => $appid, 'openid' => $openid, 'tagid_list' => join(',', $tagsid)], 'openid', ['appid' => $appid]);
}
/**
* 保存/更新粉丝信息
* @param array $userInfo
* @param string $appid
* @return bool
*/
static public function set($userInfo, $appid = '') {
if (!empty($userInfo['subscribe_time'])) {
$userInfo['subscribe_at'] = date('Y-m-d H:i:s', $userInfo['subscribe_time']);
}
if (!empty($userInfo['tagid_list']) && is_array($userInfo['tagid_list'])) {
$userInfo['tagid_list'] = join(',', $userInfo['tagid_list']);
}
$userInfo['appid'] = $appid;
return Data::save('wechat_fans', $userInfo, 'openid');
}
/**
* 读取粉丝信息
* @param string $openid
* @return array|false
*/
static public function get($openid) {
return Db::table('wechat_fans')->where('openid', $openid)->find();
}
/**
* 同步获取粉丝列表
* @param string $appid
* @param string $next_openid
* @return bool
*/
static public function sync($appid, $next_openid = '') {
$wechat = &load_wechat('User', $appid);
$result = $wechat->getUserList($next_openid);
if ($result === FALSE || empty($result['data']['openid'])) {
Log::record("获取粉丝列表失败,{$wechat->errMsg} [{$wechat->errCode}]", Log::ERROR);
return FALSE;
}
foreach ($result['data']['openid'] as $openid) {
if (FALSE === ($userInfo = $wechat->getUserInfo($openid))) {
Log::record("获取用户[{$openid}]信息失败,$wechat->errMsg", Log::ERROR);
return FALSE;
}
if (FALSE === self::set($userInfo, $wechat->appid)) {
Log::record('更新粉丝信息更新失败!', Log::ERROR);
return FALSE;
}
if ($result['next_openid'] === $openid) {
unset($result['next_openid']);
}
}
return !empty($result['next_openid']) ? self::sync($appid, $result['next_openid']) : TRUE;
}
/**
* 同步获取黑名单信息
* @param string $appid
* @param string $next_openid
* @return bool
*/
static public function syncBlacklist($appid, $next_openid = '') {
$wechat = &load_wechat('User');
$result = $wechat->getBacklist($next_openid);
if ($result === FALSE || (empty($result['data']['openid']))) {
if (empty($result['total'])) {
return TRUE;
}
Log::record("获取粉丝黑名单列表失败,{$wechat->errMsg} [{$wechat->errCode}]", Log::ERROR);
return FALSE;
}
foreach ($result['data']['openid'] as $openid) {
if (FALSE === ($userInfo = $wechat->getUserInfo($openid))) {
Log::record("获取用户[{$openid}]信息失败,$wechat->errMsg", Log::ERROR);
return FALSE;
}
$userInfo['is_back'] = '1';
if (FALSE === self::set($userInfo)) {
Log::record('更新粉丝信息更新失败!', Log::ERROR);
return FALSE;
}
if ($result['next_openid'] === $openid) {
unset($result['next_openid']);
}
}
return !empty($result['next_openid']) ? self::sync_blacklist($appid, $result['next_openid']) : TRUE;
}
/**
* 读取七天的统计数据
* @param string $appid
* @param int $day
* @return array
*/
static public function getTotal($appid, $day = 7) {
$result = Cache::get(($cachekey = "wechat_token_{$appid}"));
if (!empty($result)) {
return $result;
}
$extends = &load_wechat('Extends', $appid);
// 统计总数
$data['cumulate'] = (array) $extends->getDatacube('user', 'cumulate', date('Y-m-d', strtotime("-{$day} day")), date('Y-m-d', strtotime('-1 day')));
// 统计增量数
$data['summary'] = (array) $extends->getDatacube('user', 'summary', date('Y-m-d', strtotime("-{$day} day")), date('Y-m-d', strtotime('-1 day')));
// 统计消息数
$data['upstreammsg'] = (array) $extends->getDatacube('upstreammsg', 'summary', date('Y-m-d', strtotime("-{$day} day")), date('Y-m-d', strtotime('-1 day')));
$temp = array();
for ($i = 1; $i <= $day; $i++) {
$temp[date('Y-m-d', strtotime("-{$i} day"))] = [];
}
foreach ($data as $vo) {
foreach ($vo as $v) {
isset($v['ref_date']) && ($temp[$v['ref_date']] = array_merge($temp[$v['ref_date']], $v));
}
}
ksort($temp);
Cache::set($cachekey, $temp, 600);
return $temp;
}
}