From 3936b2918e87f61c71b89d5c5333bb93d0d2dbe1 Mon Sep 17 00:00:00 2001 From: HanSon Date: Tue, 14 Mar 2017 17:35:56 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E8=A1=A8=E6=83=85=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BB=8E=E8=A1=A8=E6=83=85=E5=BA=93=E4=B8=AD=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E5=8F=91=E9=80=81=20sync=E6=8E=A5=E5=8F=A3=E8=AE=BE=E7=BD=AE35?= =?UTF-8?q?=E7=A7=92=E8=B6=85=E6=97=B6=20Contact=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=87=AA=E8=BA=AB=E7=94=A8=E7=9A=84demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/index.php | 91 +++++++++++++++++------------- src/Collections/ContactFactory.php | 50 ++++++++-------- src/Core/Http.php | 16 ++---- src/Core/Sync.php | 4 +- src/Message/Entity/Emoticon.php | 16 ++++++ 5 files changed, 101 insertions(+), 76 deletions(-) diff --git a/example/index.php b/example/index.php index 6c49a1e2..c0bb39a1 100644 --- a/example/index.php +++ b/example/index.php @@ -35,7 +35,8 @@ ]); // 图灵自动回复 -function reply($str){ +function reply($str) +{ return http()->post('http://www.tuling123.com/openapi/api', [ 'key' => '1dce02aef026258eff69635a06b0ab7d', 'info' => $str @@ -49,8 +50,8 @@ function reply($str){ // 位置信息 返回位置文字 if ($message instanceof Location) { /** @var $message Location */ - Text::send('地图链接:'.$message->from['UserName'], $message->url); - return '位置:'.$message; + Text::send('地图链接:' . $message->from['UserName'], $message->url); + return '位置:' . $message; } // 文字信息 @@ -60,136 +61,146 @@ function reply($str){ if ($message->fromType === 'Contact') { return reply($message->content); // 群组@我回复 - } elseif ($message->fromType === 'Group' && $message->isAt) { - return reply($message->content); + } elseif ($message->fromType === 'Group') { + + if (str_contains($message->content, '设置群名称') && $message->from['Alias'] === 'hanson1994') { + group()->setGroupName($message->from['UserName'], str_replace('设置群名称', '', $message->content)); + } + + if ($message->isAt) { + return reply($message->content); + } } } // 图片信息 返回接收到的图片 if ($message instanceof Image) { - return $message; +// return $message; } // 视频信息 返回接收到的视频 if ($message instanceof Video) { - return $message; +// return $message; } // 表情信息 返回接收到的表情 if ($message instanceof Emoticon) { - return $message; + Emoticon::sendRandom($message->from['UserName']); } // 语音消息 - if($message instanceof Voice){ + if ($message instanceof Voice) { /** @var $message Voice */ - return '收到一条语音并下载在' . $message::getPath($message::$folder) . "/{$message->msg['MsgId']}.mp3"; +// return '收到一条语音并下载在' . $message::getPath($message::$folder) . "/{$message->msg['MsgId']}.mp3"; } // 撤回信息 if ($message instanceof Recall && $message->msg['FromUserName'] !== myself()->username) { /** @var $message Recall */ - if($message->origin instanceof Image){ + if ($message->origin instanceof Image) { Text::send($message->msg['FromUserName'], "{$message->nickname} 撤回了一张照片"); Image::sendByMsgId($message->msg['FromUserName'], $message->origin->msg['MsgId']); - }elseif($message->origin instanceof Emoticon){ + } elseif ($message->origin instanceof Emoticon) { Text::send($message->msg['FromUserName'], "{$message->nickname} 撤回了一个表情"); Emoticon::sendByMsgId($message->msg['FromUserName'], $message->origin->msg['MsgId']); - }elseif($message->origin instanceof Video){ + } elseif ($message->origin instanceof Video) { Text::send($message->msg['FromUserName'], "{$message->nickname} 撤回了一个视频"); Video::sendByMsgId($message->msg['FromUserName'], $message->origin->msg['MsgId']); - }elseif($message->origin instanceof Voice){ + } elseif ($message->origin instanceof Voice) { Text::send($message->msg['FromUserName'], "{$message->nickname} 撤回了一条语音"); - }else{ + } else { Text::send($message->msg['FromUserName'], "{$message->nickname} 撤回了一条信息 \"{$message->origin->msg['Content']}\""); } } // 红包信息 - if($message instanceof RedPacket){ + if ($message instanceof RedPacket) { // do something to notify if you want ... - return $message->content . ' 来自 ' .$message->from['NickName']; + return $message->content . ' 来自 ' . $message->from['NickName']; } // 转账信息 - if($message instanceof Transfer){ + if ($message instanceof Transfer) { /** @var $message Transfer */ return $message->content . ' 收到金额 ' . $message->fee; } // 推荐名片信息 - if($message instanceof Recommend){ + if ($message instanceof Recommend) { /** @var $message Recommend */ - if($message->isOfficial){ + if ($message->isOfficial) { return $message->from['NickName'] . ' 向你推荐了公众号 ' . $message->province . $message->city . " {$message->info['NickName']} 公众号信息: {$message->description}"; - }else{ + } else { return $message->from['NickName'] . ' 向你推荐了 ' . $message->province . $message->city . " {$message->info['NickName']} 头像链接: {$message->bigAvatar}"; } } // 请求添加信息 - if($message instanceof RequestFriend){ + if ($message instanceof RequestFriend) { /** @var $message RequestFriend */ $groupUsername = group()->getGroupsByNickname('芬芬', true)->first()['UserName']; Text::send($groupUsername, "{$message->info['NickName']} 请求添加好友 \"{$message->info['Content']}\""); - if($message->info['Content'] === '上山打老虎'){ + if ($message->info['Content'] === '上山打老虎') { Text::send($groupUsername, '暗号正确'); $message->verifyUser($message::VIA); - }else{ + } else { Text::send($groupUsername, '暗号错误'); } } // 分享信息 - if($message instanceof Share){ + if ($message instanceof Share) { /** @var $message Share */ $reply = "收到分享\n标题:{$message->title}\n描述:{$message->description}\n链接:{$message->url}"; - if($message->app){ + if ($message->app) { $reply .= "\n来源APP:{$message->app}"; } return $reply; } // 分享小程序信息 - if($message instanceof Mina){ + if ($message instanceof Mina) { /** @var $message Mina */ $reply = "收到小程序\n小程序名词:{$message->title}\n链接:{$message->url}"; return $reply; } // 公众号推送信息 - if($message instanceof Official){ + if ($message instanceof Official) { /** @var $message Official */ $reply = "收到公众号推送\n标题:{$message->title}\n描述:{$message->description}\n链接:{$message->url}\n来源公众号名称:{$message->app}"; return $reply; } // 手机点击聊天事件 - if($message instanceof Touch){ - Text::send($message->msg['ToUserName'], "我点击了此聊天"); + if ($message instanceof Touch) { +// Text::send($message->msg['ToUserName'], "我点击了此聊天"); } // 新增好友 - if($message instanceof \Hanson\Vbot\Message\Entity\NewFriend){ + if ($message instanceof \Hanson\Vbot\Message\Entity\NewFriend) { \Hanson\Vbot\Support\Console::log('新加好友:' . $message->from['NickName']); } // 群组变动 - if($message instanceof GroupChange){ + if ($message instanceof GroupChange) { /** @var $message GroupChange */ - if($message->action === 'ADD'){ + if ($message->action === 'ADD') { \Hanson\Vbot\Support\Console::log('新人进群'); - return $message->content; - }elseif($message->action === 'REMOVE'){ + return '欢迎新人 ' . $message->nickname; + } elseif ($message->action === 'REMOVE') { \Hanson\Vbot\Support\Console::log('群主踢人了'); return $message->content; - }elseif($message->action === 'RENAME'){ - \Hanson\Vbot\Support\Console::log($message->from['NickName'].' 改名为 '.$message->rename); - return $message->content; + } elseif ($message->action === 'RENAME') { +// \Hanson\Vbot\Support\Console::log($message->from['NickName'] . ' 改名为 ' . $message->rename); + if ($message->rename !== 'vbot 测试群'){ + group()->setGroupName($message->from['UserName'], 'vbot 测试群'); + return '行不改名,坐不改姓!'; + } } } @@ -197,11 +208,11 @@ function reply($str){ }); -$robot->server->setExitHandler(function(){ +$robot->server->setExitHandler(function () { \Hanson\Vbot\Support\Console::log('其他设备登录'); }); -$robot->server->setExceptionHandler(function(){ +$robot->server->setExceptionHandler(function () { \Hanson\Vbot\Support\Console::log('异常退出'); }); diff --git a/src/Collections/ContactFactory.php b/src/Collections/ContactFactory.php index 0ea03477..b36aac8c 100644 --- a/src/Collections/ContactFactory.php +++ b/src/Collections/ContactFactory.php @@ -34,11 +34,11 @@ public function getContacts() $this->makeContactList(); $contact = contact()->get(myself()->username); - myself()->alias = isset($contact['Alias']) ? $contact['Alias'] : myself()->nickname ? : myself()->username; + myself()->alias = isset($contact['Alias']) ? $contact['Alias'] : myself()->nickname ?: myself()->username; $this->getBatchGroupMembers(); - if(server()->config['debug']){ + if (server()->config['debug']) { FileManager::download('contact.json', json_encode(contact()->all())); FileManager::download('member.json', json_encode(member()->all())); FileManager::download('group.json', json_encode(group()->all())); @@ -56,23 +56,23 @@ public function makeContactList($seq = 0) $url = sprintf(server()->baseUri . '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s&seq=%s', server()->passTicket, server()->skey, time(), $seq); $result = http()->json($url, [], true); - $memberList = $result['MemberList']; - $seq = $result['Seq']; - - foreach ($memberList as $contact) { - if(official()->isOfficial($contact['VerifyFlag'])){ #公众号 - Official::getInstance()->put($contact['UserName'], $contact); - }elseif (in_array($contact['UserName'], static::SPECIAL_USERS)){ # 特殊账户 - Special::getInstance()->put($contact['UserName'], $contact); - }elseif (strstr($contact['UserName'], '@@') !== false){ # 群聊 - group()->put($contact['UserName'], $contact); - }else{ - contact()->put($contact['UserName'], $contact); + + if (isset($result['MemberList']) && $result['MemberList']) { + foreach ($result['MemberList'] as $contact) { + if (official()->isOfficial($contact['VerifyFlag'])) { #公众号 + Official::getInstance()->put($contact['UserName'], $contact); + } elseif (in_array($contact['UserName'], static::SPECIAL_USERS)) { # 特殊账户 + Special::getInstance()->put($contact['UserName'], $contact); + } elseif (strstr($contact['UserName'], '@@') !== false) { # 群聊 + group()->put($contact['UserName'], $contact); + } else { + contact()->put($contact['UserName'], $contact); + } } } - if($seq != 0){ - $this->makeContactList($seq); + if (isset($result['Seq']) && $result['Seq'] != 0) { + $this->makeContactList($result['Seq']); } } @@ -84,7 +84,7 @@ public function getBatchGroupMembers() $url = sprintf(server()->baseUri . '/webwxbatchgetcontact?type=ex&r=%s&pass_ticket=%s', time(), server()->passTicket); $list = []; - group()->each(function($item, $key) use (&$list){ + group()->each(function ($item, $key) use (&$list) { $list[] = ['UserName' => $key, 'EncryChatRoomId' => '']; }); @@ -104,13 +104,15 @@ public function getBatchGroupMembers() */ private function initGroupMembers($array) { - foreach ($array['ContactList'] as $group) { - $groupAccount = group()->get($group['UserName']); - $groupAccount['MemberList'] = $group['MemberList']; - $groupAccount['ChatRoomId'] = $group['EncryChatRoomId']; - group()->put($group['UserName'], $groupAccount); - foreach ($group['MemberList'] as $member) { - member()->put($member['UserName'], $member); + if (isset($array['ContactList']) && $array['ContactList']) { + foreach ($array['ContactList'] as $group) { + $groupAccount = group()->get($group['UserName']); + $groupAccount['MemberList'] = $group['MemberList']; + $groupAccount['ChatRoomId'] = $group['EncryChatRoomId']; + group()->put($group['UserName'], $groupAccount); + foreach ($group['MemberList'] as $member) { + member()->put($member['UserName'], $member); + } } } diff --git a/src/Core/Http.php b/src/Core/Http.php index bc6f5d5b..00a5174c 100644 --- a/src/Core/Http.php +++ b/src/Core/Http.php @@ -50,9 +50,11 @@ public function post($url, $query = [], $array = false) return $array ? json_decode($content, true) : $content; } - public function json($url, $options = [], $array = false) + public function json($url, $params = [], $array = false, $extra = []) { - $content = $this->request($url, 'POST', ['json' => $options]); + $params = array_merge(['json' => $params], $extra); + + $content = $this->request($url, 'POST', $params); return $array ? json_decode($content, true) : $content; } @@ -86,15 +88,9 @@ public function getClient() */ public function request($url, $method = 'GET', $options = []) { - try{ - $response = $this->getClient()->request($method, $url, $options); - return $response->getBody()->getContents(); - }catch (\Exception $e){ - Console::log('http链接失败:' . $e->getMessage(), Console::ERROR); - Console::log('错误URL:' . $url, Console::ERROR); - } + $response = $this->getClient()->request($method, $url, $options); - return null; + return $response->getBody()->getContents(); } diff --git a/src/Core/Sync.php b/src/Core/Sync.php index 0f898b0c..76b44315 100644 --- a/src/Core/Sync.php +++ b/src/Core/Sync.php @@ -52,7 +52,7 @@ public function sync() 'BaseRequest' => server()->baseRequest, 'SyncKey' => server()->syncKey, 'rr' => ~time() - ], true); + ], true, ['timeout' => 35]); if($result['BaseResponse']['Ret'] == 0){ $this->generateSyncKey($result); @@ -60,7 +60,7 @@ public function sync() return $result; }catch (\Exception $e){ - return null; + $this->sync(); } } diff --git a/src/Message/Entity/Emoticon.php b/src/Message/Entity/Emoticon.php index 4074a54c..9b05cd8d 100644 --- a/src/Message/Entity/Emoticon.php +++ b/src/Message/Entity/Emoticon.php @@ -78,6 +78,22 @@ public static function sendByMsgId($username, $msgId) static::send($username, $path . "/{$msgId}.gif"); } + /** + * 从当前账号的本地表情库随机发送一个 + * + * @param $username + */ + public static function sendRandom($username) + { + $path = static::getPath(static::$folder); + + $files = scandir($path); + unset($files[0], $files[1]); + $msgId = $files[array_rand($files)]; + + static::send($username, $path . '/' . $msgId); + } + /** * 下载文件 * From 1bf3ea1660b125313b81884bdf688a182eb9df57 Mon Sep 17 00:00:00 2001 From: HanSon Date: Wed, 15 Mar 2017 13:20:30 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9console=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/Server.php | 6 ++++-- src/Core/Sync.php | 2 +- src/Message/Entity/Emoticon.php | 4 ++-- src/Message/Entity/GroupChange.php | 4 ++-- src/Message/Entity/Image.php | 4 ++-- src/Message/Entity/NewFriend.php | 4 ++-- src/Message/Entity/Text.php | 2 +- src/Message/Entity/Video.php | 7 ++++--- src/Message/UploadAble.php | 4 ++-- src/Support/Console.php | 12 ++++++++++++ 10 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/Core/Server.php b/src/Core/Server.php index 14d367e8..80ca8ee0 100644 --- a/src/Core/Server.php +++ b/src/Core/Server.php @@ -88,8 +88,10 @@ public function run() $this->statusNotify(); Console::log('开始初始化联系人'); $this->initContact(); - Console::log(sprintf("初始化联系人成功\n群数量: %d\n联系人数量: %d\n公众号数量: %d\n特殊号数量: %d", group()->count(), contact()->count(), official()->count(), Special::getInstance()->count())); - + Console::log('初始化联系人成功'); + Console::log(sprintf("群数量: %d", group()->count())); + Console::log(sprintf("联系人数量: %d", contact()->count())); + Console::log(sprintf("公众号数量: %d", official()->count())); MessageHandler::getInstance()->listen(); } diff --git a/src/Core/Sync.php b/src/Core/Sync.php index 76b44315..3c45705b 100644 --- a/src/Core/Sync.php +++ b/src/Core/Sync.php @@ -107,7 +107,7 @@ public function checkTime($time) */ public function debugMessage($retCode, $selector, $sleep = null) { - Console::log('[DEBUG] retcode:' . $retCode . ' selector:' . $selector); + Console::log('retcode:' . $retCode . ' selector:' . $selector, Console::WARNING); if($sleep){ sleep($sleep); diff --git a/src/Message/Entity/Emoticon.php b/src/Message/Entity/Emoticon.php index 9b05cd8d..036e0987 100644 --- a/src/Message/Entity/Emoticon.php +++ b/src/Message/Entity/Emoticon.php @@ -35,7 +35,7 @@ public static function send($username, $file) $response = static::uploadMedia($username, $file); if (!$response) { - Console::log("表情 {$file} 上传失败"); + Console::log("表情 {$file} 上传失败", Console::WARNING); return false; } @@ -57,7 +57,7 @@ public static function send($username, $file) $result = http()->json($url, $data, true); if ($result['BaseResponse']['Ret'] != 0) { - Console::log('发送表情失败'); + Console::log('发送表情失败', Console::WARNING); return false; } diff --git a/src/Message/Entity/GroupChange.php b/src/Message/Entity/GroupChange.php index 3fdbc51c..6206cd37 100644 --- a/src/Message/Entity/GroupChange.php +++ b/src/Message/Entity/GroupChange.php @@ -31,9 +31,9 @@ public function make() { if(str_contains($this->msg['Content'], '加入了群聊')){ $this->action = 'ADD'; - Console::log("检测到 {$this->from['NickName']} 有新成员,正在刷新群成员列表..."); + Console::debug("检测到 {$this->from['NickName']} 有新成员,正在刷新群成员列表..."); (new ContactFactory())->makeContactList(); - Console::log('群成员更新成功!'); + Console::debug('群成员更新成功!'); }elseif(str_contains($this->msg['Content'], '移出了群聊')){ $this->action = 'REMOVE'; }elseif(str_contains($this->msg['Content'], '改群名为')){ diff --git a/src/Message/Entity/Image.php b/src/Message/Entity/Image.php index e1b84e47..f8096a0b 100644 --- a/src/Message/Entity/Image.php +++ b/src/Message/Entity/Image.php @@ -42,7 +42,7 @@ public static function send($username, $file) $response = static::uploadMedia($username, $file); if (!$response) { - Console::log("文件 {$file} 上传失败"); + Console::log("文件 {$file} 上传失败", Console::WARNING); return false; } @@ -63,7 +63,7 @@ public static function send($username, $file) $result = http()->json($url, $data, true); if ($result['BaseResponse']['Ret'] != 0) { - Console::log('发送图片失败'); + Console::log('发送图片失败', Console::WARNING); return false; } diff --git a/src/Message/Entity/NewFriend.php b/src/Message/Entity/NewFriend.php index 31356cb0..c10819ec 100644 --- a/src/Message/Entity/NewFriend.php +++ b/src/Message/Entity/NewFriend.php @@ -24,8 +24,8 @@ public function __construct($msg) public function make() { - Console::log('检测到新加好友,正在刷新好友列表...'); + Console::debug('检测到新加好友,正在刷新好友列表...'); (new ContactFactory())->makeContactList(); - Console::log('好友更新成功!'); + Console::debug('好友更新成功!'); } } \ No newline at end of file diff --git a/src/Message/Entity/Text.php b/src/Message/Entity/Text.php index 2009ed6f..fd110f35 100644 --- a/src/Message/Entity/Text.php +++ b/src/Message/Entity/Text.php @@ -58,7 +58,7 @@ public static function send($username, $word) ); if ($result['BaseResponse']['Ret'] != 0) { - Console::log('发送消息失败'); + Console::log('发送消息失败', Console::WARNING); return false; } diff --git a/src/Message/Entity/Video.php b/src/Message/Entity/Video.php index a2eb54f9..0aad91d3 100644 --- a/src/Message/Entity/Video.php +++ b/src/Message/Entity/Video.php @@ -34,7 +34,7 @@ public static function send($username, $file) $response = static::uploadMedia($username, $file); if (!$response) { - Console::log("视频 {$file} 上传失败"); + Console::log("视频 {$file} 上传失败", Console::WARNING); return false; } @@ -55,7 +55,7 @@ public static function send($username, $file) $result = http()->json($url, $data, true); if ($result['BaseResponse']['Ret'] != 0) { - Console::log('发送视频失败'); + Console::log('发送视频失败', Console::WARNING); return false; } @@ -90,7 +90,8 @@ public function download() ] ]); if(strlen($content) === 0){ - Console::log('下载视频失败', Console::ERROR); + Console::log('下载视频失败', Console::WARNING); + Console::log('url:'. $url); }else{ FileManager::download($this->msg['MsgId'] . '.mp4', $content, static::$folder); } diff --git a/src/Message/UploadAble.php b/src/Message/UploadAble.php index 3c2171bc..f333bd76 100644 --- a/src/Message/UploadAble.php +++ b/src/Message/UploadAble.php @@ -79,7 +79,7 @@ public static function send($username, $file) $response = static::uploadMedia($username, $file); if(!$response){ - Console::log("文件 {$file} 上传失败"); + Console::log("文件 {$file} 上传失败", Console::WARNING); return false; } @@ -100,7 +100,7 @@ public static function send($username, $file) $result = http()->json($url, $data, true); if($result['BaseResponse']['Ret'] != 0){ - Console::log('发送文件失败'); + Console::log('发送文件失败', Console::WARNING); return false; } diff --git a/src/Support/Console.php b/src/Support/Console.php index 3007d475..d52a64f7 100644 --- a/src/Support/Console.php +++ b/src/Support/Console.php @@ -33,6 +33,18 @@ public static function log($str, $level = 'INFO') echo '[' . Carbon::now()->toDateTimeString() . ']' . "[{$level}] " . $str . PHP_EOL; } + /** + * debug 模式下调试输出 + * + * @param $str + */ + public static function debug($str) + { + if (server()->config['debug']) { + static::log($str, 'DEBUG'); + } + } + /** * 初始化二维码style * From d4a8ea8b098f64d6af1fa9e4210f92c24788adcb Mon Sep 17 00:00:00 2001 From: HanSon Date: Wed, 15 Mar 2017 14:11:13 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20onceHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/index.php | 21 ++++++++++++++++++--- src/Collections/Group.php | 25 +++++++++++++++++++++++++ src/Core/MessageHandler.php | 21 +++++++++++++++++++++ src/Core/Server.php | 5 +++++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/example/index.php b/example/index.php index c0bb39a1..cd1023c9 100644 --- a/example/index.php +++ b/example/index.php @@ -44,6 +44,19 @@ function reply($str) } +$groupMap = [ + 'vbot 测试群' => 1, +]; + +$robot->server->setOnceHandler(function () use ($groupMap) { + group()->reset(group()->map(function ($group, $key) use ($groupMap) { + if (isset($groupMap[$group['NickName']])){ + $group['id'] = $groupMap[$group['NickName']]; + } + return $group; + })->toArray()); +}); + $robot->server->setMessageHandler(function ($message) use ($path) { /** @var $message Message */ @@ -63,8 +76,10 @@ function reply($str) // 群组@我回复 } elseif ($message->fromType === 'Group') { - if (str_contains($message->content, '设置群名称') && $message->from['Alias'] === 'hanson1994') { - group()->setGroupName($message->from['UserName'], str_replace('设置群名称', '', $message->content)); + if (str_contains($message->content, '设置群名称')) { + if (isset($message->sender['Alias']) && $message->sender['Alias'] === 'hanson1994') { + group()->setGroupName($message->from['UserName'], str_replace('设置群名称', '', $message->content)); + } } if ($message->isAt) { @@ -197,7 +212,7 @@ function reply($str) return $message->content; } elseif ($message->action === 'RENAME') { // \Hanson\Vbot\Support\Console::log($message->from['NickName'] . ' 改名为 ' . $message->rename); - if ($message->rename !== 'vbot 测试群'){ + if (isset($message->from['id']) && $message->from['id'] == 1 && $message->rename !== 'vbot 测试群') { group()->setGroupName($message->from['UserName'], 'vbot 测试群'); return '行不改名,坐不改姓!'; } diff --git a/src/Collections/Group.php b/src/Collections/Group.php index 2724ebcc..86324542 100644 --- a/src/Collections/Group.php +++ b/src/Collections/Group.php @@ -31,6 +31,16 @@ public static function getInstance() return static::$instance; } + /** + * 重置数据 + * + * @param $array + */ + public function reset($array) + { + static::$instance = new Group($array); + } + /** * 判断是否群组 * @@ -61,6 +71,21 @@ public function getGroupsByNickname($name, $blur = false) return $groups; } + /** + * 根据通讯录中的昵称获取通讯对象 + * + * @param $nickname + * @return mixed + */ + public function getUsernameByNickname($nickname) + { + return $this->search(function($item, $key) use ($nickname){ + if($item['NickName'] === $nickname){ + return true; + } + }); + } + /** * 创建群聊天 * diff --git a/src/Core/MessageHandler.php b/src/Core/MessageHandler.php index 68048814..0168cb07 100644 --- a/src/Core/MessageHandler.php +++ b/src/Core/MessageHandler.php @@ -32,6 +32,8 @@ class MessageHandler private $exceptionHandler; + private $onceHandler; + private $sync; private $messageFactory; @@ -116,11 +118,30 @@ public function setExceptionHandler(Closure $closure) $this->exceptionHandler = $closure; } + /** + * 执行一次的处理器 + * + * @param Closure $closure + * @throws \Exception + */ + public function setOnceHandler(Closure $closure) + { + if(!$closure instanceof Closure){ + throw new \Exception('exit handler must be a closure!'); + } + + $this->onceHandler = $closure; + } + /** * 轮询消息API接口 */ public function listen() { + if($this->onceHandler instanceof Closure){ + call_user_func_array($this->onceHandler, []); + } + while (true){ if($this->customHandler instanceof Closure){ call_user_func_array($this->customHandler, []); diff --git a/src/Core/Server.php b/src/Core/Server.php index 80ca8ee0..ca998a35 100644 --- a/src/Core/Server.php +++ b/src/Core/Server.php @@ -339,4 +339,9 @@ public function setExceptionHandler(\Closure $closure) { MessageHandler::getInstance()->setExceptionHandler($closure); } + + public function setOnceHandler(\Closure $closure) + { + MessageHandler::getInstance()->setOnceHandler($closure); + } } \ No newline at end of file From 4e1523c62b8d521562ff03c80fe54f369de1eb4b Mon Sep 17 00:00:00 2001 From: HanSon Date: Wed, 15 Mar 2017 21:46:23 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E8=A2=AB=E9=82=80?= =?UTF-8?q?=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Message/Entity/GroupChange.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Message/Entity/GroupChange.php b/src/Message/Entity/GroupChange.php index 6206cd37..049b9930 100644 --- a/src/Message/Entity/GroupChange.php +++ b/src/Message/Entity/GroupChange.php @@ -29,7 +29,10 @@ public function __construct($msg) public function make() { - if(str_contains($this->msg['Content'], '加入了群聊')){ + if(str_contains($this->msg['Content'], '邀请你')){ + print_r($this->msg); + $this->action = 'INVITE'; + }elseif(str_contains($this->msg['Content'], '加入了群聊')){ $this->action = 'ADD'; Console::debug("检测到 {$this->from['NickName']} 有新成员,正在刷新群成员列表..."); (new ContactFactory())->makeContactList(); From b052cf3a69e42428f2f6d191fbc32e70d84469a4 Mon Sep 17 00:00:00 2001 From: HanSon Date: Thu, 16 Mar 2017 00:17:30 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E8=BF=9B=E7=BE=A4=E6=97=B6=E7=9A=84bug=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AD=90=E7=B1=BB=E5=9E=8B=E2=80=9C=E9=82=80=E8=AF=B7=E2=80=9D?= =?UTF-8?q?=E3=80=81=E2=80=9C=E8=A2=AB=E8=B8=A2=E5=87=BA=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/index.php | 8 +++++-- src/Core/MessageFactory.php | 2 +- src/Core/MessageHandler.php | 6 ++++++ src/Message/Entity/GroupChange.php | 34 +++++++++++++++++++++++++----- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/example/index.php b/example/index.php index cd1023c9..8943b432 100644 --- a/example/index.php +++ b/example/index.php @@ -205,10 +205,10 @@ function reply($str) if ($message instanceof GroupChange) { /** @var $message GroupChange */ if ($message->action === 'ADD') { - \Hanson\Vbot\Support\Console::log('新人进群'); + \Hanson\Vbot\Support\Console::debug('新人进群'); return '欢迎新人 ' . $message->nickname; } elseif ($message->action === 'REMOVE') { - \Hanson\Vbot\Support\Console::log('群主踢人了'); + \Hanson\Vbot\Support\Console::debug('群主踢人了'); return $message->content; } elseif ($message->action === 'RENAME') { // \Hanson\Vbot\Support\Console::log($message->from['NickName'] . ' 改名为 ' . $message->rename); @@ -216,6 +216,10 @@ function reply($str) group()->setGroupName($message->from['UserName'], 'vbot 测试群'); return '行不改名,坐不改姓!'; } + } elseif ($message->action === 'BE_REMOVE') { + \Hanson\Vbot\Support\Console::debug('你被踢出了群 ' . $message->group['NickName']); + } elseif ($message->action === 'INVITE') { + \Hanson\Vbot\Support\Console::debug('你被邀请进群 ' . $message->from['NickName']); } } diff --git a/src/Core/MessageFactory.php b/src/Core/MessageFactory.php index 2cfbd428..0efce975 100644 --- a/src/Core/MessageFactory.php +++ b/src/Core/MessageFactory.php @@ -68,7 +68,7 @@ private function handleMessageByType($msg) else if(str_contains($msg['Content'], '添加') || str_contains($msg['Content'], 'have added') || str_contains($msg['Content'], '打招呼')){ # 添加好友 return new NewFriend($msg); - }else if(str_contains($msg['Content'], '加入了群聊') || str_contains($msg['Content'], '移出了群聊') || str_contains($msg['Content'], '改群名为')){ + }else if(str_contains($msg['Content'], '加入了群聊') || str_contains($msg['Content'], '移出了群聊') || str_contains($msg['Content'], '改群名为') || str_contains($msg['Content'], '移出群聊') || str_contains($msg['Content'], '邀请你')){ return new GroupChange($msg); } break; diff --git a/src/Core/MessageHandler.php b/src/Core/MessageHandler.php index 0168cb07..ea7226c9 100644 --- a/src/Core/MessageHandler.php +++ b/src/Core/MessageHandler.php @@ -184,6 +184,12 @@ private function handlerMessage($selector) $message = $this->sync->sync(); + if(count($message['ModContactList']) > 0){ + foreach ($message['ModContactList'] as $contact) { + group()->put($contact['UserName'], $contact); + } + } + if($message['AddMsgList']){ foreach ($message['AddMsgList'] as $msg) { $content = $this->messageFactory->make($msg); diff --git a/src/Message/Entity/GroupChange.php b/src/Message/Entity/GroupChange.php index 049b9930..da30b50b 100644 --- a/src/Message/Entity/GroupChange.php +++ b/src/Message/Entity/GroupChange.php @@ -18,8 +18,27 @@ class GroupChange extends Message implements MessageInterface public $action; + /** + * 群名重命名的名称 + * + * @var + */ public $rename; + /** + * 被踢出群时的群信息 + * + * @var + */ + public $group; + + /** + * 新人进群的昵称(可能单个可能多个) + * + * @var + */ + public $nickname; + public function __construct($msg) { parent::__construct($msg); @@ -29,20 +48,25 @@ public function __construct($msg) public function make() { - if(str_contains($this->msg['Content'], '邀请你')){ - print_r($this->msg); + Console::debug($this->msg['Content']); + if (str_contains($this->msg['Content'], '邀请你')) { $this->action = 'INVITE'; - }elseif(str_contains($this->msg['Content'], '加入了群聊')){ + } elseif (str_contains($this->msg['Content'], '加入了群聊')) { + preg_match('/".+".+"(.+)"加入了群聊/', $this->msg['Content'], $match); $this->action = 'ADD'; + $this->nickname = $match[1]; Console::debug("检测到 {$this->from['NickName']} 有新成员,正在刷新群成员列表..."); (new ContactFactory())->makeContactList(); Console::debug('群成员更新成功!'); - }elseif(str_contains($this->msg['Content'], '移出了群聊')){ + } elseif (str_contains($this->msg['Content'], '移出了群聊')) { $this->action = 'REMOVE'; - }elseif(str_contains($this->msg['Content'], '改群名为')){ + } elseif (str_contains($this->msg['Content'], '改群名为')) { $this->action = 'RENAME'; preg_match('/改群名为“(.+)”/', $this->msg['Content'], $match); $this->updateGroupName($match[1]); + } elseif (str_contains($this->msg['Content'], '移出群聊')) { + $this->action = 'BE_REMOVE'; + $this->group = group()->pull($this->from['UserName']); } $this->content = $this->msg['Content']; From a7d85f3aa22ce0f1c700542b9ef1698913b6bc94 Mon Sep 17 00:00:00 2001 From: HanSon Date: Thu, 16 Mar 2017 15:58:28 +0800 Subject: [PATCH 6/8] =?UTF-8?q?contact=E7=9A=84getUsernameByNickname?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A8=A1=E7=B3=8A=E6=90=9C=E7=B4=A2=20?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86member=E7=9A=84=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E5=8A=A0=E5=B1=82=E6=AC=A1=E6=80=A7=E3=80=81?= =?UTF-8?q?=E6=95=B4=E6=B4=81=20group=E5=A2=9E=E5=8A=A0=E4=BA=86map?= =?UTF-8?q?=E5=AF=B9=E5=BA=94ID=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=AE=A1?= =?UTF-8?q?=E7=90=86=20=E5=A2=9E=E5=8A=A0=E4=BA=86getMembersByNickname?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E6=A8=A1=E7=B3=8A=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=20=E5=A2=9E=E5=8A=A0=E4=BA=86getUsernameById=EF=BC=8C=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E5=B7=B2=E8=AE=BE=E7=BD=AE=E7=9A=84map=E8=8E=B7?= =?UTF-8?q?=E5=8F=96username=20=E5=A2=9E=E5=8A=A0=E4=BA=86setMap=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=AF=B9=E5=BA=94ID=20member=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=86getMembersByNickname,=E6=94=AF=E6=8C=81=E6=A8=A1?= =?UTF-8?q?=E7=B3=8A=E5=8C=B9=E9=85=8D=E6=88=90=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/index.php | 82 ++++++++++++++++++++++++++---- src/Collections/Contact.php | 28 +++++----- src/Collections/ContactFactory.php | 4 +- src/Collections/Group.php | 64 +++++++++++++++++++---- src/Collections/Member.php | 27 +++++++++- src/Core/MessageHandler.php | 56 ++++++++++---------- src/Message/Entity/GroupChange.php | 2 +- 7 files changed, 202 insertions(+), 61 deletions(-) diff --git a/example/index.php b/example/index.php index 8943b432..e8ba4684 100644 --- a/example/index.php +++ b/example/index.php @@ -44,17 +44,40 @@ function reply($str) } +// 设置管理员 +function isAdmin($message) +{ + $adminAlias = 'hanson1994'; + + if (in_array($message->fromType, ['Contact', 'Group'])) { + if ($message->fromType === 'Contact') { + return $message->from['Alias'] === $adminAlias; + } else { + return isset($message->sender['Alias']) && $message->sender['Alias'] === $adminAlias; + } + } + + return false; +} + $groupMap = [ - 'vbot 测试群' => 1, + [ + 'nickname' => 'vbot 测试群', + 'id' => 1 + ] ]; $robot->server->setOnceHandler(function () use ($groupMap) { - group()->reset(group()->map(function ($group, $key) use ($groupMap) { - if (isset($groupMap[$group['NickName']])){ - $group['id'] = $groupMap[$group['NickName']]; + group()->each(function ($group, $key) use ($groupMap) { + foreach ($groupMap as $map) { + if ($group['NickName'] === $map['nickname']) { + $group['id'] = $map['id']; + $groupMap[$key] = $map['id']; + group()->setMap($key, $map['id']); + } } return $group; - })->toArray()); + }); }); $robot->server->setMessageHandler(function ($message) use ($path) { @@ -70,16 +93,52 @@ function reply($str) // 文字信息 if ($message instanceof Text) { /** @var $message Text */ + + if (str_contains($message->content, 'vbot') && !$message->isAt) { + return "你好,我叫vbot,我爸是HanSon\n我的项目地址是 https://github.com/HanSon/vbot \n欢迎来给我star!"; + } + // 联系人自动回复 if ($message->fromType === 'Contact') { + if ($message->content === '拉我') { + $username = group()->getUsernameById(1); + + group()->addMember($username, $message->from['UserName']); + } + + if($message->content === '测试'){ + $username = group()->getUsernameById(1); + print_r($username); + print_r(group()->get($username)); + } + return reply($message->content); // 群组@我回复 } elseif ($message->fromType === 'Group') { - if (str_contains($message->content, '设置群名称')) { - if (isset($message->sender['Alias']) && $message->sender['Alias'] === 'hanson1994') { - group()->setGroupName($message->from['UserName'], str_replace('设置群名称', '', $message->content)); + if (str_contains($message->content, '设置群名称') && isAdmin($message)) { + group()->setGroupName($message->from['UserName'], str_replace('设置群名称', '', $message->content)); + } + + if (str_contains($message->content, '搜人') && isAdmin($message)) { + $nickname = str_replace('搜人', '', $message->content); + $members = group()->getMembersByNickname($message->from['UserName'], $nickname, true); + $result = '搜索结果 数量:' . count($members) . "\n"; + foreach ($members as $member) { + $result .= $member['NickName'] . ' ' . $member['UserName'] . "\n"; } + return $result; + } + + if (str_contains($message->content, '踢人') && isAdmin($message)) { + $username = str_replace('踢人', '', $message->content); + group()->deleteMember($message->from['UserName'], $username); + } + + if (str_contains($message->content, '踢我') && $message->isAt) { + Text::send($message->from['UserName'], '拜拜 ' . $message->sender['NickName']); + group()->deleteMember($message->from['UserName'], $message->sender['UserName']); + return 'vbot 从未见过这么犯贱的人'; } if ($message->isAt) { @@ -198,7 +257,10 @@ function reply($str) // 新增好友 if ($message instanceof \Hanson\Vbot\Message\Entity\NewFriend) { - \Hanson\Vbot\Support\Console::log('新加好友:' . $message->from['NickName']); + \Hanson\Vbot\Support\Console::debug('新加好友:' . $message->from['NickName']); + Text::send($message->from['UserName'], "客官,等你很久了!感谢跟 vbot 交朋友,如果可以帮我点个star,谢谢了!https://github.com/HanSon/vbot"); + group()->addMember(group()->getUsernameById(1), $message->from['UserName']); + return '现在拉你进去vbot的测试群,进去后为了避免轰炸记得设置免骚扰哦!如果被不小心踢出群,跟我说声“拉我”我就会拉你进群的了。'; } // 群组变动 @@ -212,7 +274,7 @@ function reply($str) return $message->content; } elseif ($message->action === 'RENAME') { // \Hanson\Vbot\Support\Console::log($message->from['NickName'] . ' 改名为 ' . $message->rename); - if (isset($message->from['id']) && $message->from['id'] == 1 && $message->rename !== 'vbot 测试群') { + if (group()->getUsernameById(1) == $message->from['UserName'] && $message->rename !== 'vbot 测试群') { group()->setGroupName($message->from['UserName'], 'vbot 测试群'); return '行不改名,坐不改姓!'; } diff --git a/src/Collections/Contact.php b/src/Collections/Contact.php index 6f1f30f2..698a555c 100644 --- a/src/Collections/Contact.php +++ b/src/Collections/Contact.php @@ -26,7 +26,7 @@ class Contact extends Collection */ public static function getInstance() { - if(static::$instance === null){ + if (static::$instance === null) { static::$instance = new Contact(); } @@ -41,8 +41,8 @@ public static function getInstance() */ public function getContactById($id) { - return $this->filter(function($item, $key) use ($id){ - if($item['Alias'] === $id){ + return $this->filter(function ($item, $key) use ($id) { + if ($item['Alias'] === $id) { return true; } })->first(); @@ -56,22 +56,23 @@ public function getContactById($id) */ public function getUsernameById($id) { - return $this->search(function($item, $key) use ($id){ - if($item['Alias'] === $id){ + return $this->search(function ($item, $key) use ($id) { + if ($item['Alias'] === $id) { return true; } }); } + /** * 根据通讯录中的备注获取通讯对象 * * @param $id * @return mixed */ - public function getUsernameByRemarkName( $id) + public function getUsernameByRemarkName($id) { - return $this->search(function($item, $key) use ($id){ - if($item['RemarkName'] === $id){ + return $this->search(function ($item, $key) use ($id) { + if ($item['RemarkName'] === $id) { return true; } }); @@ -81,12 +82,15 @@ public function getUsernameByRemarkName( $id) * 根据通讯录中的昵称获取通讯对象 * * @param $nickname + * @param bool $blur * @return mixed */ - public function getUsernameByNickname($nickname) + public function getUsernameByNickname($nickname, $blur = false) { - return $this->search(function($item, $key) use ($nickname){ - if($item['NickName'] === $nickname){ + return $this->search(function ($item, $key) use ($nickname, $blur) { + if ($blur && str_contains($item['NickName'], $nickname)) { + return true; + } elseif (!$blur && $item['NickName'] === $nickname) { return true; } }); @@ -113,7 +117,7 @@ public function setStick($username, $isStick = true) $result = http()->json($url, [ 'UserName' => $username, 'CmdId' => 3, - 'OP' => (int) $isStick, + 'OP' => (int)$isStick, 'BaseRequest' => server()->baseRequest ], true); diff --git a/src/Collections/ContactFactory.php b/src/Collections/ContactFactory.php index b36aac8c..5eda8799 100644 --- a/src/Collections/ContactFactory.php +++ b/src/Collections/ContactFactory.php @@ -110,9 +110,11 @@ private function initGroupMembers($array) $groupAccount['MemberList'] = $group['MemberList']; $groupAccount['ChatRoomId'] = $group['EncryChatRoomId']; group()->put($group['UserName'], $groupAccount); + $members = []; foreach ($group['MemberList'] as $member) { - member()->put($member['UserName'], $member); + $members[$member['UserName']] = $member; } + member()->put($group['UserName'], $members); } } diff --git a/src/Collections/Group.php b/src/Collections/Group.php index 86324542..1758abca 100644 --- a/src/Collections/Group.php +++ b/src/Collections/Group.php @@ -17,6 +17,13 @@ class Group extends Collection static $instance = null; + /** + * username => id + * + * @var array + */ + public $map = []; + /** * create a single instance * @@ -31,16 +38,6 @@ public static function getInstance() return static::$instance; } - /** - * 重置数据 - * - * @param $array - */ - public function reset($array) - { - static::$instance = new Group($array); - } - /** * 判断是否群组 * @@ -86,6 +83,53 @@ public function getUsernameByNickname($nickname) }); } + /** + * 根据昵称搜索群成员 + * + * @param $groupUsername + * @param $memberNickname + * @param bool $blur + * @return array + */ + public function getMembersByNickname($groupUsername, $memberNickname, $blur = false) + { + $members = $this->get($groupUsername); + + $result = []; + + foreach ($members['MemberList'] as $member) { + if ($blur && str_contains($member['NickName'], $memberNickname)) { + $result[] = $member; + } elseif (!$blur && $member['NickName'] === $memberNickname) { + $result[] = $member; + } + } + + return $result; + } + + /** + * 根据ID获取群username + * + * @param $id + * @return mixed + */ + public function getUsernameById($id) + { + return array_search($id, $this->map); + } + + /** + * 设置map + * + * @param $username + * @param $id + */ + public function setMap($username, $id) + { + $this->map[$username] = $id; + } + /** * 创建群聊天 * diff --git a/src/Collections/Member.php b/src/Collections/Member.php index 48560640..efc0b096 100644 --- a/src/Collections/Member.php +++ b/src/Collections/Member.php @@ -26,11 +26,36 @@ class Member extends Collection */ public static function getInstance() { - if(static::$instance === null){ + if (static::$instance === null) { static::$instance = new Member(); } return static::$instance; } + /** + * 根据昵称获取群成员 + * + * @param $groupUsername + * @param $memberNickname + * @param bool $blur + * @return array' + */ + public function getMembersByNickname($groupUsername, $memberNickname, $blur = false) + { + $members = $this->get($groupUsername); + + $result = []; + + foreach ($members as $username => $member) { + if ($blur && str_contains($member['NickName'], $memberNickname)) { + $result[] = $member; + } elseif (!$blur && $member['NickName'] === $memberNickname) { + $result[] = $member; + } + } + + return $result; + } + } \ No newline at end of file diff --git a/src/Core/MessageHandler.php b/src/Core/MessageHandler.php index ea7226c9..31fed2fe 100644 --- a/src/Core/MessageHandler.php +++ b/src/Core/MessageHandler.php @@ -51,7 +51,7 @@ public function __construct() */ public static function getInstance() { - if(static::$instance === null){ + if (static::$instance === null) { static::$instance = new MessageHandler(); } @@ -66,7 +66,7 @@ public static function getInstance() */ public function setMessageHandler(Closure $closure) { - if(!$closure instanceof Closure){ + if (!$closure instanceof Closure) { throw new \Exception('message handler must be a closure!'); } @@ -81,7 +81,7 @@ public function setMessageHandler(Closure $closure) */ public function setCustomHandler(Closure $closure) { - if(!$closure instanceof Closure){ + if (!$closure instanceof Closure) { throw new \Exception('custom handler must be a closure!'); } @@ -96,7 +96,7 @@ public function setCustomHandler(Closure $closure) */ public function setExitHandler(Closure $closure) { - if(!$closure instanceof Closure){ + if (!$closure instanceof Closure) { throw new \Exception('exit handler must be a closure!'); } @@ -111,7 +111,7 @@ public function setExitHandler(Closure $closure) */ public function setExceptionHandler(Closure $closure) { - if(!$closure instanceof Closure){ + if (!$closure instanceof Closure) { throw new \Exception('exit handler must be a closure!'); } @@ -126,7 +126,7 @@ public function setExceptionHandler(Closure $closure) */ public function setOnceHandler(Closure $closure) { - if(!$closure instanceof Closure){ + if (!$closure instanceof Closure) { throw new \Exception('exit handler must be a closure!'); } @@ -138,29 +138,29 @@ public function setOnceHandler(Closure $closure) */ public function listen() { - if($this->onceHandler instanceof Closure){ + if ($this->onceHandler instanceof Closure) { call_user_func_array($this->onceHandler, []); } - while (true){ - if($this->customHandler instanceof Closure){ + while (true) { + if ($this->customHandler instanceof Closure) { call_user_func_array($this->customHandler, []); } $time = time(); list($retCode, $selector) = $this->sync->checkSync(); - if(in_array($retCode, ['1100', '1101'])){ # 微信客户端上登出或者其他设备登录 + if (in_array($retCode, ['1100', '1101'])) { # 微信客户端上登出或者其他设备登录 Console::log('微信客户端正常退出'); - if($this->exitHandler){ + if ($this->exitHandler) { call_user_func_array($this->exitHandler, []); } break; - }elseif ($retCode == 0){ + } elseif ($retCode == 0) { $this->handlerMessage($selector); - }else{ + } else { Console::log('微信客户端异常退出'); - if($this->exceptionHandler){ + if ($this->exceptionHandler) { call_user_func_array($this->exitHandler, []); } break; @@ -178,33 +178,37 @@ public function listen() */ private function handlerMessage($selector) { - if($selector === 0){ + if ($selector === 0) { return; } $message = $this->sync->sync(); - if(count($message['ModContactList']) > 0){ + if (count($message['ModContactList']) > 0) { foreach ($message['ModContactList'] as $contact) { - group()->put($contact['UserName'], $contact); + if (str_contains($contact['UserName'], '@@')) { + group()->put($contact['UserName'], $contact); + } else { + contact()->put($contact['UserName'], $contact); + } } } - if($message['AddMsgList']){ + if ($message['AddMsgList']) { foreach ($message['AddMsgList'] as $msg) { $content = $this->messageFactory->make($msg); - if($content){ + if ($content) { $this->addToMessageCollection($content); - if($this->handler){ + if ($this->handler) { $reply = call_user_func_array($this->handler, [$content]); - if($reply){ - if($reply instanceof Image){ + if ($reply) { + if ($reply instanceof Image) { Image::sendByMsgId($content->from['UserName'], $reply->msg['MsgId']); - }elseif($reply instanceof Video){ + } elseif ($reply instanceof Video) { Video::sendByMsgId($content->from['UserName'], $reply->msg['MsgId']); - }elseif($reply instanceof Emoticon){ + } elseif ($reply instanceof Emoticon) { Emoticon::sendByMsgId($content->from['UserName'], $reply->msg['MsgId']); - }else{ + } else { Text::send($content->from['UserName'], $reply); } } @@ -221,7 +225,7 @@ private function addToMessageCollection($message) { message()->put($message->msg['MsgId'], $message); - if(server()->config['debug']) { + if (server()->config['debug']) { $file = fopen(System::getPath() . 'message.json', 'a'); fwrite($file, json_encode($message) . PHP_EOL); fclose($file); diff --git a/src/Message/Entity/GroupChange.php b/src/Message/Entity/GroupChange.php index da30b50b..1a5541ae 100644 --- a/src/Message/Entity/GroupChange.php +++ b/src/Message/Entity/GroupChange.php @@ -52,7 +52,7 @@ public function make() if (str_contains($this->msg['Content'], '邀请你')) { $this->action = 'INVITE'; } elseif (str_contains($this->msg['Content'], '加入了群聊')) { - preg_match('/".+".+"(.+)"加入了群聊/', $this->msg['Content'], $match); + preg_match('/.+"(.+)"加入了群聊/', $this->msg['Content'], $match); $this->action = 'ADD'; $this->nickname = $match[1]; Console::debug("检测到 {$this->from['NickName']} 有新成员,正在刷新群成员列表..."); From bf97a9834ed89a3b712b83310cc01ab124727570 Mon Sep 17 00:00:00 2001 From: HanSon Date: Thu, 16 Mar 2017 16:24:40 +0800 Subject: [PATCH 7/8] =?UTF-8?q?member=E6=94=B9=E5=9B=9E=E6=97=A7=E5=BD=A2?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Collections/ContactFactory.php | 4 +--- src/Collections/Member.php | 25 ------------------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/src/Collections/ContactFactory.php b/src/Collections/ContactFactory.php index 5eda8799..b36aac8c 100644 --- a/src/Collections/ContactFactory.php +++ b/src/Collections/ContactFactory.php @@ -110,11 +110,9 @@ private function initGroupMembers($array) $groupAccount['MemberList'] = $group['MemberList']; $groupAccount['ChatRoomId'] = $group['EncryChatRoomId']; group()->put($group['UserName'], $groupAccount); - $members = []; foreach ($group['MemberList'] as $member) { - $members[$member['UserName']] = $member; + member()->put($member['UserName'], $member); } - member()->put($group['UserName'], $members); } } diff --git a/src/Collections/Member.php b/src/Collections/Member.php index efc0b096..26ff7e2b 100644 --- a/src/Collections/Member.php +++ b/src/Collections/Member.php @@ -33,29 +33,4 @@ public static function getInstance() return static::$instance; } - /** - * 根据昵称获取群成员 - * - * @param $groupUsername - * @param $memberNickname - * @param bool $blur - * @return array' - */ - public function getMembersByNickname($groupUsername, $memberNickname, $blur = false) - { - $members = $this->get($groupUsername); - - $result = []; - - foreach ($members as $username => $member) { - if ($blur && str_contains($member['NickName'], $memberNickname)) { - $result[] = $member; - } elseif (!$blur && $member['NickName'] === $memberNickname) { - $result[] = $member; - } - } - - return $result; - } - } \ No newline at end of file From cdd3479ae87e138dac438a9d51b8b3f7bf65fb45 Mon Sep 17 00:00:00 2001 From: HanSon Date: Thu, 16 Mar 2017 16:36:46 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 29c19cc3..11f997f7 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,22 @@ PS:运行后二维码将保存于设置的缓存目录,命名为qr.png,控 **请在terminal运行!请在terminal运行!请在terminal运行!** +## 体验 + + + +扫码后,验证输入“上山打老虎”即可自动加为好友并且拉入vbot群。 + +vbot并非24小时执行,有时会因为开发调试等原因暂停功能。如果碰巧遇到关闭情况,可加Q群 492548647 了解开放时间。执行后发送“拉我”即可自动邀请进群。 + +vbot示例源码为 https://github.com/HanSon/vbot/blob/master/example/index.php + + ## 文档 详细文档在[wiki](https://github.com/HanSon/vbot/wiki)中 -### 例子 - -[所有类型例子](https://github.com/HanSon/vbot/blob/master/example/index.php) +### 小DEMO [红包提醒](https://github.com/HanSon/vbot/blob/master/example/hongbao.php)