Commit cb5f6d4d by zhuanxuhit

修复了无法找到联系人姓名的bug同时直接在控制台输出二维码方便登陆

1 parent 5d6fbba5
...@@ -17,7 +17,9 @@ ...@@ -17,7 +17,9 @@
"illuminate/support": "^5.3", "illuminate/support": "^5.3",
"nesbot/carbon": "^1.21", "nesbot/carbon": "^1.21",
"php": ">=7.0.0", "php": ">=7.0.0",
"symfony/var-dumper": "^3.2" "symfony/var-dumper": "^3.2",
"aferrandini/phpqrcode": "^1.0",
"symfony/process": "^3.2"
}, },
"minimum-stability": "dev", "minimum-stability": "dev",
"autoload": { "autoload": {
......
...@@ -18,9 +18,11 @@ $robot = new Vbot([ ...@@ -18,9 +18,11 @@ $robot = new Vbot([
$flag = false; $flag = false;
$robot->server->setCustomerHandler(function() use (&$flag){ $robot->server->setCustomerHandler(function() use (&$flag){
// RemarkName,代表的改用户在你通讯录的名字
$contact = contact()->getUsernameById('matts8023'); $contact = contact()->getUsernameByNickRemarkName('hanson');
if ($contact === false){
dd("找不到你要的联系人,请确认联系人姓名");
}
if(!$flag){ if(!$flag){
Text::send($contact, '来轰炸吧'); Text::send($contact, '来轰炸吧');
$flag = true; $flag = true;
......
...@@ -62,5 +62,20 @@ class Contact extends Collection ...@@ -62,5 +62,20 @@ class Contact extends Collection
} }
}); });
} }
/**
* 根据通讯录中的名字获取通讯对象
*
* @param $id
* @return mixed
*/
public function getUsernameByNickRemarkName($id)
{
return $this->search(function($item, $key) use ($id){
if($item['RemarkName'] === $id){
return true;
}
});
}
} }
\ No newline at end of file \ No newline at end of file
...@@ -15,7 +15,14 @@ use Hanson\Vbot\Collections\Account; ...@@ -15,7 +15,14 @@ use Hanson\Vbot\Collections\Account;
use Hanson\Vbot\Collections\ContactFactory; use Hanson\Vbot\Collections\ContactFactory;
use Hanson\Vbot\Collections\Group; use Hanson\Vbot\Collections\Group;
use Hanson\Vbot\Support\Console; use Hanson\Vbot\Support\Console;
use PHPQRCode\QRencode;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DomCrawler\Crawler; use Symfony\Component\DomCrawler\Crawler;
use PHPQRCode\QRcode as CQRcode;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\ProcessBuilder;
class Server class Server
{ {
...@@ -96,7 +103,8 @@ class Server ...@@ -96,7 +103,8 @@ class Server
public function prepare() public function prepare()
{ {
$this->getUuid(); $this->getUuid();
$this->generateQrCode(); // $this->generateQrCode();
$this->generateConsoleQrCode();
Console::log('[INFO] 请扫描二维码登录'); Console::log('[INFO] 请扫描二维码登录');
$this->waitForLogin(); $this->waitForLogin();
...@@ -150,6 +158,75 @@ class Server ...@@ -150,6 +158,75 @@ class Server
} }
} }
private function initStyle(OutputInterface $output) {
$style = new OutputFormatterStyle('black', 'black');
$output->getFormatter()->setStyle('blackc', $style);
$style = new OutputFormatterStyle('white', 'white');
$output->getFormatter()->setStyle('whitec', $style);
}
/**
*
*/
public function generateConsoleQrCode()
{
$text = 'https://login.weixin.qq.com/l/' . $this->uuid;
$output = new ConsoleOutput();
$this->initStyle($output);
$map = array(
0 => '<whitec> </whitec>',
1 => '<blackc> </blackc>',
);
$lrPadding = 1;
$tbPadding = 0;
$text = CQRcode::text($text);
$length = strlen($text[0]);
$screenSize = $this->getTTYSize();
if(!$screenSize) {
$output->getErrorOutput()->writeln('<comment>Get Screen Size Failed</comment>');
} else {
list($maxLines, $maxCols) = $screenSize;
$qrCols = 2 * ($length + $lrPadding * 2);
$qrLines = count($text) + $tbPadding * 2;
if($qrCols > $maxCols || $qrLines > $maxLines){
$output->getErrorOutput()->writeln('<error>Max Lines/Columns Reached:请缩小控制台字体大小</error>');
return;
}
}
$paddingLine = str_repeat($map[0], $length + $lrPadding * 2) . "\n";
$after = $before = str_repeat($paddingLine, $tbPadding);
$output->write($before);
foreach ($text as $line) {
$output->write(str_repeat($map[0], $lrPadding));
for ($i = 0; $i < $length; $i++) {
$type = substr($line, $i, 1);
$output->write($map[$type]);
}
$output->writeln(str_repeat($map[0], $lrPadding));
}
$output->write($after);
}
private function getTTYSize() {
if(!posix_isatty(STDOUT)){
return false;
}
$ttyName = posix_ttyname(STDOUT);
$builder = new ProcessBuilder();
$process = $builder->setPrefix('stty')->setArguments(array('-f', $ttyName, 'size'))->getProcess();
try {
$process->mustRun();
} catch (ProcessFailedException $e) {
return false;
}
$output = $process->getOutput();
if(!preg_match('~^(\d+)\s+(\d+)$~', $output, $match)) {
return false;
}
return array($match[1], $match[2]);
}
/** /**
* waiting user to login * waiting user to login
* *
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!