Initial commit

This commit is contained in:
net909
2023-09-28 16:21:06 +08:00
parent 498772eb04
commit ba7be004c0
640 changed files with 87745 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
<?php
/**
* 单向好友检测
*/
namespace plugin\wqq\friend_check;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qzone');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
$skey = getSubstr($logininfo['cookie'], 'skey=', ';');
$pskey = getSubstr($logininfo['cookie'], 'p_skey=', ';');
View::assign('skey', $skey);
View::assign('pskey', $pskey);
$list = [];
try{
$qqtool = new \app\lib\QQTool($logininfo['uin'], $logininfo['cookie']);
$res = $qqtool->friendlist();
$list = $res["list"];
}catch(Exception $e){
$error = $e->getMessage();
}
View::assign('list', $list);
}else{
View::assign('isqqlogin', 0);
}
View::assign('error', $error);
return $this->view();
}
}
+304
View File
@@ -0,0 +1,304 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
.card + .card {
margin-top: 14px;
}
label {
margin-bottom: 0;
font-weight: 700;
}
.table td {vertical-align: middle;}
td>input {margin-right: 5px;}
.btn-group>.btn {display: block;}
tbody tr>td:nth-child(3){min-width:100px;text-align:center;}
tbody tr>td:nth-child(4){min-width:100px;text-align:center;}
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">QQ单向好友检测</span>
</div>
<div class="alert alert-info"><em class="icon ni ni-info"></em> 单向检测,不一定完全正确!只做参考。如果检测出现失败,则点击下失败的QQ,即可重新检测!</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qzone&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qzone&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{/if}
{if $error}
<div class="alert alert-danger">{$error}</div>
{/if}
</div>
</div>
{if $isqqlogin && !$error}
<div class="card card-bordered checkbtn">
<div class="card-inner text-center">
<p id="load"></p>
<p><button class="btn btn-large btn-success btn-block" id="startcheck2">点此开始单项检测</button></p>
<div class="btn-group w-100">
<button type="button" class="btn btn-outline-light"><label>全选<input type="checkbox" onclick="SelectAll(this)" /></label></button>
<button type="button" class="btn btn-outline-light" id="selectdelete">删除选择好友</button>
<button type="button" class="btn btn-outline-light" id="startdelete">删除所有单向好友</button>
</div>
</div>
</div>
<div class="card card-bordered">
<div class="table-responsive">
<table class="table table-bordered table-sm">
<tbody>
<tr>
<td align="center"><span style="color:silver;"><b>QQ</b></span></td>
<td align="center"><span style="color:silver;"><b>昵称</b></span></td>
<td align="center"><span style="color:silver;"><b>结果</b></span></td>
<td align="center"><span style="color:silver;"><b>删除</b></span></td>
</tr>
<tr><td colspan="4" align="center">总共<span id="hyall">{:count($list)}<span>个好友,其中<span id="hydx">0</span>个单项,已删除<span id="hydel">0</span>个!<a href="javascript:outputmem()">导出全部</a></td></tr>
{foreach $list as $row}<tr><td uin="{$row.uin}"><input name="uins" type="checkbox" id="uins" class="uins" value="{$row.uin}"><a href="tencent://message/?uin={$row.uin}&amp;Site=授权平台&amp;Menu=yes">{$row.uin}</a></td><td>{$row.remark}</td><td id="to{$row.uin}" uin="{$row.uin}" class="nocheck recheck"><span class="btn btn-primary btn-sm">检测</span></td><td uin="{$row.uin}" class="qqdel"><span class="btn btn-danger btn-sm">删除</span></td></tr>{/foreach}
</tbody>
</table>
</div>
</div>
{/if}
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdn_cdnjs}FileSaver.js/2.0.5/FileSaver.min.js"></script>
{if $isqqlogin}
<script>
const uin = '{$logininfo.uin}';
const skey = '{$skey}';
const pskey = '{$pskey}';
function SelectAll(chkAll) {
var items = $('.uins');
for (i = 0; i < items.length; i++) {
if (items[i].id.indexOf("uins") != -1) {
if (items[i].type == "checkbox") {
items[i].checked = chkAll.checked;
}
}
}
}
var qqcount=0;
function checkdx(touin,flag){
touins=touin.split(",");
$('#load').html('正在检测中,当前已完成检测'+qqcount+'个QQ');
$.each(touins, function(i, item){
$("#to"+item).html("<img src='/static/images/load.gif' height=25>");
});
var url="/tool/qq/dx.php";
xiha.postData(url,'uin='+uin+'&skey='+encodeURIComponent(skey)+'&pskey='+encodeURIComponent(pskey)+'&touin='+touin, function(d) {
if(d.code==0){
$.each(d.data, function(i, item){
if(item.is==0){
var num = $('#hydx').text();
num=parseInt(num);
num++;
$("#to"+item.touin).html('<span class="btn btn-default btn-sm"><font color="red">单向</font></span>');
$('.uins[value='+item.touin+']').attr('checked',true);
$(".qqdel[uin="+item.touin+"]").addClass('isdx');
$('#hydx').text(num);
$("#to"+item.touin).removeClass('nocheck');
}else if(item.is==1){
$("#to"+item.touin).html('<span class="btn btn-default btn-sm"><font color="green">正常</font></span>');
$("#to"+item.touin).removeClass('nocheck');
}else{
$("#to"+item.touin).html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
}
qqcount++;
});
}else if(d.code==-1){
$('#load').html('<font color="red">SKEY已过期,请更新SKEY</font>');
alert('SKEY已过期,请更新SKEY');
return false;
}else{
$('#load').html('<font color="red">失败,请重试!</font>');
}
if(flag!=1){
if($(".nocheck").length>0){
touin = '';num=0;
$(".nocheck").each(function(){
if($(this).attr('uin').substr(0,3)!='800'){
touin+=','+$(this).attr('uin');
num++;
}
if(num>4)return false;
});
setTimeout(function () {
checkdx(touin);
}, 100);
}else{
$('#load').html('检测完成');
return false;
}
}
});
}
$(document).ready(function() {
$('#startcheck2').click(function(){
var self=$(this);
var num=0;
if($(".nocheck").length>0){
var touin = '';
$(".nocheck").each(function(){
if($(this).attr('uin').substr(0,3)!='800'){
touin+=','+$(this).attr('uin');
num++;
}
if(num>4)return false;
});
checkdx(touin);
}else{
$('#load').html('没有待检测的');
return false;
}
});
$('#startcheck').click(function(){
var self=$(this);
var touin,num=0;
$(".nocheck").each(function(){
var checkself=$(this),
touin=checkself.attr('uin');
checkdx(touin,1);
num++;
if(num>6)return false;
});
if(num<1) $('#load').html('没有待检测的');
else
setTimeout(function () {
$('#startcheck').click()
}, 800);
});
$('#startdelete').click(function(){
$('#load').html('删除中');
var self=$(this);
if (self.attr("data-lock") === "true") return;
else self.attr("data-lock", "true");
var touin,num=0;
$(".isdx").each(function(){
var checkself=$(this),
touin=checkself.attr('uin');
checkself.html("<img src='/static/images/load.gif' height=25>")
var url="/tool/qq/del.php";
xiha.postData(url,'uin='+uin+'&skey='+encodeURIComponent(skey)+'&pskey='+encodeURIComponent(pskey)+'&touin='+touin, function(d) {
if(d.code==0){
num = $('#hydel').text();
num=parseInt(num);
num++;
checkself.html('<span class="btn btn-default btn-sm"><font color="green">成功</font></span>');
$('#hydel').text(num);
$('#load').html('QQ'+touin+'删除单向好友完成');
$('.uins[value='+touin+']').attr('checked',false);
checkself.removeClass('isdx');
}else if(d.code==-1){
checkself.html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
alert('SKEY已过期,请更新SKEY');
return false;
}else{
checkself.html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
}
});
});
if(num<1) $('#load').html('没有待删除的');
self.attr("data-lock", "false");
});
$('#selectdelete').click(function(){
$('#load').html('删除中');
var self=$(this);
if (self.attr("data-lock") === "true") return;
else self.attr("data-lock", "true");
var touin,num=0;
$("input[name=uins]:checked").each(function(){
var touin=$(this).val();
var checkself=$(".qqdel[uin="+touin+"]");
checkself.html("<img src='/static/images/load.gif' height=25>")
var url="/tool/qq/del.php";
xiha.postData(url,'uin='+uin+'&skey='+encodeURIComponent(skey)+'&pskey='+encodeURIComponent(pskey)+'&touin='+touin, function(d) {
if(d.code==0){
num = $('#hydel').text();
num=parseInt(num);
num++;
checkself.html('<span class="btn btn-default btn-sm"><font color="green">成功</font></span>');
$('#hydel').text(num);
$('#load').html('QQ'+touin+'删除单向好友完成');
$('.uins[value='+touin+']').attr('checked',false);
checkself.removeClass('isdx');
}else if(d.code==-1){
checkself.html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
alert('SKEY已过期,请更新SKEY');
return false;
}else{
checkself.html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
}
});
});
if(num<1) $('#load').html('没有待删除的');
self.attr("data-lock", "false");
});
$('.recheck').click(function(){
var self=$(this),
touin=self.attr('uin');
checkdx(touin,1);
});
$('.qqdel').click(function(){
var self=$(this),
touin=self.attr('uin');
var checkself=$(this);
checkself.html("<img src='/static/images/load.gif' height=25>")
var url="/tool/qq/del.php";
xiha.postData(url,'uin='+uin+'&skey='+encodeURIComponent(skey)+'&pskey='+encodeURIComponent(pskey)+'&touin='+touin, function(d) {
if(d.code==0){
num = $('#hydel').text();
num=parseInt(num);
num++;
checkself.html('<span class="btn btn-default btn-sm"><font color="green">成功</font></span>');
$('#hydel').text(num);
checkself.removeClass('isdx');
}else if(d.code==-1){
checkself.html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
alert('SKEY已过期,请更新SKEY');
return false;
}else{
checkself.html('<span class="btn btn-default btn-sm"><font color="red">失败</font></span>');
}
});
});
});
var xiha={
postData: function(url, parameter, callback, dataType, ajaxType) {
if(!dataType) dataType='json';
$.ajax({
type: "POST",
url: url,
async: true,
dataType: dataType,
json: "callback",
data: parameter,
success: function(data,status) {
if (callback == null) {
return;
}
callback(data);
},
error: function(error) {
//alert('创建连接失败');
}
});
}
}
function outputmem() {
var txt = "";
$(".uins").each(function(){
txt += $(this).val() + "\r\n";
});
var fileName = "qqfriend_"+uin+".txt";
var blob = new Blob([txt], {type: "text/plain;charset=utf-8"});
saveAs(blob, fileName);
}
</script>
{/if}
{/block}
+86
View File
@@ -0,0 +1,86 @@
<?php
/**
* 批量删除群公告
*/
namespace plugin\wqq\group_announce;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qun');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
$group = [];
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$group = $qqgroup->grouplist(true);
}catch(Exception $e){
$error = $e->getMessage();
}
View::assign('group', $group);
}else{
View::assign('isqqlogin', 0);
}
View::assign('groupid', input('get.groupid'));
View::assign('error', $error);
return $this->view();
}
public function list(){
$groupid = input('get.groupid', null, 'trim');
if(!$groupid) return msg('error','no groupid');
$start=input('?get.start')?input('get.start/d'):-1;
$logininfo = session('qq_cookie_qun');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$list = $qqgroup->announcelist($groupid, $start);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
$data = array();
$data['code'] = 0;
$data['count'] = count($list);
$data['data'] = $list;
$data['next'] = count($list)>=10;
return msg('ok','success',$data);
}
public function del(){
$groupid = input('get.groupid', null, 'trim');
if(!$groupid) return msg('error','no groupid');
$fid = input('get.fid', null, 'trim');
if(!$fid) return msg('error','no fid');
$logininfo = session('qq_cookie_qun');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$qqgroup->delannounce($groupid, $fid);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg();
}
}
+143
View File
@@ -0,0 +1,143 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
label {
margin-bottom: 5px;
font-weight: 700;
}
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">批量删除群公告</span>
</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qun&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qun&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{if $error}
<div class="alert alert-danger">{$error}</div>
{/if}
<div class="form-group">
<div class="input-group"><div class="input-group-prepend"><span class="input-group-text">QQ群列表</span></div>
<select name="groupid" class="form-control">
{foreach $group as $row}
<option value="{$row.gc}" {if $groupid==$row.gc}selected="selected"{/if}>{$row.gc}_{$row.gn|raw}</option>
{/foreach}
</select>
</div></div>
<div class="form-group">
<button type="button" class="btn btn-dim btn-outline-primary btn-block card-link mb-3" onclick="showlist()">获取群公告列表(最多100条)</button>
</div>
{/if}
</div>
</div>
<div class="card card-preview" style="display:none;" id="announcelist">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">群公告列表</span>
</div>
<table class="table table-bordered">
<tbody id="datalist">
</tbody>
</table>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script>
const max_num = 100; //最多加载公告数量
function showlist(){
var groupid = $("select[name='groupid']").val();
if(groupid == ''){
layer.alert('请选择一个QQ群');
return false;
}
$("#datalist").empty();
$("#datalist").html('<tr><td colspan="4"><label><input type="checkbox" onclick="SelectAll(this)">&nbsp;全选</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="btn btn-outline-light btn-sm" onclick="announceDel()" style="color:red">删除选中公告</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;共加载<span id="announce_count">0</span>条公告,已删除<span id="del_count">0</span>条</div></td></tr><tr><td></td><td><span style="color:silver;"><b>发布人</b></span></td><td><span style="color:silver;"><b>公告内容</b></span></td><td><span style="color:silver;"><b>发布时间</b></span></td></tr>');
announcelist(groupid)
}
function announcelist(groupid,start){
start = start || -1;
var announce_count = parseInt($("#announce_count").html());
if(start<-1){
var ii = layer.msg('正在加载群公告('+(-start-1)+')', {icon: 16,shade: 0.01,time: 15000});
}else{
var ii = layer.msg('正在加载群公告', {icon: 16,shade: 0.01,time: 15000});
}
$.ajax({
type : 'GET',
url : '/api/{$plugin.alias}/list?groupid='+groupid+'&start='+start,
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.status == 'ok'){
var data = data.data;
$("#announcelist").show();
announce_count += data.count;
$("#announce_count").html(announce_count);
$.each(data.data, function(i, item){
$("#datalist").append('<tr id="fid'+item.fid+'"><td><input name="fids" type="checkbox" id="fids" class="fids" value="'+item.fid+'"></td><td uin="'+item.uin+'" class="uins"><a href="tencent://message/?uin='+item.uin+'&amp;Site=&amp;Menu=yes" title="'+item.uin+'">'+item.nick+'</a></td><td>'+item.msg+'</td><td>'+item.time+'</td></tr>');
});
if(data.next && announce_count<max_num){
start = start-10;
announcelist(groupid,start)
}
}else{
layer.alert(data.message, {icon:2});
}
},
error:function(data){
layer.msg('服务器错误');
return false;
}
});
}
function SelectAll(chkAll) {
var items = $('.fids');
for (i = 0; i < items.length; i++) {
if (items[i].id.indexOf("fids") != -1) {
if (items[i].type == "checkbox") {
items[i].checked = chkAll.checked;
}
}
}
}
function announceDel(){
var groupid = $("select[name='groupid']").val();
$("input[name=fids]:checked:first").each(function(){
var checkself=$(this);
var fid=checkself.val();
checkself.parent().html("<img src='/static/images/load.gif' height=20>");
$.ajax({
type : 'GET',
url : '/api/{$plugin.alias}/del?groupid='+groupid+'&fid='+fid,
dataType : 'json',
success : function(data) {
if(data.status == 'ok'){
var del_count = parseInt($("#del_count").html());
del_count++;
$("#del_count").html(del_count);
$('#fid'+fid).remove();
announceDel();
}else{
checkself.parent().html('<input name="fids" type="checkbox" id="fids" class="fids" value="'+item.fid+'">');
alert(data.message);
}
},
error:function(data){
layer.msg('服务器错误');
return false;
}
});
return true;
});
}
</script>
{/block}
+52
View File
@@ -0,0 +1,52 @@
<?php
/**
* 自助解散QQ群
*/
namespace plugin\wqq\group_dismiss;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qqid');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
}else{
View::assign('isqqlogin', 0);
}
View::assign('groupid', input('get.groupid'));
View::assign('error', $error);
return $this->view();
}
public function dismiss(){
$groupid = input('get.groupid', null, 'trim');
if(!$groupid) return msg('error','no groupid');
if(!is_numeric($groupid)){
return msg('error','群号不正确');
}
$logininfo = session('qq_cookie_qqid');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$qqgroup->dismissgroup($groupid);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg();
}
}
+55
View File
@@ -0,0 +1,55 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">自助解散QQ群</span>
</div>
<div class="alert alert-info"><em class="icon ni ni-info"></em> 支持解散被封的群。</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qqid&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qqid&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{/if}
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">QQ群号</span></div>
<input type="text" class="form-control" name="groupid" value="" placeholder="请输入群号" required>
</div>
</div>
<div class="form-group">
<button type="button" class="btn btn-dim btn-outline-primary btn-block btn-lg card-link" onclick="dismiss()">立即解散</button>
</div>
<div id="result" style="display:none;"></div>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script>
function dismiss(){
var groupid = $("input[name='groupid']").val();
if(groupid == ''){
layer.alert('请输入群号');
return false;
}
$("#result").hide();
httpGet('/api/{$plugin.alias}/dismiss?groupid='+groupid, function(data){
if(data.status == 'ok'){
$("#result").html('<div class="alert alert-success"><em class="ni ni-check-circle-fill"></em> 解散群 '+groupid+' 成功!</div>');
$("#result").slideDown();
}
else{
$("#result").html('<div class="alert alert-warning"><em class="ni ni-cross-circle-fill"></em> '+data.message+'</div>');
$("#result").slideDown();
}
}, true);
}
</script>
{/block}
+52
View File
@@ -0,0 +1,52 @@
<?php
/**
* 生成加群链接
*/
namespace plugin\wqq\group_join;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qun');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
}else{
View::assign('isqqlogin', 0);
}
View::assign('groupid', input('get.groupid'));
View::assign('error', $error);
return $this->view();
}
public function getlink(){
$groupid = input('get.groupid', null, 'trim');
if(!$groupid) return msg('error','no groupid');
if(!is_numeric($groupid)){
return msg('error','群号不正确');
}
$logininfo = session('qq_cookie_qun');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$joinlink = $qqgroup->getjoinlink($groupid);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg('ok', 'success', $joinlink);
}
}
+74
View File
@@ -0,0 +1,74 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">获取加群链接</span>
</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qun&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qun&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{/if}
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">QQ群号</span></div>
<input type="text" class="form-control" name="groupid" value="" placeholder="请输入群号" required>
</div>
</div>
<div class="form-group">
<button type="button" class="btn btn-dim btn-outline-primary btn-block btn-lg card-link mb-3" onclick="getlink()">立即生成</button>
</div>
<div id="result" style="display:none;">
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">加群链接</span></div>
<input type="text" class="form-control" name="link" value="" readOnly="readOnly">
<div class="input-group-append"><button type="button" class="btn btn-outline-light btn-lg" onclick="copylink()" title="复制"><em class="icon ni ni-copy"></em></button><button type="button" class="btn btn-outline-light btn-lg" onclick="jumplink()" title="跳转"><em class="icon ni ni-send"></em></button></div>
</div>
</div>
</div>
</div>
</div>
<div class="card card-preview">
<div class="card-inner">
<h6><em class="icon ni ni-info"></em> 工具说明</h6>
<div class="accordion-inner">
<p>只要知道群号就能生成任意群的加群链接。不允许被搜索的群通过此工具也可直接申请加群。</p>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script>
function getlink(){
var groupid = $("input[name='groupid']").val();
if(groupid == ''){
layer.alert('请输入群号');
return false;
}
httpGet('/api/{$plugin.alias}/getlink?groupid='+groupid, function(data){
$("input[name='link']").val(data);
$("#result").show();
});
}
function copylink(){
var link = $("input[name='link']").val();
if(link == '') return;
copy(link);
layer.msg('复制成功', {icon:1, time:600})
}
function jumplink(){
var link = $("input[name='link']").val();
if(link == '') return;
window.open(link)
}
</script>
{/block}
+59
View File
@@ -0,0 +1,59 @@
<?php
/**
* 提取QQ群成员
*/
namespace plugin\wqq\group_members;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qun');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
$group = [];
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$group = $qqgroup->grouplist();
}catch(Exception $e){
$error = $e->getMessage();
}
View::assign('group', $group);
}else{
View::assign('isqqlogin', 0);
}
View::assign('groupid', input('get.groupid'));
View::assign('error', $error);
return $this->view();
}
public function list(){
$groupid = input('get.groupid', null, 'trim');
if(!$groupid) return msg('error','no groupid');
$start=input('?get.start')?input('get.start'):0;
$end=$start+40;
$logininfo = session('qq_cookie_qun');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqgroup = new \app\lib\QQGroup($logininfo['uin'], $logininfo['cookie']);
$data = $qqgroup->groupmemberlist($groupid, $start, $end);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg('ok','success',$data);
}
}
+107
View File
@@ -0,0 +1,107 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">提取QQ群成员</span>
</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qun&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qun&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{if $error}
<div class="alert alert-danger">{$error}</div>
{/if}
<div class="form-group">
<div class="input-group"><div class="input-group-prepend"><span class="input-group-text">QQ群列表</span></div>
<select name="groupid" class="form-control">
{foreach $group as $row}
<option value="{$row.gc}" {if $groupid==$row.gc}selected="selected"{/if}>{$row.gc}_{$row.gn|raw}</option>
{/foreach}
</select>
</div></div>
<div class="form-group">
<button type="button" class="btn btn-dim btn-outline-primary btn-block card-link mb-3" onclick="showlist()">提取群成员</button>
</div>
{/if}
</div>
</div>
<div class="card card-preview" style="display:none;" id="memslist">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">群成员列表(<span id="mem_count"></span></span>
</div>
<table class="table table-bordered">
<tbody id="datalist">
</tbody>
</table>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdn_cdnjs}FileSaver.js/2.0.5/FileSaver.min.js"></script>
<script>
function showlist(){
var groupid = $("select[name='groupid']").val();
if(groupid == ''){
layer.alert('请选择一个QQ群');
return false;
}
$("#datalist").empty();
$("#datalist").html('<tr><td><span style="color:silver;"><b>QQ</b></span></td><td><span style="color:silver;"><b>昵称</b></span></td></tr><tr><td colspan="2" align="center"><a href="javascript:outputmem()" pjax="no">导出群成员列表为TXT</a></td></tr>');
$("#mem_count").html('0');
memslist(groupid)
}
function memslist(groupid,start){
start = start || 0;
if(start>0){
var mem_count = parseInt($("#mem_count").html());
var ii = layer.msg('正在加载群成员('+(start-1)+'/'+mem_count+')', {icon: 16,shade: 0.01,time: 15000});
}else{
var ii = layer.msg('正在加载群成员', {icon: 16,shade: 0.01,time: 15000});
}
$.ajax({
type : 'GET',
url : '/api/{$plugin.alias}/list?groupid='+groupid+'&start='+start,
dataType : 'json',
success : function(data) {
layer.close(ii);
if(data.status == 'ok'){
var data = data.data;
$("#memslist").show();
$("#mem_count").html(data.count);
$.each(data.mems, function(i, item){
$("#datalist").append('<tr><td uin="'+item.uin+'" class="uins"><a href="tencent://message/?uin='+item.uin+'&amp;Site=&amp;Menu=yes">'+item.uin+'</a></td><td>'+item.nick+'</td></tr>');
});
if(data.start > 0){
memslist(groupid,data.start)
}
}else{
layer.alert(data.message, {icon:2});
}
},
error:function(data){
layer.msg('服务器错误');
return false;
}
});
}
function outputmem() {
var groupid = $("select[name='groupid']").val();
var txt = "";
$(".uins").each(function(){
txt += $(this).attr('uin') + "\r\n";
});
var fileName = "group_member_"+groupid+".txt";
var blob = new Blob([txt], {type: "text/plain;charset=utf-8"});
saveAs(blob, fileName);
}
</script>
{/block}
+52
View File
@@ -0,0 +1,52 @@
<?php
/**
* 自定义在线机型
*/
namespace plugin\wqq\online_device;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qzone');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
}else{
View::assign('isqqlogin', 0);
}
View::assign('groupid', input('get.groupid'));
View::assign('error', $error);
return $this->view();
}
public function change(){
$model = input('post.model', null, 'trim');
if(!$model) return msg('error','自定义机型不能为空');
$desc = input('post.desc', null, 'trim');
$imei = input('post.imei', null, 'trim');
if(!$imei) return msg('error','IMEI不能为空');
$logininfo = session('qq_cookie_qzone');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqtool = new \app\lib\QQTool($logininfo['uin'], $logininfo['cookie'], true);
$qqtool->set_online_status($model, $desc, $imei);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg();
}
}
+128
View File
@@ -0,0 +1,128 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">QQ自定义在线机型</span>
</div>
<div class="alert alert-info"><em class="icon ni ni-info"></em> 此工具可自定义QQ在线状态设备名,需要SVIP</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qzone&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qzone&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{/if}
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">自定义机型</span></div>
<input type="text" class="form-control" name="model" placeholder="请输入自定义机型" v-model="model" required>
</div>
</div>
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">自定义前缀</span></div>
<input type="text" class="form-control" name="desc" value="" placeholder="自定义前缀可留空" v-model="desc">
</div>
</div>
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">手机IMEI</span></div>
<input type="text" class="form-control" name="imei" value="" placeholder="点击下方按钮查看获取IMEI教程" v-model="imei">
</div>
</div>
<p>在线状态预览:<span class="text-primary">{{desc}}{{model}}在线</span></p>
<div class="form-group">
<button type="button" class="btn btn-outline-light btn-block btn-lg" data-toggle="modal" data-target="#help">获取IMEI教程</button>
<button type="button" class="btn btn-dim btn-outline-primary btn-block btn-lg" @click="change()">立即修改</button>
</div>
<div v-html="result" v-show="showresult"></div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="help" tabindex="-1" aria-labelledby="helpLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="helpLabel">获取IMEI教程</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>手机QQ打开链接:<a href="https://1105583577.urlshare.cn" target="_blank">https://1105583577.urlshare.cn</a> <button type="button" class="btn btn-outline-light btn-xs copy-btn" data-clipboard-text="https://1105583577.urlshare.cn">点击复制</button></p>
<p>点击“设备信息”</p>
<p>【安卓】找到最后的msflmei参数后面的那一串字母数字。如果没有msflmei参数,则用 identifiera参数</p>
<p>【苹果】找到msf_identifier参数后面的那一串字母数字(格式:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)</p>
<img style="width: 100%;" src="https://img.alicdn.com/imgextra/i3/905090405/O1CN01sypnNc1ErX9vUQpeQ_!!905090405.jpg">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdn_cdnjs}vue/2.6.14/vue.min.js"></script>
<script src="{$cdn_cdnjs}clipboard.js/1.7.1/clipboard.min.js"></script>
<script src="{$cdn_cdnjs}jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script>
new Vue({
el: '#app',
data: {
model: 'iPhone 13 Pro Max',
desc: '',
imei: '',
showresult: false,
result: '',
},
mounted() {
var clipboard = new Clipboard('.copy-btn', {
container: document.getElementById('help')
});
clipboard.on('success', function (e) {
layer.msg('复制成功', {icon:1, time:600})
});
clipboard.on('error', function (e) {
layer.msg('复制失败,请长按链接后手动复制');
});
if($.cookie('device_imei')){
this.imei = $.cookie('device_imei');
}
},
methods: {
change() {
if(this.model == ''){
layer.alert('请输入自定义机型');
return false;
}
if(this.imei == ''){
layer.alert('请输入手机IMEI');
return false;
}
var that = this;
httpPost('/api/{$plugin.alias}/change', {
model: this.model,
desc: this.desc,
imei: this.imei
}, function(data){
if(data.status == 'ok'){
$.cookie('device_imei', that.imei);
that.result = '<div class="alert alert-success"><em class="ni ni-check-circle-fill"></em> 修改在线状态成功!</div>';
that.showresult = true;
}
else{
that.result = '<div class="alert alert-warning"><em class="ni ni-cross-circle-fill"></em> '+data.message+'</div>';
that.showresult = true;
}
}, true);
}
},
})
</script>
{/block}
+18
View File
@@ -0,0 +1,18 @@
<?php
/**
* QQ强制聊天
*/
namespace plugin\wqq\qqchat;
use app\Plugin;
class App extends Plugin
{
public function index()
{
return $this->view();
}
}
+86
View File
@@ -0,0 +1,86 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">QQ强制聊天</span>
</div>
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">QQ号码</span></div>
<input type="text" class="form-control" name="uin" value="" placeholder="" required v-model="uin" ref="input">
</div>
</div>
<div class="row pt-1 pb-1">
<div class="col-12 col-md-4">
<button class="btn btn-dim btn-outline-primary btn-block btn-lg card-link" @click="jump('chat')">
跳转聊天界面
</button>
</div>
<div class="col-12 col-md-4">
<button class="btn btn-dim btn-outline-primary btn-block btn-lg card-link" @click="jump('add')">
跳转加好友界面
</button>
</div>
<div class="col-12 col-md-4">
<button class="btn btn-dim btn-outline-primary btn-block btn-lg card-link" @click="jump('wpa')">
WPA临时会话
</button>
</div>
</div>
</div>
</div>
<div class="card card-preview">
<div class="card-inner">
<h6><em class="icon ni ni-info"></em> 工具说明</h6>
<div class="accordion-inner">
<p>跳转聊天界面:一般只支持已开启临时会话的QQ</p>
<p>跳转加好友界面:可解决QQ设置不允许被搜索后无法加好友的问题</p>
<p>WPA临时会话:从网页跳转聊天界面,与第一个按钮功能差不多</p>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdn_cdnjs}vue/2.6.14/vue.min.js"></script>
<script>
var isMobile = function (){
var ua = navigator.userAgent;
var ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
isIphone =!ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/),
isAndroid = ua.match(/(Android)\s+([\d.]+)/);
return isIphone || isAndroid;
}
new Vue({
el: '#app',
data: {
uin: '',
},
mounted() {
this.$refs.input.focus();
},
methods: {
jump(type) {
var uin = this.uin.trim();
if(uin == '') return;
if(isNaN(uin)) return;
if(type == 'chat'){
var url = isMobile() ? 'mqqwpa://im/chat?chat_type=wpa&version=1&src_type=web&web_src=oicqzone.com&uin='+uin : 'tencent://message/?uin='+uin+'&Site=qq&Menu=yes';
window.location.href=url;
}else if(type == 'add'){
var url = isMobile() ? 'mqq://card/show_pslcard?src_type=internal&version=1&uin='+uin+'&card_type=person&source=sharecard' : 'tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin='+uin+'&website=qq';
window.location.href=url;
}else if(type == 'wpa'){
var url = 'https://wpa.qq.com/msgrd?v=3&site=qq&menu=yes&uin='+uin;
window.open(url);
}
}
},
})
</script>
{/block}
+94
View File
@@ -0,0 +1,94 @@
<?php
/**
* QQ等级查询
*/
namespace plugin\wqq\qqlevel;
use app\Plugin;
use Exception;
class App extends Plugin
{
public function index()
{
return $this->view();
}
public function query(){
$uin = input('post.uin', null, 'trim');
if(!$uin) return msg('error','no uin');
if(!is_numeric($uin) || strlen($uin)>11){
return msg('error', 'QQ号码格式不正确!');
}
$captcha_result = verify_captcha4();
if($captcha_result !== true){
return msg('error', '验证失败,请重新验证');
}
try{
$result = $this->queryapi($uin);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
$msg['QQ号码'] = $uin;
$msg['QQ昵称'] = $result['sNickName'];
$msg['QQ等级'] = $result['iQQLevel'].'级';
$msg['等级图标'] = $this->Level($result['iQQLevel']);
$msg['注册时长'] = $result['iTotalActiveDay'].'天';
$msg['下次升级天数'] = $result['iNextLevelDay'].'天';
$msg['今日成长天数'] = $result['iRealDays'].'天';
$Time = @round((($result['iNoHideOnlineTime'] + $result['iPCQQOnlineTime']) / 60 / 60) , 2);
$msg['今日在线时长'] = $Time.'小时';
return msg('ok','success',$msg);
}
private function queryapi($uin){
//此处需填写QQAPI的接口地址(https://github.com/netcccyun/qqapi
$url = 'http://qqapiurl/api.php?act=getqqlevel';
$post = 'key=查询密钥&uin='.$uin;
$data = get_curl($url, $post);
$arr = json_decode($data, true);
if(isset($arr['code']) && $arr['code']==0){
return $arr['data'];
}elseif(isset($arr['msg'])){
throw new Exception($arr['msg']);
}else{
throw new Exception('接口请求失败');
}
}
private function Level($Level){
if($Level == 0){
return '☆';
}
$String = '';
$h = Intval($Level / 64);
$Level_h = Intval($Level - ($h * 64));
$t = Intval($Level_h / 16);
$Level_t = Intval($Level_h - ($t * 16));
$y = Intval($Level_t / 4);
$Level_y = Intval($Level_t - ($y * 4));
$x = Intval($Level_y);
$Level_t = Intval($Level_h - $x);
for($i = 0 ; $i < $h ; $i++){
$String .= '👑';
}
for($i = 0 ; $i < $t ; $i++){
$String .= '☀️';
}
for($i = 0 ; $i < $y ; $i++){
$String .= '🌙';
}
for($i = 0 ; $i < $x ; $i++){
$String .= '⭐';
}
return $String;
}
}
+117
View File
@@ -0,0 +1,117 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
td{text-align: center;}
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">QQ等级查询</span>
</div>
<div class="form-group">
<label class="form-label">QQ号码:</label>
<div class="form-control-wrap">
<input type="text" v-model="input" placeholder="请输入QQ号码" class="form-control form-control-lg" @keyup.enter="query" ref="input" autocomplete="off">
</div>
</div>
<button class="btn btn-dim btn-outline-primary btn-block card-link mb-3" @click="query" :disabled="query_disabled">
查询
</button>
</div>
</div>
<div class="card card-preview" v-show="showresult" style="display:none">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">查询结果</span>
</div>
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="table-responsive">
<table class="table table-hover table-bordered">
<tbody>
<tr v-for="(item,index) in result_info"><td class="query-title">{{index}}</td><td>{{item}}</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script src="{$cdn_cdnjs}vue/2.6.14/vue.min.js"></script>
<script src="https://static.geetest.com/v4/gt4.js"></script>
<script>
new Vue({
el: '#app',
data: {
query_disabled: true,
input: '',
result_input: '',
showresult: false,
result_info: [],
captcha: null
},
mounted() {
this.$refs.input.focus();
var that=this;
initGeetest4({
captchaId: "99b142aaece96330d0f3ffb565ffb3ef",
product: 'bind',
protocol: 'https://',
riskType: 'ai',
},function (captcha) {
captcha.onReady(function(){
that.query_disabled=false;
that.captcha = captcha;
}).onSuccess(function(){
var result = captcha.getValidate();
if (!result) {
layer.closeAll();
return alert('请先完成验证');
}
var data = { uin: that.input};
$.ajax({
url: '/api/{$plugin.alias}/query',
type: 'post',
dataType: 'json',
data: Object.assign(data, result),
cache: false,
success: function (data) {
layer.closeAll();
if(data.status=='ok'){
that.result_input = that.input;
that.showresult = true;
that.result_info = data.data;
captcha.reset();
}else{
layer.alert(data.message, {icon: 5});
captcha.reset();
}
},
error: function () {
layer.closeAll();
layer.msg('服务器错误', {icon: 5});
captcha.reset();
}
});
}).onError(function(){
alert('验证码加载失败,请刷新页面重试');
})
});
},
methods: {
query() {
if(this.input.trim() == ''){
alert('查询内容不能为空');return;
}
layer.load(0, {shade:0.1});
this.captcha.showCaptcha();
}
},
})
</script>
{/block}
+49
View File
@@ -0,0 +1,49 @@
<?php
/**
* 设置空白昵称
*/
namespace plugin\wqq\setqqnick;
use app\Plugin;
use Exception;
use think\facade\View;
class App extends Plugin
{
public function index()
{
$logininfo = session('qq_cookie_qzone');
$error = null;
if($logininfo){
View::assign('isqqlogin', 1);
View::assign('logininfo', $logininfo);
}else{
View::assign('isqqlogin', 0);
}
View::assign('groupid', input('get.groupid'));
View::assign('error', $error);
return $this->view();
}
public function setnick(){
$nickname = input('post.nickname', null);
if(!$nickname) return msg('error','新昵称不能为空');
$logininfo = session('qq_cookie_qzone');
if(!$logininfo){
return msg('error', '请先登录');
}
try{
$qqtool = new \app\lib\QQTool($logininfo['uin'], $logininfo['cookie']);
$qqtool->setnickname($nickname);
}catch(Exception $e){
return msg('error', $e->getMessage());
}
return msg();
}
}
+55
View File
@@ -0,0 +1,55 @@
{extend name="common/plugin_layout" /}
{block name="title"}{$plugin.title} - {:config_get('title')}{/block}
{block name="main"}
<style>
</style>
<div class="container-xl" id="app">
<div class="col-sm-12 col-md-10 col-xl-8 center-block">
<div class="card card-preview">
<div class="card-inner mt-3">
<div class="nya-title nk-ibx-action-item progress-rating">
<span class="nk-menu-text font-weight-bold">设置空白昵称</span>
</div>
<div class="alert alert-info"><em class="icon ni ni-info"></em> 如需设置空白昵称只需输入空格即可。</div>
{if $isqqlogin==0}
<p>当前登录的账号:<b>未登录</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qzone&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">立即登录</a></p>
{else}
<p>当前登录的账号:<b>{$logininfo.nickname|raw}{$logininfo.uin}</b>&nbsp;&nbsp;&nbsp;<a href="/qqlogin?type=qzone&redirect=/{$plugin.alias}" class="btn btn-sm btn-outline-success">更换账号</a></p>
{/if}
<div class="form-group">
<div class="input-group input-group-lg">
<div class="input-group-prepend"><span class="input-group-text">新昵称</span></div>
<input type="text" class="form-control" name="nickname" value="" required>
</div>
</div>
<div class="form-group">
<button type="button" class="btn btn-dim btn-outline-primary btn-block btn-lg card-link" onclick="setnick()">立即设置</button>
</div>
<div id="result" style="display:none;"></div>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script>
function setnick(){
var nickname = $("input[name='nickname']").val();
if(nickname == ''){
layer.alert('新昵称不能为空');
return false;
}
$("#result").hide();
httpPost('/api/{$plugin.alias}/setnick', {nickname: nickname}, function(data){
if(data.status == 'ok'){
$("#result").html('<div class="alert alert-success"><em class="ni ni-check-circle-fill"></em> 设置QQ昵称成功!</div>');
$("#result").slideDown();
}
else{
$("#result").html('<div class="alert alert-warning"><em class="ni ni-cross-circle-fill"></em> '+data.message+'</div>');
$("#result").slideDown();
}
}, true);
}
</script>
{/block}