Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

接口很棒,谈一下使用感受。 #17

Open
mlsjla opened this issue Apr 18, 2018 · 7 comments
Open

接口很棒,谈一下使用感受。 #17

mlsjla opened this issue Apr 18, 2018 · 7 comments

Comments

@mlsjla
Copy link

mlsjla commented Apr 18, 2018

代码封装很优雅,很规范,可读性很高。
配合一些缓存机制,可以大大提升性能。
轮询消息的时候不是很合理,有点粗暴,使用的时候好好调整一下。

代码写得很好在于,我基于swoole运行,基本上没报错啥的,稍微改了一下可以运行很顺畅。

接口比较坑的地方在于(这个是qq协议坑)
1、无法获取到用户实际qq号,里面提到的一个接口,我这边实际上已经访问不了了。qq好友来信,uin都是可能会变化的。
2、无法获取用户实际群号,所有群code或者之类都是一个来信号,是会变化的。
3、如果想用来做一个群签到管理, 估计难度大,因为没有一个唯一标识符是不变的,而昵称是容易冲突的。除非用备注,好友备注和群备注,或者群名片,是可以对用户唯一标识符就行区分。

以上问题如果可以解决,希望作者能指点一下。

分享一个自动登录机制的代码,这个可以通过password进行登录。依赖的实际上就是几个chromedriver之类的环境

自动登录会自动打开chrome浏览器,模拟用户输入密码之类。代码参考了java的一个轮子的一个插件。

` /**
* 开启登录流程自行获取凭证
*
* @param string $uin qq号
* @param string $password 密码
*
* @return Credential
*/
public function passwordLogin($uin,$password)
{

    echo '打开浏览器,进行自动登录,需要2到3分钟完成...'.PHP_EOL;
    $host = 'http://127.0.0.1:4444/wd/hub'; // this is the default
    $capabilities = DesiredCapabilities::chrome();
    // $capabilities = DesiredCapabilities::htmlUnitWithJS();

    $driver = RemoteWebDriver::create($host, $capabilities,5000);

    $driver->manage()->deleteAllCookies();
    
    echo '打开qq登录页面,准备输入账号密码进行登录'.PHP_EOL;
    // navigate to 'http://www.baidu.com/'
    $driver->get('http://m.qzone.com');


    // 输入账号密码
    $user = $driver->findElement(WebDriverBy::id('u'));
    $user->clear();  //将输入框清空
    $user->sendKeys($uin);  //在输入框中输入内容
    $userId = $user->getAttribute('value');    //获取输入框的文本内容

    $pass = $driver->findElement(WebDriverBy::id('p'));
    $pass->clear();  //将输入框清空
    $pass->sendKeys($password);  //在输入框中输入内容
    $password =  $pass->getAttribute('value');    //获取输入框的文本内容

    $ele = $driver->findElement(WebDriverBy::id('go'));
    $driver->executeScript("arguments[0].click();",[$ele]);

    echo '完成登录提交任务,等待网页跳转'.PHP_EOL;
    $driver->wait(5)->until(
        WebDriverExpectedCondition::visibilityOfElementLocated(
            WebDriverBy::id('nav_bar_me')
        )
    );

    echo '开始进入web2.qq.com'.PHP_EOL;
    $driver->get('http://web2.qq.com');                    
    
    $driver->wait(5)->until(
        WebDriverExpectedCondition::visibilityOfElementLocated(
            WebDriverBy::id('mainTopAll')
        )
    );
    echo '开始读取配置信息'.PHP_EOL;
    $vfWebQQ = $driver->executeScript('return mq.vfwebqq');
    $ptWebQQ = $driver->executeScript('return mq.ptwebqq');
    $pSessionId = $driver->executeScript('return mq.psessionid');
    $uin = $userId;

    echo '登录信息如下'.PHP_EOL;
    echo ($vfWebQQ).PHP_EOL;
    echo ($pSessionId).PHP_EOL;
    echo ($ptWebQQ).PHP_EOL;

    // close the browser
    
    echo '登录完成,正在关闭浏览器...'.PHP_EOL;
    $cookies = $driver->manage()->getCookies();
    
    $driver->quit();    

    echo '保存用户登录信息'.PHP_EOL;

    $newCookie =  new CookieJar();

    foreach ($cookies as $key => $value) {
        $cookie = current($value);

        $newCookie->setCookie(new SetCookie([
            'Domain'  => $value['domain'],
            'Name'    => $value['name'],
            'Value'   => $value['value'],
            'Expires'   => $value['expiry'],
            'Path'   => $value['path'],
        ]));

    }        

    $this->cookies = $newCookie;

    $this->credential = new Credential($ptWebQQ, $vfWebQQ, $pSessionId, $uin, static::$clientId, $this->cookies);
    //获取在线状态避免103
    $this->getFriendsOnlineStatus();

    return $this->credential;

}`
@slince
Copy link
Owner

slince commented Apr 20, 2018

实际上是打开qq空间,让用户自己填写内容是吗?

@slince
Copy link
Owner

slince commented Apr 20, 2018

至于轮询消息,你也看到了,库里并没有做while true的循环,其实是想让用户自己做循环处理;比如轮询多久sleep一次之类的;

目前的pool message 请求只是帮助发送一次http请求;

@mlsjla
Copy link
Author

mlsjla commented Apr 20, 2018

@slince

账号密码登录这个方法, 实际上是前端测试经常用的,用php来控制浏览器进行登录,然后获取cookie和登录凭证用于系统登录。

先登录http://m.qzone.com, 可以通过qq号和密码登录
然后再范文w.qq.com 发现自动登录了。

我是参考了这个
https://github.com/pandolia/qqbot/blob/master/qqbot/plugins/passwordlogin.py

来开发的,有python版本,facebook开源了php的chromedriver,所以我就参考写了下,测试了运行正常。

@mlsjla
Copy link
Author

mlsjla commented Apr 20, 2018

可以简单理解。 就是php通过chromedriver驱动,来控制浏览器
第一步:
打开chrome浏览器
第二步:
然后控制浏览器访问http://m.qzone.com
第三步:
然后控制模拟浏览器键盘鼠标输入qq账号和密码。
第四步:
然后控制浏览器访问w.qq.com 发现这时候qq已经登录了。
第五步:
然后获取cookie和其他登录凭证
$vfWebQQ
$pSessionId
$ptWebQQ

有了上面的东西,就可以直接用于程序本身进行登录了。

@slince
Copy link
Owner

slince commented Apr 21, 2018

ok, 后面我试试

@2488583886
Copy link

作者在吗,我这个会断掉!

@slince
Copy link
Owner

slince commented Jul 23, 2018

@2488583886 ?? 什么意思

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants