Repository: kookxiang/Tieba_Sign
Branch: reborn
Commit: 906f2cf15387
Files: 89
Total size: 275.3 KB
Directory structure:
gitextract_mw9r9d_v/
├── README.md
├── admin.php
├── ajax.php
├── api.php
├── config.yaml
├── index.php
├── install/
│ ├── index.php
│ ├── install.sql
│ ├── openshift.php
│ └── sae.php
├── member.php
├── plugin.php
├── plugins/
│ ├── cloud_stat/
│ │ ├── cloud_stat.cron.php
│ │ ├── index.inc.php
│ │ └── plugin.class.php
│ ├── debug_info/
│ │ └── plugin.class.php
│ ├── register_limit/
│ │ └── plugin.class.php
│ ├── stat/
│ │ └── plugin.class.php
│ └── xxx_post/
│ ├── c_daily.cron.php
│ ├── c_first.cron.php
│ ├── c_se.cron.php
│ ├── c_sxbk.cron.php
│ ├── core.php
│ ├── index.php
│ ├── main.js
│ └── plugin.class.php
├── robots.txt
├── system/
│ ├── class/
│ │ ├── cache.php
│ │ ├── cloud.php
│ │ ├── core.php
│ │ ├── db.php
│ │ ├── hook.php
│ │ ├── kerror.php
│ │ ├── mail/
│ │ │ ├── phpmail.php
│ │ │ ├── saemail.php
│ │ │ └── smtp.php
│ │ ├── mail.php
│ │ ├── multithread.php
│ │ ├── plugin.php
│ │ ├── updater.php
│ │ ├── widget/
│ │ │ └── widget_password.php
│ │ └── xmlparse.php
│ ├── common.inc.php
│ └── function/
│ ├── cache/
│ │ ├── cache_plugin.php
│ │ ├── cache_plugins.php
│ │ ├── cache_setting.php
│ │ └── cache_username.php
│ ├── core.php
│ ├── member.php
│ ├── sae.php
│ ├── sign.php
│ └── updater/
│ ├── 1.13.php
│ ├── 1.14.1.15.php
│ ├── 1.14.1.16.php
│ ├── 1.14.1.23.php
│ ├── 1.14.2.6.php
│ ├── 1.14.4.12.php
│ ├── 1.14.4.14.php
│ ├── 1.14.4.24.php
│ ├── 1.14.5.12.php
│ ├── 1.14.5.20.php
│ ├── 1.14.5.27.php
│ ├── 1.14.6.2.php
│ ├── 1.16.6.23.php
│ └── fallback.php
└── template/
└── default/
├── admin.php
├── index.php
├── js/
│ ├── admin.js
│ ├── fwin.js
│ ├── kk_dropdown.js
│ ├── main.js
│ └── member.js
├── member.php
├── message.php
├── mobile/
│ └── message.php
├── style/
│ └── main.css
├── template.xml
└── widget/
├── bind_status.php
├── find_password.php
├── footer.php
├── guide.php
├── header.php
├── liked_tieba.php
├── login.php
├── meta.php
├── register.php
├── setting.php
├── sidebar.php
└── sign_log.php
================================================
FILE CONTENTS
================================================
================================================
FILE: README.md
================================================
# Tieba Sign
Front-end environment for TiebaSign-Backend services, which provides faster auto-sign experience in http://tieba.baidu.com and can handle much more user at the same time.
This front-end project only provides basic registration / management / log view features.
Signing features was not included in this project.
## WARNING
You cannot use these code in your own server.
It required a closed source server-side application which was powered by Go.
这份代码不能直接部署到服务器上,因为还需要一个 Go 语言的服务端程序才可以正常运行(不开源)。
If you want to deploy a server, please use the [old branch](https://github.com/kookxiang/Tieba_Sign/tree/master).
如果你想搭建贴吧签到助手,请使用 [老版本](https://github.com/kookxiang/Tieba_Sign/tree/master).
================================================
FILE: admin.php
================================================
新增{$insert}个贴吧, 删除{$deleted}个贴吧", 'admin.php#user', 1);
break;
case 'reset_failure':
$_uid = intval($_GET['uid']);
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#stat');
$date = date('Ymd');
DB::query("UPDATE sign_log SET status='0', retry='0' WHERE uid='{$_uid}' AND date='{$date}' AND status<0");
showmessage('已经重置,稍后系统将自动重试', 'admin.php#stat', 1);
break;
case 'reset_failure_all':
if(!defined('AFENABLED')) exit();
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#stat');
$date = date('Ymd');
DB::query("UPDATE sign_log SET status='0', retry='0' WHERE date='{$date}' AND status<0");
showmessage('已经重置,稍后系统将自动重试', 'admin.php#stat', 1);
break;
case 'mail_setting':
if($formhash != $_POST['formhash']) showmessage('来源不可信,请重试', 'admin.php#setting');
$classes = getClasses();
$class = $_POST['mail_sender'];
if(!$classes[$class]) showmessage('选择的邮件发送方式不正确.', 'admin.php#setting');
if(!$classes[$class]->isAvailable()) showmessage('选择的邮件发送方式不可用.', 'admin.php#setting');
saveSetting('mail_class', $class);
showmessage('保存成功
(请确认高级设置配置有效)', 'admin.php#setting');
break;
case 'mail_advanced':
$classes = getClasses();
$class = getSetting('mail_class');
$obj = $classes[$class];
if(!$obj) showmessage('选择的邮件发送方式不正确.', 'admin.php#setting');
if(!$obj->isAvailable()) showmessage('选择的邮件发送方式不可用.', 'admin.php#setting');
$_config = $obj->config;
if($_POST['formhash'] == $formhash){
foreach($_config as $k=>$v){
$key = $v[1];
$value = daddslashes($_POST[$key]);
saveSetting("_mail_{$class}_{$key}", $value);
}
CACHE::save("mail_{$class}", '');
showmessage('保存成功!', 'admin.php#setting');
}
$out = array();
$setting = array();
$query = DB::query("SELECT * FROM setting WHERE k LIKE '_mail_{$class}_%'");
while($result = DB::fetch($query)){
$key = str_replace("_mail_{$class}_", '', $result['k']);
$setting[$key] = $result['v'];
}
foreach($_config as $k=>$v){
$key = $v[1];
$item = array(
'key' => $v[1],
'name' => $v[0],
'description' => $v[2],
'value' => isset($setting[$key]) ? $setting[$key] : $v[3],
'type' => $v[4] ? $v[4] : 'text',
);
$out[] = $item;
}
echo json_encode($out);
break;
case 'switch_channel':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#updater');
$channel = $_GET['channel'];
if($channel != 'dev' && $channel != 'stable') showmessage('未知分支ID', 'admin.php#updater');
saveSetting('channel', $channel);
showmessage('分支切换成功.', 'admin.php#updater#');
case 'install_plugin':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#plugin');
require_once SYSTEM_ROOT.'./class/plugin.php';
$plugin_id = $_GET['pluginid'];
if(preg_match('/[^A-Za-z0-9_-.]/', $plugin_id)) showmessage('插件ID不合法,请与插件作者联系', 'admin.php#plugin');
$classfile = ROOT.'./plugins/'.$plugin_id.'/plugin.class.php';
if(!file_exists($classfile)) showmessage('插件文件缺失,请与插件作者联系', 'admin.php#plugin');
require_once $classfile;
$classname = "plugin_{$plugin_id}";
if(!class_exists("plugin_{$plugin_id}", false)) showmessage('插件类不合规范,请与插件作者联系', 'admin.php#plugin');
$obj = new $classname();
$method_blacklist = array('__construct', '__destruct', $classname);
foreach($method_blacklist as $method) if(method_exists($obj, $method)) showmessage('插件不符合性能要求规定,请与插件作者联系', 'admin.php#plugin');
if ($obj instanceof Plugin){
$obj->checkCompatibility();
$compatibilityMode = false;
}else{
// 弹出旧版插件提示
$compatibilityMode = true;
}
$version = 0;
if(property_exists($obj, 'version')) $version = $obj->version;
DB::insert('plugin', array('name' => $plugin_id, 'version' => $version, 'enable' => 0));
CACHE::update('plugins');
if($compatibilityMode){
if(method_exists($obj, 'on_install')) $obj->on_install();
}else{
$obj->install();
}
showmessage('安装插件成功!', 'admin.php#plugin#');
case 'uninstall_plugin':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#plugin');
$plugin_id = $_GET['pluginid'];
if(preg_match('/[^A-Za-z0-9_-.]/', $plugin_id)) showmessage('插件ID不合法,请与插件作者联系', 'admin.php#plugin');
DB::query("DELETE FROM `plugin` WHERE name='{$plugin_id}'");
DB::query("DELETE FROM plugin_var WHERE pluginid='".addslashes($plugin_id)."'");
$classfile = ROOT.'./plugins/'.$plugin_id.'/plugin.class.php';
if(file_exists($classfile)){
require_once $classfile;
$classname = "plugin_{$plugin_id}";
if(class_exists("plugin_{$plugin_id}", false)){
$obj = new $classname();
if ($obj instanceof Plugin){
$compatibilityMode = false;
}else{
$compatibilityMode = true;
}
if(property_exists($obj, 'modules')){
foreach($obj->modules as $module){
if($module['type'] == 'cron'){
DB::query("DELETE FROM cron WHERE id='".$module['cron']['id']."'");
}
}
}
if($compatibilityMode){
if(method_exists($obj, 'on_uninstall')) $obj->on_uninstall();
}else{
$obj->uninstall();
}
}
}
CACHE::update('plugin');
CACHE::update('plugins');
showmessage('卸载插件成功!', 'admin.php#plugin#');
case 'enable_plugin':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#plugin');
$plugin_id = $_GET['pluginid'];
if(preg_match('/[^A-Za-z0-9_-.]/', $plugin_id)) showmessage('插件ID不合法,请与插件作者联系', 'admin.php#plugin');
DB::query("UPDATE `plugin` SET `enable`=1 WHERE name='{$plugin_id}'");
$classname = "plugin_{$plugin_id}";
$obj = new $classname();
$method_blacklist = array('__construct', '__destruct', $classname);
foreach($method_blacklist as $method) if(method_exists($obj, $method)) showmessage('插件不符合性能要求规定,请与插件作者联系', 'admin.php#plugin');
if (property_exists($obj, 'modules')){
foreach($obj->modules as $module){
if($module['type'] == 'cron'){
DB::insert('cron', array_merge($module['cron'], array('nextrun' => TIMESTAMP)), false, true);
}
}
}
CACHE::update('plugins');
showmessage('启用插件成功!', 'admin.php#plugin#');
case 'update_check':
$ret = Updater::check();
if(is_array($ret)){
$return = array(
'status' => 1,
'files' => $ret,
);
}else{
$return = array(
'status' => $ret,
'files' => array(),
);
}
echo json_encode($return);
exit();
case 'get_file':
echo json_encode(Updater::loop());
exit();
case 'write_file':
echo json_encode(Updater::write_file());
exit();
case 'disable_plugin':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#plugin');
$plugin_id = $_GET['pluginid'];
if(preg_match('/[^A-Za-z0-9_-.]/', $plugin_id)) showmessage('插件ID不合法,请与插件作者联系', 'admin.php#plugin');
DB::query("UPDATE `plugin` SET `enable`=0 WHERE name='{$plugin_id}'");
$classname = "plugin_{$plugin_id}";
$obj = new $classname ();
if(property_exists ($obj, 'modules')){
foreach($obj->modules as $module){
if($module ['type'] == 'cron'){
DB::query("DELETE FROM cron WHERE id='".$module['cron']['id']."'");
}
}
}
CACHE::update('plugins');
showmessage('禁用插件成功!', 'admin.php#plugin#');
case 'config_plugin':
$plugin_id = $_REQUEST['pluginid'];
if($_POST['submit'] && $formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#plugin');
if(preg_match('/[^A-Za-z0-9_-.]/', $plugin_id)) showmessage('插件ID不合法,请与插件作者联系', 'admin.php#plugin');
$classfile = ROOT.'./plugins/'.$plugin_id.'/plugin.class.php';
if(!file_exists($classfile)) showmessage('插件文件缺失,请与插件作者联系', 'admin.php#plugin');
require_once $classfile;
$classname = "plugin_{$plugin_id}";
if(!class_exists("plugin_{$plugin_id}", false)) showmessage('插件类不合规范,请与插件作者联系', 'admin.php#plugin');
$obj = new $classname();
if(method_exists($obj, 'on_config')){
echo json_encode(array('html' => $obj->on_config()));
}else{
echo json_encode(array('html' => '错误:该插件没有高级配置面板!'));
}
break;
case 'eNaBlEaFc':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#setting');
$text = pack('H*', strrev($_GET['hash']));
if($text == 'ENABLE ADVANCED FETURES') saveSetting('AFENABLED', 1);
showmessage('Advance fetures activated!', 'admin.php#setting', 1);
break;
case 'mail_test':
if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#setting');
$to = DB::result_first("SELECT email FROM member WHERE uid='{$uid}'");
$subject = '[贴吧签到助手] 邮件单发测试';
$content = "
此封邮件仅用于检测邮件系统是否正常工作。
此封邮件是由邮件系统直接发送的
"; $mail = new mail_content(); $mail->address = $to; $mail->subject = $subject; $mail->message = $content; $sender = new mail_sender(); if($sender->sendMail($mail)){ $subject = '[贴吧签到助手] 邮件群发测试'; $content = "此封邮件仅用于检测邮件队列是否正常工作。
此封邮件是从系统邮件队列中读取并发送的
"; DB::insert('mail_queue', array( 'to' => $to, 'subject' => $subject, 'content' => $content, )); saveSetting('mail_queue', 1); showmessage('2 封邮件已经发送,请查收', 'admin.php#setting', 2); }else showmessage('邮件发送失败,请检查设置后重试', 'admin.php#setting', 2); break; case 'send_mail': if($formhash != $_POST['formhash']) showmessage('来源不可信,请重试', 'admin.php#setting'); $title = daddslashes($_POST['title']); $content = daddslashes($_POST['content']); $content = nl2br(htmlspecialchars($content)); $content .= "—— 本邮件由 贴吧签到助手 ({$siteurl}) 管理员发送
"; $query = DB::query("SELECT email FROM member"); while($result = DB::fetch($query)){ DB::insert('mail_queue', array( 'to' => $result['email'], 'subject' => $title, 'content' => $content, )); } saveSetting('mail_queue', 1); showmessage('已经添加至邮件队列,稍后将由系统自动发送', 'admin.php#mail'); break; case 'cloud_sync': $ret = cloud::sync(); showmessage($ret ? '站点信息同步成功!' : '同步信息失败,请稍后再试', 'admin.php#setting'); break; case 'load_plugin': exit(json_encode(getPlugins())); break; case 'load_template': exit(json_encode(getTemplates())); break; case 'load_cron': exit(json_encode(getCron())); break; case 'skip_cron': if(!defined('AFENABLED')) exit(); if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#cron'); $cron_id = daddslashes($_GET['cid']); DB::query("UPDATE cron SET nextrun=nextrun+86400 WHERE id='{$cron_id}'"); $time = TIMESTAMP; DB::query("UPDATE cron SET nextrun='{$time}'+3600 WHERE id='{$cron_id}' AND nextrun < '{$time}'"); showmessage('计划任务修改成功', 'admin.php#cron'); break; case 'clear_cron_cache': if(!defined('AFENABLED')) exit(); if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#cron'); $nextrun = DB::fetch_first("SELECT nextrun FROM cron ORDER BY nextrun ASC LIMIT 0,1"); saveSetting('next_cron', $nextrun ? $nextrun['nextrun'] : TIMESTAMP + 1200); showmessage('缓存已清除', 'admin.php#cron'); break; case 'clear_cache': if(!defined('AFENABLED')) exit(); if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#cron'); CACHE::clear(); showmessage('缓存已清除', 'admin.php#cron'); break; case 'clear_cron': if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#cron'); $query = DB::query("SELECT * FROM cron ORDER BY `order`"); $deleted = 0; while($cron = DB::fetch($query)){ list($pluginid, $cronscript) = explode('/', $cron['id'], 2); if($pluginid && $cronscript){ $path = ROOT."./plugins/{$pluginid}/{$cronscript}.cron.php"; }else{ $path = SYSTEM_ROOT."./function/cron/{$cron[id]}.php"; } if(!file_exists($path)){ DB::query("DELETE FROM cron WHERE id='".addslashes($cron['id'])."'"); $deleted++; } } showmessage("共清理了 {$deleted} 个无效的计划任务"); break; case 'set_template': if($formhash != $_GET['formhash']) showmessage('来源不可信,请重试', 'admin.php#plugin'); if(preg_match('/[^A-Za-z0-9_-.]/', $_GET['template'])) showmessage('模板ID(文件夹名)不合法,请与模板作者联系', 'admin.php#template'); $templatefile = ROOT.'./template/'.$_GET['template'].'/template.xml'; if (file_exists($templatefile)) { $info = xml2array(file_get_contents($templatefile)); if(!$info || !$info['target_version'] || !is_array($info['target_version']) || $info['ui_version']!=UI_VERSION) showmessage('此模板不兼容当前版本', 'admin.php#template'); saveSetting('template', daddslashes($_GET['template'])); if(!in_array(VERSION, $info['target_version'])) showmessage('模板切换成功!欢迎使用 贴吧签到助手 安装向导!
本程序将会指引你在服务器上配置好“贴吧签到助手”
点击右侧的“下一步”按钮开始
'; show_install_page('Welcome', $content); break; case 'check': $content = '
安装前,程序需要检查当前的服务器环境是否允许运行“贴吧签到助手”
请确保表格中每一行均为绿色,以避免可能带来的问题
| 项目 | 要求 | 当前状态 |
| PHP 版本 | 5.2 | '.PHP_VERSION.' |
| PHP: allow_url_fopen | '.show_status(true).' | '.show_status(ini_get('allow_url_fopen')).' |
| CURL | '.show_status(true).' | '.show_status(function_exists('curl_init')).' |
| Socket 连接 | '.show_status(true).' | '.show_status(function_exists('fsockopen') || function_exists('pfsockopen')).' |
| system/config.inc.php | '.show_status(true, '可写').' | '.show_status(is_writable($config_file), '可写', '不可写').' |
请填写数据库连接信息
'.mysql_error()); $selected = mysql_select_db($db_name, $link); if(!$selected){ // 尝试新建 mysql_query("CREATE DATABASE `{$db_name}`", $link); $selected = mysql_select_db($db_name, $link); if(!$selected) show_back('数据库配置', '错误:指定的数据库不可用
'.mysql_error()); } mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary"); $syskey = random(32); $username = addslashes($_POST['username']); $password = md5($syskey.md5($_POST['password']).$syskey); $email = addslashes($_POST['email']); if(!$username || !$password || !$email) show_back('注册账号', '您输入的信息不完整'); if(preg_match('/[<>\'\\"]/i', $username)) show_back('注册账号', '用户名中有被禁止使用的关键字'); if(strlen($username) < 6) show_back('注册账号', '用户名至少要6个字符(即2个中文 或 6个英文),请修改'); if(strlen($username) > 24) show_back('注册账号', '用户名过长,请修改'); $install_script = file_get_contents(dirname(__FILE__).'/install.sql'); preg_match('/version ([0-9a-z.]+)/i', $install_script, $match); $version = trim($match[1]); if(!$version) show_back('正在安装', '安装脚本有误,请重新上传'); $err = runquery($install_script, $link); if($err) show_back('正在安装', '安装过程出现错误:
'.$err); mysql_query("INSERT INTO member SET username='{$username}', password='{$password}', email='{$email}'"); $uid = mysql_insert_id($link); mysql_query("INSERT INTO member_setting SET uid='{$uid}', cookie=''"); saveSetting('block_register', 1); saveSetting('jquery_mode', 2); saveSetting('admin_uid', $uid); saveSetting('SYS_KEY', $syskey); $_config = array( 'version' => $version, 'db' => array( 'server' => $db_host, 'port' => $db_port, 'username' => $db_username, 'password' => $db_password, 'name' => $db_name, 'pconnect' => $db_pconnect, ), ); $content = ''; file_put_contents($config_file, $content); $content = '
贴吧签到助手 已经成功安装!
要正常签到,请为脚本 cron.php 添加每分钟一次的计划任务。
系统默认关闭用户注册,如果有需要,请到后台启用用户注册功能。
'; show_install_page('安装成功', $content); } function show_back($title, $text){ $content = '
'.$text.'
'; $content .= '本程序将会指引你在服务器上配置好“贴吧签到助手”
点击右侧的“下一步”按钮开始
Openshift one-key installer. Thanks to 郁闷de说
'; show_install_page('Welcome', $content); break; case 'database': $content = '
请设置站点管理员信息
'.mysql_error()); $selected = mysql_select_db($db_name, $link); if(!$selected){ // 尝试新建 mysql_query("CREATE DATABASE `{$db_name}`", $link); $selected = mysql_select_db($db_name, $link); if(!$selected) show_back('数据库配置', '错误:指定的数据库不可用
'.mysql_error()); } mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary"); $syskey = random(32); $username = addslashes($_POST['username']); $password = md5($syskey.md5($_POST['password']).$syskey); $email = addslashes($_POST['email']); if(!$username || !$password || !$email) show_back('注册账号', '您输入的信息不完整'); if(preg_match('/[<>\'\\"]/i', $username)) show_back('注册账号', '用户名中有被禁止使用的关键字'); if(strlen($username) < 6) show_back('注册账号', '用户名至少要6个字符(即2个中文 或 6个英文),请修改'); if(strlen($username) > 24) show_back('注册账号', '用户名过长,请修改'); $install_script = file_get_contents(dirname(__FILE__).'/install.sql'); preg_match('/version ([0-9a-z.]+)/i', $install_script, $match); $version = trim($match[1]); if(!$version) show_back('正在安装', '安装脚本有误,请重新上传'); $err = runquery($install_script, $link); mysql_query("INSERT INTO member SET username='{$username}', password='{$password}', email='{$email}'"); $uid = mysql_insert_id($link); mysql_query("INSERT INTO member_setting SET uid='{$uid}', cookie=''"); saveSetting('block_register', 1); saveSetting('jquery_mode', 2); saveSetting('admin_uid', $uid); saveSetting('SYS_KEY', $syskey); if($err) show_back('正在安装', '安装过程出现错误:
'.mysql_error()); $_config = array( 'version' => $version, 'db' => array( 'server' => $db_host, 'port' => $db_port, 'username' => $db_username, 'password' => $db_password, 'name' => $db_name, 'pconnect' => $db_pconnect, ), ); $content = ''; file_put_contents($config_file, $content); $content = '
贴吧签到助手 已经成功安装!
系统默认关闭用户注册,如果有需要,请到后台启用用户注册功能。
Openshift 用户如出现错误请前往管理界面重启应用
'; show_install_page('安装成功', $content); } function show_back($title, $text){ $content = '
'.$text.'
'; $content .= '欢迎使用 贴吧签到助手 安装向导!
本程序将会指引你在服务器上配置好“贴吧签到助手”
点击右侧的“下一步”按钮开始
'; show_install_page('Welcome', $content); break; case 'database': $content = '
请填写基本信息
贴吧签到助手 已经成功安装!
系统默认关闭用户注册,如果有需要,请到后台启用用户注册功能。
'; show_install_page('安装成功', $content); } function show_back($title, $text){ $content = '
'.$text.'
'; $content .= '{$link}
(注:请在一小时内点击上面的链接,我们将向您提供新的密码)
如果您没有要求重置密码却收到本邮件,请及时删除此邮件以确保账户安全。
EOF; DB::insert('mail_queue', array( 'to' => $user['email'], 'subject' => "贴吧签到助手 - 密码找回", 'content' => $message, )); saveSetting('mail_queue', 1); showmessage('邮件发送成功,请到邮箱查收', './'); } header('Location: member.php'); exit(); }elseif($_GET['action'] == 'register'){ if(getSetting('block_register')) showmessage('抱歉,当前站点禁止新用户注册', 'member.php'); $count = DB::result_first('SELECT COUNT(*) FROM member'); if($_POST && strexists($_SERVER['HTTP_REFERER'], 'member.php')){ list($time, $hash, $member_count) = explode("\t", authcode($_COOKIE['key'], 'DECODE')); if(getSetting('register_check') && $time > TIMESTAMP - 5 || $time < TIMESTAMP - 300) $_POST = array(); if(getSetting('register_limit') && $member_count != $count) showmessage('当前注册人数过多,请您稍后再试', 'member.php'); if($count > 1000) showmessage('超过当前站点最大用户数量上限,无法注册', 'member.php'); $_POST['username'] = $_POST['password'] = $_POST['email'] = null; foreach($_POST as $key => $value){ $key = authcode($key, 'DECODE', $hash); if($key == 'username'){ $_POST['username'] = $value; }elseif($key == 'password'){ $_POST['password'] = $value; }elseif($key == 'email'){ $_POST['email'] = $value; } } if(!$_POST['username']){ showmessage('请输入用户名', 'member.php'); }elseif(!$_POST['password']){ showmessage('请输入密码', 'member.php'); }elseif(!$_POST['email']){ showmessage('请输入您的邮箱', 'member.php'); }else{ if($invite_code && $_POST['invite_code'] != $invite_code) showmessage('邀请码有误', 'member.php'); $username = daddslashes($_POST['username']); $email = daddslashes($_POST['email']); if(!is_email($email)) showmessage('邮箱格式不正确,请修改', dreferer(), 5); if(!$username || !$_POST['password'] || !$email) showmessage('您输入的信息不完整', 'member.php'); if(preg_match('/[<>\'\\"]/i', $username)) showmessage('用户名中有被禁止使用的关键字', 'member.php'); if(strlen($username) < 6) showmessage('用户名至少要6个字符(即2个中文 或 6个英文),请修改', dreferer(), 5); if(strlen($username) > 24) showmessage('用户名过长,请修改', dreferer(), 5); $un = strtolower($username); if(strexists($un, 'admin') || strexists($un, 'guanli')) showmessage('用户名不和谐,请修改', dreferer(), 5); $user = DB::fetch_first("SELECT * FROM member WHERE username='{$username}'"); if($user) showmessage('用户名已经存在', 'member.php'); HOOK::run('before_register'); $uid = do_register($username, $_POST['password'], $email); do_login($uid); HOOK::run('register_finish', false, $uid); showmessage("注册成功,您的用户名是 {$username} 记住了哦~!", dreferer(), 3); } } header('Location: member.php'); exit(); }elseif($_POST){ if($_POST['username'] && $_POST['password']){ $username = daddslashes($_POST['username']); $un = strtolower($username); if(strlen($username) > 24) showmessage('用户名过长,请修改', dreferer(), 5); $user = DB::fetch_first("SELECT * FROM member WHERE username='{$username}'"); $verified = Widget_Password::verify($user, $_POST['password']); if($verified) { $login_exp = TIMESTAMP + 3600; do_login($user['uid']); $username = $user['username']; showmessage("欢迎回来,{$username}!", dreferer(), 1); }else{ showmessage('对不起,您的用户名或密码错误,无法登录.', 'member.php', 3); } } } $count = DB::result_first('SELECT COUNT(*) FROM member'); $hash = random(6); $time = TIMESTAMP; dsetcookie('key', authcode("{$time}\t{$hash}\t{$count}", 'ENCODE')); $form_username = authcode('username', 'ENCODE', $hash); $form_password = authcode('password', 'ENCODE', $hash); $form_email = authcode('email', 'ENCODE', $hash); include template('member'); ================================================ FILE: plugin.php ================================================ handleAction(); } else { throw new Exception('This plugin doesn\'t support to be called directly.'); } ================================================ FILE: plugins/cloud_stat/cloud_stat.cron.php ================================================ getSetting('tieba')); $exp = intval($obj->getSetting('exp')); $tieba += DB::result_first("SELECT COUNT(*) FROM sign_log WHERE status=2 AND date='{$date}'"); $obj->saveSetting('tieba', $tieba); $exp += DB::result_first("SELECT SUM(exp) FROM sign_log WHERE status=2 AND date='{$date}'"); $obj->saveSetting('exp', $exp); /* send data */ $sid = cloud::id(); $key = cloud::key(); $sign = md5($key.$sid.$tieba.$exp.$key); $ret = kk_fetch_url("http://api.ikk.me/stat.php?sid={$sid}&tieba={$tieba}&exp={$exp}&sign={$sign}"); if($ret) { $data = json_decode($ret); if($data){ $obj->saveSetting('cloud_tieba', $data->tieba); $obj->saveSetting('cloud_exp', $data->exp); } } cron_set_nextrun($tomorrow + 3600); ================================================ FILE: plugins/cloud_stat/index.inc.php ================================================* 数据源自 贴吧签到助手 开放平台 旗下所有签到站点.
================================================ FILE: plugins/cloud_stat/plugin.class.php ================================================ 'page', 'id' => 'index', 'title' => '签到云统计', 'file' => 'index.inc.php'), array('type' => 'cron', 'cron' => array('id' => 'cloud_stat/cloud_stat', 'order' => '105')), ); var $version = '1.1'; function checkCompatibility(){ if(version_compare(VERSION, '1.14.4.24', '<')) showmessage('本插件不兼容此版的贴吧签到助手.'); } function install(){ $count = DB::result_first('SELECT COUNT(*) FROM sign_log WHERE status=2'); $this->saveSetting('tieba', $count); $count = DB::result_first('SELECT SUM(exp) FROM sign_log WHERE status=2'); $this->saveSetting('exp', $count); $ret = kk_fetch_url("http://api.ikk.me/stat.php"); if(!$ret) return; $data = json_decode($ret); if(!$data) return; $this->saveSetting('cloud_tieba', $data->tieba); $this->saveSetting('cloud_exp', $data->exp); } function mklink($sourceFile, $targetFile){ return @file_put_contents($targetFile, ''); } function on_upgrade($from_version){ switch($from_version){ case '1.0': DB::query("UPDATE cron SET id='cloud_stat/cloud_stat' WHERE id='cloud_stat'"); return '1.1'; default: throw new Exception("Unknown plugin version: {$from_version}"); } } function handleAction(){ echo json_encode(array( 'ctieba' => intval($this->getSetting('cloud_tieba')), 'cexp' => intval($this->getSetting('cloud_exp')), 'tieba' => intval($this->getSetting('tieba')), 'exp' => intval($this->getSetting('exp')), )); } } ================================================ FILE: plugins/debug_info/plugin.class.php ================================================ 0) DB::query("UPDATE kk_ip_limit SET lastact='{$time}' WHERE a='{$a}' AND b='{$b}' AND c='{$c}' AND d='{$d}'"); if($count >= $this->getSetting('ip_reglimit', 5)) showmessage('达到单 IP 注册上限,禁止注册。', dreferer()); if($count > 0){ DB::query("UPDATE kk_ip_limit SET count=count+1 WHERE a='{$a}' AND b='{$b}' AND c='{$c}' AND d='{$d}'"); }else{ DB::query("INSERT INTO kk_ip_limit SET count=1, lastact='{$time}', a='{$a}', b='{$b}', c='{$c}', d='{$d}'"); } } function on_config(){ if($_POST['limit']){ $this->saveSetting('ip_reglimit', $_POST['limit']); showmessage('设置已经保存!'); }else{ return '单个 IP 注册上限:
'; } } } ================================================ FILE: plugins/stat/plugin.class.php ================================================ getSetting('code'); if($data) return '页脚统计代码:
'; } } } ================================================ FILE: plugins/xxx_post/c_daily.cron.php ================================================ getSetting('se'); if(!$setime) $setime=21; $nxrun =$today+$setime*3600; DB::query("update cron set nextrun='$nxrun' where id='xxx_post/c_se'"); cron_set_nextrun($tomorrow + 600); ================================================ FILE: plugins/xxx_post/c_first.cron.php ================================================ getSetting('first_end'); if(!$first_end) $first_end=15; $first_end_time=$today+$first_end*3600; if($first_end_time当前插件版本:0.3.1 | 更新日期:14-04-29 | Designed By @星弦雪
随机选取一个帖子,进行一次回帖测试,检查你的设置有没有问题
| 序号 | 贴吧 | 贴子 | 操作 |
载入中请稍后 | |||
回帖时随机使用其中之一,不添加的话会使用系统内置的
| 序号 | 回帖内容 | 操作 | |
载入中请稍后 | |||
如果帖子已从回帖列表删除,则不会在这里显示
| 序号 | 贴吧 | 贴子 | 成功 | 失败 |
| 载入中请稍后 | ||||
使用该插件需做好每日被永封的准备,因发帖插件导致的账号被封、被屏蔽,请使用者自行承担后果
其实解封很简单的= =(作者表示已经被永封过无数次)
如果被度受永封的话:
1.绑定手机秒解
2.申请人工解封的话,只要你不是丧心病狂地每分钟一贴,一般都可以通过
如果被吧务封禁的话,只好找吧务承认错误并表示永不再犯= =(不过在官方水楼里刷的话应该吧务不会插手)
你可以指定帖子进行回复
请输入帖子的地址:
例如:http://tieba.baidu.com/p/2692275116
').addButton("确定", function(){ $('#xxx_post_tid_form').submit(); }).addCloseButton("取消").append(); }); $("#x_p_add_tb").click(function(){ createWindow().setTitle("添加帖吧").setContent('你可以只指定贴吧,并从该贴吧首页随机选择帖子进行回复
请输入帖吧的名字(不要带“吧”字):
例如:要添加chrome吧,请输入chrome
').addButton("确定", function(){ $('#xxx_post_add_tb_form').submit(); }).addCloseButton("取消").append(); }); $("#xxx_post_add_content").click(function(){ createWindow().setTitle("添加回帖内容").setContent('请输入要回复的内容(最多1000字符):
').addButton("确定", function(){ $('#xxx_post_content_form').submit(); }).addCloseButton("取消").append(); }); $("#x_p_add_con").click(function(){ createWindow().setTitle("批量添加内容").setContent('请输入要回复的内容(每行算一条):
').addButton("确定", function(){ $('#x_p_cont_form').submit(); }).addCloseButton("取消").append(); }); $("#x_p_del_con").click(function(){ createWindow().setTitle("批量删除").setContent('你确定要删除全部回复内容吗?').addButton("确定", function(){msg_callback_action('plugin.php?id=xxx_post&action=del-all-cont',x_reload);}).addCloseButton("取消").append(); }); $("#x_p_del_tid").click(function(){ createWindow().setTitle("批量删除").setContent('你确定要删除全部贴子吗?').addButton("确定", function(){msg_callback_action('plugin.php?id=xxx_post&action=del-all-tid',x_reload);}).addCloseButton("取消").append(); }); $(".x_tab_content>div").each(function(i){ $(this).addClass("x_tab_content_"+i); if(i!=0) $(this).hide(); }); $(".nav-tabs >li>a").click(function(){ if($(this).parent().hasClass("active")) return 0; else{ $(".x_tab_content>.x_tab_content_"+$(this).parent().siblings().filter(".active").index()).hide(); $(this).parent().siblings().filter(".active").removeClass("active"); $(".x_tab_content>.x_tab_content_"+$(this).parent().index()).show(); $(this).parent().addClass("active"); if($(this).parent().index()==0) {load_post_set();load_post_adv_set();} else if($(this).parent().index()==1) load_post_log(); } }); function x_reload(){ load_post_set();load_post_adv_set(); } function load_post_set(){ showloading(); $.getJSON("plugin.php?id=xxx_post&action=post-settings", function(result){ show_post_set(result); }).fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法获取设置').addButton('确定', function(){ location.reload(); }).append(); }).always(function(){ hideloading(); }); } function show_post_set(result){ $('#xxx_post_show').html(''); $('#xxx_post_contents').html(''); if(result.count1){ $.each(result.tiebas, function(i, field){ $("#xxx_post_show").append("时间控制(24小时制):
在点之前结束第一次回帖
在点之后开始第二次回帖
每位用户每次最多回个帖子
EOF; } } function handleAction(){ global $uid; if(!$uid) return; switch ($_GET ['action']) { case 'delsid' : $_sid = intval ( $_GET ['sid'] ); DB::query ( "DELETE FROM xxx_post_posts WHERE sid='{$_sid}'" ); $data ['msg'] = "删除成功"; break; case 'del-all-tid' : DB::query ( "DELETE FROM xxx_post_posts WHERE uid='{$uid}'" ); $data ['msg'] = "删除成功"; break; case 'delcont' : $cid = intval ( $_GET ['cid'] ); DB::query ( "DELETE FROM xxx_post_content WHERE cid='{$cid}'" ); $data ['msg'] = "删除成功"; break; case 'del-all-cont' : DB::query ( "DELETE FROM xxx_post_content WHERE uid='{$uid}'" ); $data ['msg'] = "删除成功"; break; case 'set-content' : $contx = $_POST ['post_content']; if (! $contx) { $data ['msg'] = "设置失败,请输入字符串"; } else { DB::insert ( 'xxx_post_content', array ( 'uid' => $uid, 'content' => $contx ) ); $data ['msg'] = "设置成功"; } break; case 'set-cont-plus' : $contplus = $_POST ['x_p_contant']; if (! trim ( $contplus )) { $data ['msg'] = "设置失败,请输入字符串"; } else { $cp_array = explode ( "\n", trim ( $contplus ) ); foreach ( $cp_array as $contx ) { if (! trim ( $contx )) continue; DB::insert ( 'xxx_post_content', array ( 'uid' => $uid, 'content' => $contx ) ); } $data ['msg'] = "设置成功"; } break; case 'set-settings' : $client_type = intval($_POST ['x_p_client_type']); $frequency = intval($_POST ['x_p_frequency']); $runtimes = intval($_POST ['x_p_runtimes']); $delay = intval($_POST ['x_p_delay']); $max_runtime=$this->getSetting('max_runtime', 6); $runtimes = min($max_runtime, $runtimes); if ($delay < 0) $delay = 0; else if ($delay > 15) $delay = 15; if ($runtimes < 1) $delay = 1; else if ($runtimes > 6) $delay = 6; DB::query ( "replace into xxx_post_setting (uid,client_type,frequency,delay,runtimes) values($uid,$client_type,$frequency,$delay,$runtimes)" ); $data ['msg'] = "设置成功"; break; case 'post-settings' : $query = DB::query ( "SELECT * FROM xxx_post_posts WHERE uid='$uid'" ); while ( $result = DB::fetch ( $query ) ) { $data ['tiebas'] [] = $result; } $query = DB::query ( "SELECT * FROM xxx_post_content WHERE uid='$uid'" ); while ( $result = DB::fetch ( $query ) ) { $data ['contents'] [] = $result; } $data ['count1'] = count ( $data ['tiebas'] ); $data ['count2'] = count ( $data ['contents'] ); break; case 'post-adv-settings' : $query = DB::query ( "SELECT * FROM xxx_post_setting WHERE uid='$uid'" ); while ( $result = DB::fetch ( $query ) ) { $data ['settings'] = $result; } if (! $data ['settings'] ['client_type']) { DB::query ( "insert into xxx_post_setting set uid=$uid"); $data ['settings'] ['client_type'] = 5; $data ['settings'] ['frequency'] = 2; $data ['settings'] ['delay'] = 1; $data ['settings'] ['runtimes'] = 6; } break; case 'add-tieba' : $tieba = $_POST ['xxx_post_add_tieba']; $ch = curl_init ('http://tieba.baidu.com/f?kw='.urlencode(iconv("utf-8", "gbk", $tieba)).'&fr=index'); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); $contents = curl_exec ( $ch ); curl_close ( $ch ); $fid = 0; preg_match('/"forum_id"\s?:\s?(?测试帖子:【{$tiezi[name]}吧】{$tiezi[post_name]}
测试结果:{$status}
详细信息:{$result}
" ); break; case 'post-log' : $date = date ( 'Ymd' ); $data ['date'] = date ( 'Y-m-d' ); case 'post-history' : if ($_GET ['action'] == 'post-history') { $date = intval ( $_GET ['date'] ); $data ['date'] = substr ( $date, 0, 4 ) . '-' . substr ( $date, 4, 2 ) . '-' . substr ( $date, 6, 2 ); } $data ['log'] = array (); $query = DB::query ( "SELECT * FROM xxx_post_log l LEFT JOIN xxx_post_posts t ON t.sid=l.sid WHERE l.uid='$uid' AND l.date='$date'" ); while ( $result = DB::fetch ( $query ) ) { if (! $result ['sid']) continue; $data ['log'] [] = $result; } $data ['count'] = count ( $data ['log'] ); $data ['before_date'] = DB::result_first ( "SELECT date FROM xxx_post_log WHERE uid='{$uid}' AND date<'{$date}' ORDER BY date DESC LIMIT 0,1" ); $data ['after_date'] = DB::result_first ( "SELECT date FROM xxx_post_log WHERE uid='{$uid}' AND date>'{$date}' ORDER BY date ASC LIMIT 0,1" ); break; } echo json_encode ( $data ); } } ================================================ FILE: robots.txt ================================================ User-agent: * Disallow: / ================================================ FILE: system/class/cache.php ================================================ init_header(); $this->init_useragent(); Updater::init(); $this->init_syskey(); $this->init_cookie(); cloud::init(); HOOK::INIT(); $this->init_final(); } function __destruct() { if (!defined('SYSTEM_STARTED')) return; HOOK::run('on_unload'); flush(); ob_end_flush(); $this->init_mail(); } function init_header() { ob_start(); header('Content-type: text/html; charset=utf-8'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Cache-Control: no-cache'); header('Pragma: no-cache'); @date_default_timezone_set('Asia/Shanghai'); } function init_useragent() { $ua = strtolower($_SERVER['HTTP_USER_AGENT']); if (strpos($ua, 'wap') || strpos($ua, 'mobi') || strpos($ua, 'opera') || $_GET['mobile']) { define('IN_MOBILE', true); } else { define('IN_MOBILE', false); } if (strpos($ua, 'bot') || strpos($ua, 'spider')) define('IN_ROBOT', true); } function init_syskey() { define('ENCRYPT_KEY', getSetting('SYS_KEY')); } function init_cookie() { global $cookiever, $uid, $username; $cookiever = '2'; if (!empty($_COOKIE['token'])) { list($cc, $uid, $username, $exptime, $password) = explode("\t", authcode($_COOKIE['token'], 'DECODE')); if (!$uid || $cc != $cookiever) { unset($uid, $username, $exptime); dsetcookie('token'); } elseif ($exptime < TIMESTAMP) { $user = DB::fetch_first("SELECT * FROM member WHERE uid='{$uid}'"); $_password = substr(md5($user['password']), 8, 8); if ($user && $password == $_password) { $exptime = TIMESTAMP + 900; dsetcookie('token', authcode("{$cookiever}\t{$uid}\t{$user[username]}\t{$exptime}\t{$password}", 'ENCODE')); } else { unset($uid, $username, $exptime); dsetcookie('token'); } } } else { $uid = $username = ''; } } function init_final() { define('SYSTEM_STARTED', true); @ignore_user_abort(true); if(getSetting('AFENABLED')) define('AFENABLED', true); HOOK::run('on_load'); } function init_mail() { $queue = getSetting('mail_queue'); if (!$queue) return; $mail = DB::fetch_first("SELECT * FROM mail_queue LIMIT 0,1"); if ($mail) { DB::query("DELETE FROM mail_queue WHERE id='{$mail[id]}'"); $_mail = new mail_content(); $_mail->address = $mail['to']; $_mail->subject = $mail['subject']; $_mail->message = $mail['content']; $sender = new mail_sender(); $sender->sendMail($_mail); } else { saveSetting('mail_queue', 0); } } } ================================================ FILE: system/class/db.php ================================================ curlink = $this->_dbconnect($_config['db']['server'].':'.$_config['db']['port'], $_config['db']['username'], $_config['db']['password'], 'utf8', $_config['db']['name'], $_config['db']['pconnect']); } function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) { $link = null; $func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect'; if (!$link = @$func($dbhost, $dbuser, $dbpw, 1)) { $this->halt('Couldn\'t connect to MySQL Server'); } else { $this->curlink = $link; if ($this->version() > '4.1') { $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : ''; $serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=\'\'') : ''; $serverset && mysql_query("SET $serverset", $link); } $dbname && @mysql_select_db($dbname, $link); } return $link; } function select_db($dbname) { return mysql_select_db($dbname, $this->curlink); } function fetch_array($query, $result_type = MYSQL_ASSOC) { return mysql_fetch_array($query, $result_type); } function fetch_first($sql) { return $this->fetch_array($this->query($sql)); } function result_first($sql) { return $this->result($this->query($sql), 0); } function query($sql, $type = '') { $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ? 'mysql_unbuffered_query' : 'mysql_query'; if (!$this->curlink) $this->connect(); if (!($query = $func($sql, $this->curlink))) { if ($type != 'SILENT') { $this->halt('MySQL Query ERROR', $sql); } } return $this->last_query = $query; } function affected_rows() { return mysql_affected_rows($this->curlink); } function error() { return (($this->curlink) ? mysql_error($this->curlink) : mysql_error()); } function errno() { return intval(($this->curlink) ? mysql_errno($this->curlink) : mysql_errno()); } function result($query, $row = 0) { $query = @mysql_result($query, $row); return $query; } function num_rows($query) { $query = mysql_num_rows($query); return $query; } function num_fields($query) { return mysql_num_fields($query); } function free_result($query) { return mysql_free_result($query); } function insert_id() { return ($id = mysql_insert_id($this->curlink)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0); } function fetch_row($query) { $query = mysql_fetch_row($query); return $query; } function fetch_fields($query) { return mysql_fetch_field($query); } function version() { if (empty($this->version)) { $this->version = mysql_get_server_info($this->curlink); } return $this->version; } function close() { return mysql_close($this->curlink); } function halt($message = '', $sql = '') { kerror::db_error($message, $sql); } function __destruct() { $this->close(); } } class db_mysqli { var $curlink; var $last_query; function connect() { global $_config; $this->curlink = $this->_dbconnect($_config['db']['server'].':'.$_config['db']['port'], $_config['db']['username'], $_config['db']['password'], 'utf8', $_config['db']['name'], $_config['db']['pconnect']); } function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) { $link = null; if (!$link = mysqli_connect($dbhost, $dbuser, $dbpw)) { $this->halt('Couldn\'t connect to MySQL Server'); } else { $this->curlink = $link; $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary,sql_mode=\'\'' : ''; $serverset && mysqli_query($link, "SET $serverset"); $dbname && @mysqli_select_db($link, $dbname); } return $link; } function select_db($dbname) { return mysqli_select_db($this->curlink, $dbname); } function fetch_array($query, $result_type = MYSQLI_ASSOC) { return mysqli_fetch_array($query, $result_type); } function fetch_first($sql) { return $this->fetch_array($this->query($sql)); } function result_first($sql) { return $this->result($this->query($sql), 0); } function query($sql, $type = '') { if (!$this->curlink) $this->connect(); if (!($query = mysqli_query($this->curlink, $sql))) { if ($type != 'SILENT') { $this->halt('MySQL Query ERROR', $sql); } } return $this->last_query = $query; } function affected_rows() { return mysqli_affected_rows($this->curlink); } function error() { return (($this->curlink) ? mysqli_error($this->curlink) : mysqli_error()); } function errno() { return intval(($this->curlink) ? mysqli_errno($this->curlink) : mysqli_errno()); } function result($query, $row = 0) { $query = mysqli_fetch_row($query)[$row]; return $query; } function num_rows($query) { $query = mysqli_num_rows($query); return $query; } function num_fields($query) { return mysqli_num_fields($query); } function free_result($query) { return mysqli_free_result($query); } function insert_id() { return ($id = mysqli_insert_id($this->curlink)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0); } function fetch_row($query) { $query = mysqli_fetch_row($query); return $query; } function fetch_fields($query) { return mysqli_fetch_field($query); } function version() { if (empty($this->version)) { $this->version = mysqli_get_server_info($this->curlink); } return $this->version; } function close() { return mysqli_close($this->curlink); } function halt($message = '', $sql = '') { kerror::db_error($message, $sql); } function __destruct() { $this->close(); } } class DB { public static function delete($table, $condition, $limit = 0, $unbuffered = true) { if (empty($condition)) { $where = '1'; } elseif (is_array($condition)) { $where = DB::implode_field_value($condition, ' AND '); } else { $where = $condition; } $sql = "DELETE FROM {$table} WHERE $where ".($limit ? "LIMIT $limit" : ''); return DB::query($sql, ($unbuffered ? 'UNBUFFERED' : '')); } public static function insert($table, $data, $return_insert_id = true, $replace = false, $silent = false) { $sql = DB::implode_field_value($data); $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO'; $silent = $silent ? 'SILENT' : ''; $return = DB::query("$cmd $table SET $sql", $silent); return $return_insert_id ? DB::insert_id() : $return; } public static function update($table, $data, $condition, $unbuffered = false, $low_priority = false) { $sql = DB::implode_field_value($data); $cmd = "UPDATE ".($low_priority ? 'LOW_PRIORITY' : ''); $where = ''; if (empty($condition)) { $where = '1'; } elseif (is_array($condition)) { $where = DB::implode_field_value($condition, ' AND '); } else { $where = $condition; } $res = DB::query("$cmd $table SET $sql WHERE $where", $unbuffered ? 'UNBUFFERED' : ''); return $res; } public static function implode_field_value($array, $glue = ',') { $sql = $comma = ''; foreach ($array as $k => $v) { $sql .= $comma."`$k`='$v'"; $comma = $glue; } return $sql; } public static function insert_id() { return DB::_execute('insert_id'); } public static function fetch($resourceid, $type = MYSQLI_ASSOC) { return DB::_execute('fetch_array', $resourceid, $type); } public static function fetch_first($sql) { return DB::_execute('fetch_first', $sql); } public static function fetch_all($sql) { $query = DB::_execute('query', $sql); $return = array(); while ($result = DB::fetch($query)) { $return[] = $result; } return $return; } public static function result($resourceid, $row = 0) { return DB::_execute('result', $resourceid, $row); } public static function result_first($sql) { return DB::_execute('result_first', $sql); } public static function query($sql, $type = '') { return DB::_execute('query', $sql, $type); } public static function num_rows($resourceid) { return DB::_execute('num_rows', $resourceid); } public static function affected_rows() { return DB::_execute('affected_rows'); } public static function free_result($query) { return DB::_execute('free_result', $query); } public static function error() { return DB::_execute('error'); } public static function errno() { return DB::_execute('errno'); } private static function _execute($cmd , $arg1 = '', $arg2 = '') { static $db; if (empty($db)) $db = &DB::object(); $res = $db->$cmd($arg1, $arg2); return $res; } public static function &object() { static $db; if (empty($db)) { if (function_exists('mysql_connect')) { $db = new db_mysql(); } else { $db = new db_mysqli(); } } return $db; } } ================================================ FILE: system/class/hook.php ================================================ version; if($version && $plugin['ver'] != $version){ if(method_exists($_PLUGIN['obj'][$pluginid], 'on_upgrade')){ $return_ver = $_PLUGIN['obj'][$pluginid]->on_upgrade($plugin['ver']); if($return_ver){ DB::query("UPDATE `plugin` SET `version`='{$return_ver}' WHERE name='{$pluginid}'"); }else{ DB::query("UPDATE `plugin` SET `version`='{$version}' WHERE name='{$pluginid}'"); } }else{ DB::query("UPDATE `plugin` SET `version`='{$version}' WHERE name='{$pluginid}'"); } // Reload cron scripts DB::query("DELETE FROM cron WHERE id LIKE '%".$pluginid."%'"); foreach($_PLUGIN['obj'][$pluginid]->modules as $module){ if($module['type'] == 'cron'){ DB::insert('cron', array_merge($module['cron'], array('nextrun' => TIMESTAMP)), false, true); } } CACHE::update('plugins'); } } foreach ($methods as $method) $_PLUGIN['hook'][$method][] = $pluginid; if(method_exists($_PLUGIN['obj'][$pluginid], 'getMethods')) $_PLUGIN['obj'][$pluginid]->modules = $_PLUGIN['obj'][$pluginid]->getMethods(); if(method_exists($_PLUGIN['obj'][$pluginid], 'getModules')) $_PLUGIN['obj'][$pluginid]->modules = $_PLUGIN['obj'][$pluginid]->getModules(); foreach ($_PLUGIN['obj'][$pluginid]->modules as $module) self::parse_module($module, $pluginid); } } } public static function parse_module($module, $pluginid){ global $_PLUGIN; switch ($module['type']){ case 'page': $_PLUGIN['page'][] = array( 'id' => "{$pluginid}-{$module[id]}", 'title' => $module['title'], 'file' => ROOT."./plugins/{$pluginid}/".$module['file'], 'admin' => $module['admin'], ); break; case 'shortcut': $_PLUGIN['shortcut'][] = array( 'title' => $module['title'], 'link' => $module['link'], 'admin' => $module['admin'], ); break; case 'cron': break; default: throw new Exception('Unknown module type: '.$module['type']); } } public static function page_menu(){ global $_PLUGIN, $uid; if($_PLUGIN['page']){ foreach ($_PLUGIN['page'] as $page){ if($page['admin'] && !is_admin($uid)) continue; echo "PHP Debug
'; echo '| No. | File | Line | Code |
| '.$k.' | '; echo ''.$msg['file'].' | '; echo ''.$msg['line'].' | '; echo ''.$msg['function'].' | '; echo '
您共计关注了 {$count} 个贴吧,
管理员限制了每位用户最多关注 {$limit} 个贴吧
", './#liked_tieba'); } } $my_tieba = array(); $query = DB::query("SELECT name, fid, tid FROM my_tieba WHERE uid='{$uid}'"); while($r = DB::fetch($query)) { $my_tieba[$r['name']] = $r; } foreach($liked_tieba as $tieba){ if($my_tieba[$tieba['name']]){ unset($my_tieba[$tieba['name']]); if(!$my_tieba[$tieba['name']]['fid']) DB::update('my_tieba', array( 'fid' => $tieba['fid'], ), array( 'uid' => $uid, 'name' => $tieba['name'], ), true); continue; }else{ DB::insert('my_tieba', array( 'uid' => $uid, 'fid' => $tieba['fid'], 'name' => $tieba['name'], 'unicode_name' => $tieba['uname'], ), false, true, true); $insert++; } } DB::query("INSERT IGNORE INTO sign_log (tid, uid, `date`) SELECT tid, uid, '{$date}' FROM my_tieba"); if($my_tieba && $allow_deletion){ $tieba_ids = array(); foreach($my_tieba as $tieba){ $tieba_ids[] = $tieba['tid']; } $str = "'".implode("', '", $tieba_ids)."'"; $deleted = count($my_tieba); DB::query("DELETE FROM my_tieba WHERE uid='{$uid}' AND tid IN ({$str})"); DB::query("DELETE FROM sign_log WHERE uid='{$uid}' AND tid IN ({$str})"); } return array($insert, $deleted); } function _client_sign($uid, $tieba){ $cookie = get_cookie($uid); preg_match('/BDUSS=([^ ;]+);/i', $cookie, $matches); $BDUSS = trim($matches[1]); if(!$BDUSS) return array(-1, '找不到 BDUSS Cookie', 0); $ch = curl_init('http://c.tieba.baidu.com/c/c/forum/sign'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'User-Agent: Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE72-1/021.021; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.1.16352')); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); $array = array( 'BDUSS' => $BDUSS, '_client_id' => '03-00-DA-59-05-00-72-96-06-00-01-00-04-00-4C-43-01-00-34-F4-02-00-BC-25-09-00-4E-36', '_client_type' => '4', '_client_version' => '1.2.1.17', '_phone_imei' => '540b43b59d21b7a4824e1fd31b08e9a6', 'fid' => $tieba['fid'], 'kw' => urldecode($tieba['unicode_name']), 'net_type' => '3', 'tbs' => get_tbs($uid), ); $sign_str = ''; foreach($array as $k=>$v) $sign_str .= $k.'='.$v; $sign = strtoupper(md5($sign_str.'tiebaclient!!!')); $array['sign'] = $sign; curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array)); $sign_json = curl_exec($ch); curl_close($ch); $res = @json_decode($sign_json, true); if(!$res) return array(1, 'JSON 解析错误', 0); if($res['user_info']){ $exp = $res['user_info']['sign_bonus_point']; return array(2, "签到成功,经验值上升 {$exp}", $exp); }else{ switch($res['error_code']){ case '340010': // 已经签过 case '160002': case '3': return array(2, $res['error_msg'], 0); case '1': // 未登录 return array(-1, "ERROR-{$res[error_code]}: ".$res['error_msg'].' (Cookie 过期或不正确)', 0); case '160004': // 不支持 return array(-1, "ERROR-{$res[error_code]}: ".$res['error_msg'], 0); case '160003': // 零点 稍后再试 case '160008': // 太快了 return array(1, "ERROR-{$res[error_code]}: ".$res['error_msg'], 0); default: return array(1, "ERROR-{$res[error_code]}: ".$res['error_msg'], 0); } } } function _client_sign_old($uid, $tieba){ $cookie = get_cookie($uid); preg_match('/BDUSS=([^ ;]+);/i', $cookie, $matches); $BDUSS = trim($matches[1]); if(!$BDUSS) return array(-1, '找不到 BDUSS Cookie', 0); $ch = curl_init('http://c.tieba.baidu.com/c/c/forum/sign'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'User-Agent: BaiduTieba for Android 5.1.3', 'client_user_token: '.random(6, true))); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); $array = array( 'BDUSS' => $BDUSS, '_client_id' => 'wappc_138'.random(10, true).'_'.random(3, true), '_client_type' => '2', '_client_version' => '5.1.3', '_phone_imei' => md5(random(16, true)), 'cuid' => strtoupper(md5(random(16))).'|'.random(15, true), 'fid' => $tieba['fid'], 'from' => 'tieba', 'kw' => urldecode($tieba['unicode_name']), 'model' => 'Aries', 'net_type' => '3', 'stErrorNums' => '0', 'stMethod' => '1', 'stMode' => '1', 'stSize' => random(5, true), 'stTime' => random(4, true), 'stTimesNum' => '0', 'tbs' => get_tbs($uid), 'timestamp' => time().rand(1000, 9999), ); $sign_str = ''; foreach($array as $k=>$v) $sign_str .= $k.'='.$v; $sign = strtoupper(md5($sign_str.'tiebaclient!!!')); $array['sign'] = $sign; curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array)); $sign_json = curl_exec($ch); curl_close($ch); $res = @json_decode($sign_json, true); if(!$res) return array(1, 'JSON 解析错误', 0); if($res['user_info']){ $exp = $res['user_info']['sign_bonus_point']; return array(2, "签到成功,经验值上升 {$exp}", $exp); }else{ switch($res['error_code']){ case '340010': // 已经签过 case '160002': case '3': return array(2, $res['error_msg'], 0); case '1': // 未登录 return array(-1, "ERROR-{$res[error_code]}: ".$res['error_msg'].' (Cookie 过期或不正确)', 0); case '160004': // 不支持 return array(-1, "ERROR-{$res[error_code]}: ".$res['error_msg'], 0); case '160003': // 零点 稍后再试 case '160008': // 太快了 return array(1, "ERROR-{$res[error_code]}: ".$res['error_msg'], 0); default: return array(1, "ERROR-{$res[error_code]}: ".$res['error_msg'], 0); } } } function _zhidao_sign($uid){ $ch = curl_init('http://zhidao.baidu.com/submit/user'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIE, get_cookie($uid)); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'cm=100509&t='.TIMESTAMP); $result = curl_exec($ch); curl_close($ch); return @json_decode($result); } function _wenku_sign($uid){ $ch = curl_init('http://wenku.baidu.com/task/submit/signin'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 BIDUBrowser/2.x Safari/537.31')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIE, get_cookie($uid)); $result = curl_exec($ch); curl_close($ch); return @json_decode($result); } ================================================ FILE: system/function/updater/1.13.php ================================================首次加载需要较长时间,请您耐心等待.
jQuery 加载完成前,您暂时无法操作本页面.
如果您长时间停留在此页面,请手动刷新网页.
| UID | 用户名 | 邮箱 | 操作 |
| UID | 用户名 | 已成功 | 已跳过 | 待签到 | 待重试 | 不支持 |
此功能用于向本站已经注册的所有用户发送邮件公告
为避免用户反感,建议您不要经常发送邮件
安装相关插件能够增强 贴吧签到助手 的相关功能.(部分插件可能会影响系统运行效率)
插件的设计可以参考 Github 上的项目介绍.
将插件文件放到 /plugins/ 文件夹下即可在此处看到对应的插件程序.
如果你觉得某个插件有问题,你可以先尝试禁用它,禁用操作不会丢失数据.
插件下载: http://www.kookxiang.com/forum-addon-1.html
| # | 插件标识符 (ID) | 插件介绍 | 当前版本 | 操作 |
这里显示了当前安装的所有模板,你可以选择一个作为 贴吧签到助手 的模板显示.
将模板文件放到 /template/ 文件夹下即可在此处看到对应的模板.
模板的设计教程与下载可以访问: http://www.kookxiang.com/forum-addon-1.html
此功能将联网更新您的贴吧签到助手. 升级过程采用差量升级的方式.
升级过程需要保证文件被更新的文件可读可写.
如果更新过程出现错误,您可以到 http://buildbot.ikk.me/#sign 下载最新完整包进行覆盖
当前分支:稳定版 (切换到开发版)
'; } ?>开发版拥有更快的更新速度,但同时也拥有一定的不稳定性.
正在检查更新...
贴吧签到助手 - Designed by kookxiang. 2013-2016 © KK's Laboratory - 赞助开发
首次加载需要较长时间,请您耐心等待.
jQuery 加载完成前,您暂时无法操作本页面.
如果您长时间停留在此页面,请手动刷新网页.
贴吧签到助手 - Designed by kookxiang. 2013-2016 © KK's Laboratory - 赞助开发
'.getSetting('beian_no').' - '; ?>
确定要切换到开发版么?
开发版具有一定的不稳定性,且有可能无法切换回稳定版
'); }); $('#switch_to_stable').click(function(){ switch_channel('stable', '确定要切换到稳定版么?
如果开发版版本号与稳定版不同,可能导致系统无法使用。
切换前请慎重考虑!
To avoid the abuse of these tools, this dialog has been written in English.
'; contents += 'These tools are more helpful is you are a professional user.
'; contents += 'Some of these fetures may be harmful to your site, and we DON\'T take any responsibility. please comfirm you\'d read this.
'; contents += ''; fwin.setTitle('Enable Advanced Fetures?').setContent(contents).addCloseButton('Dismiss').append(); } }); $('#reset_failure_all').click(function(){ createWindow().setTitle("全部重置").setContent('你确定要重置所有用户无法签到的贴吧吗?这将消耗大量服务器资源').addButton("确定", function(){msg_callback_action('admin.php?action=reset_failure&formhash='+formhash,load_stat);}).addCloseButton("取消").append(); }); $('#mail_advanced_config').click(function(){ post_win($('#mail_setting').attr('action'), 'mail_setting', function(){ showloading(); $.getJSON("admin.php?action=mail_advanced", function(result){ if(!result) return; var content = ''; for(var i=0; i'; content += ''; content += '
'; } if(result.length == 0){ content += '此邮件接口无高级设置项目
'; } createWindow().setTitle('邮件高级设置').setContent('').addButton('确定', function(){ $('#advanced_mail_config').submit(); }).addCloseButton('取消').append(); }).fail(function() { createWindow().setTitle('邮件高级设置').setContent('发生未知错误: 无法打开高级设置面板').addCloseButton('确定').append(); }).always(function(){ hideloading(); }); }, true); return false; }); $('.menubtn').click(function(){ $('.sidebar').fadeIn(); autohide_sidebar(); }); $(window).on('hashchange', function() { parse_hash(); }); hideloading(); while(location.hash.lastIndexOf('#') > 0) location.hash = location.hash.substring(0, location.hash.lastIndexOf('#')); parse_hash(); }); function load_user(){ showloading(); $.getJSON("admin.php?action=load_user", function(result){ if(!result) return; $('#content-user table tbody').html(''); $.each(result, function(i, field){ $("#content-user table tbody").append("确定要安装这个插件吗?
').addButton('确定', function(){ msg_callback_action(link, load_plugin); }).addCloseButton('取消').append(); return false; }); $('.link_uninstall').click(function(){ var link = this.href; createWindow().setTitle('卸载插件').setContent('确定要卸载这个插件吗?
(卸载后该插件的数据可能会丢失)
').addButton('确定', function(){ msg_callback_action(link, load_plugin); }).addCloseButton('取消').append(); return false; }); $('.link_config').click(function(){ var link = this.href; showloading(); $.getJSON(link, function(result){ createWindow().setTitle('插件设置').setContent('').addButton('确定', function(){ $('#plugin_config').submit(); }).addCloseButton('取消').append(); }).fail(function() { createWindow().setTitle('插件设置').setContent('发生未知错误: 无法打开插件设置面板').addCloseButton('确定').append(); }).always(function(){ hideloading(); }); return false; }); }).fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法获取插件列表').addCloseButton('确定').append(); }).always(function(){ hideloading(); }); } function load_template(){ showloading(); $.getJSON("admin.php?action=load_template", function(result){ if(!result) return; $('#content-template .template-list').html(''); $.each(result, function(i, field){ var content = ''+field.name+'
感谢本模板作者 '+obj.attr('author')+'
'; var tipsWindow = createWindow().setTitle(title).setContent(tips); if (current) tipsWindow.addCloseButton('关闭'); else tipsWindow.addButton('使用此模板', function(){ msg_redirect_action("admin.php?action=set_template&template="+obj.attr('templateid')+"&formhash="+formhash); }).addCloseButton('关闭'); tipsWindow.append(); }); }).fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法获取模板列表').addCloseButton('确定').append(); }).always(function(){ hideloading(); }); } function parse_hash(){ var hash = location.hash.substring(1); if(hash.indexOf('#') >= 0){ location.href = location.href.substring(0, location.href.lastIndexOf('#')); location.reload(); return; } if(hash == "user"){ $('#menu_user').click(); }else if(hash == "stat"){ $('#menu_stat').click(); }else if(hash == "setting"){ $('#menu_setting').click(); }else if(hash == "mail"){ $('#menu_mail').click(); }else if(hash == "plugin"){ $('#menu_plugin').click(); }else if(hash == "template"){ $('#menu_template').click(); }else if(hash == "cron"){ $('#menu_cron').click(); }else if(hash == "updater"){ $('#menu_updater').click(); }else{ $('#menu_user').click(); } } function deluser(uid){ createWindow().setTitle('删除用户').setContent('确认要删除该用户吗?').addButton('确定', function(){ msg_win_action("admin.php?action=deluser&uid="+uid+"&formhash="+formhash); }).addCloseButton('取消').append(); return false; } function autohide_sidebar(){ if($(".sidebar:hover").length > 0) return setTimeout(autohide_sidebar, 500); if($(".menubtn:hover").length > 0) return setTimeout(autohide_sidebar, 500); $('.sidebar').fadeOut(); } function isMobile(){ return $('body').width() <= 550; } function eNaBlEaFcHeCk(obj, fwin_id){ obj.value = obj.value.toUpperCase(); if(bin2hex(obj.value) != '454e41424c4520414456414e4345442046455455524553') return; location.href = 'admin.php?action=eNaBlEaFc&hash='+bin2hex(obj.value).split('').reverse().join('')+'&formhash='+formhash; FWIN[fwin_id].close(); } function bin2hex(s) { var i, l, o = '', n; s += ''; for (i = 0, l = s.length; i < l; i++) { n = s.charCodeAt(i).toString(16); o += n.length < 2 ? '0' + n : n; } return o; } ================================================ FILE: template/default/js/fwin.js ================================================ var fwin_id = 1; var FWIN = []; function createWindow(){ var win = new Object(); FWIN[fwin_id] = win; win.id = fwin_id++; win.obj = document.createElement('div'); win.obj.className = 'fwin'; win.obj.id = 'fwin_' + win.id; win.title = '提示信息'; win.content = 'null'; win.btns = document.createElement('p'); win.btns.className = 'btns'; win.with_cover = true; win.setTitle = function(str){ this.title = str; return this; } win.setContent = function(str){ this.content = str; return this; } win.addButton = function(title, callback, buttonClass){ var btn = document.createElement('button'); btn.className = typeof buttonClass == 'undefined' ? "btn submit" : buttonClass; btn.innerHTML = title; btn.onclick = function(){ callback(); win.close(); } this.btns.appendChild(btn); return this; } win.addCloseButton = function(title){ var btn = document.createElement('button'); btn.className = "btn"; btn.innerHTML = title; btn.onclick = function(){ win.close(); } this.btns.appendChild(btn); return this; } win.append = function(){ var win_title = document.createElement('h3'); win_title.innerHTML = this.title; var obj = this.obj; win_title.onmousedown = function(event){ try{ dragMenu(obj, event, 1); }catch(e){} }; win_title.unselectable = true; this.obj.appendChild(win_title); var win_content = document.createElement('div'); win_content.className = 'fcontent'; win_content.innerHTML = this.content; this.obj.appendChild(win_content); if (this.btns.innerHTML) { this.obj.appendChild(this.btns); } $('#append_parent').append(this.obj); var top = (document.body.clientHeight - this.obj.clientHeight) / 2; var left = (document.body.clientWidth - this.obj.clientWidth) / 2; this.obj.style.top = top + 'px'; this.obj.style.left = left + 'px'; if(this.with_cover){ $('.wrapper').addClass('blur'); showcover(); } return false; } win.close = function(){ if(this.with_cover) hidecover(); win.obj.className = 'fwin h'; $('.wrapper').removeClass('blur'); setTimeout(function(){ $(win.obj).remove(); }, 300); } return win; } function msg_win_action(link){ link += link.indexOf('?') < 0 ? '?' : '&'; link += "format=json"; showloading(); $.getJSON(link, function(result){ createWindow().setTitle('系统消息').setContent(result.msg).addCloseButton('确定').append(); }).fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法解析返回结果').addButton('确定', function(){ location.reload(); }).append(); }).always(function(){ hideloading(); }); return false; } function msg_redirect_action(link){ link += link.indexOf('?') < 0 ? '?' : '&'; link += "format=json"; showloading(); $.getJSON(link, function(result){ createWindow().setTitle('系统消息').setContent(result.msg).addButton('确定', function(){ location.href = result.redirect; }).append(); }).fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法解析返回结果').addButton('确定', function(){ location.reload(); }).append(); }).always(function(){ hideloading(); }); return false; } function msg_callback_action(link, callback){ link += link.indexOf('?') < 0 ? '?' : '&'; link += "format=json"; showloading(); $.getJSON(link, function(result){ createWindow().setTitle('系统消息').setContent(result.msg).addButton('确定', function(){ callback(); }).append(); }).fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法解析返回结果').addButton('确定', function(){ location.reload(); }).append(); }).always(function(){ hideloading(); }); return false; } function upgrade_tips(){ createWindow().setTitle('系统更新').setContent('检测到有新的版本可用,现在更新吗?').addButton('现在更新', function(){ location.href='admin.php#updater'; }).addButton('稍后再说', function(){ $.get('index.php?ignore_update=yes'); }, 'btn').append(); } var loading_timer, cover_timer; function showloading(){ if(loading_timer) clearTimeout(loading_timer); $('.loading-icon').removeClass('h'); $('.loading-icon').removeClass('hidden'); } function hideloading(){ if(loading_timer) clearTimeout(loading_timer); $('.loading-icon').removeClass('h'); $('.loading-icon').addClass('h'); loading_timer = setTimeout(function(){ $('.loading-icon').addClass('hidden'); }, 250); } function showcover(){ if(cover_timer) clearTimeout(cover_timer); $('.cover').removeClass('h'); $('.cover').removeClass('hidden'); } function hidecover(){ if(cover_timer) clearTimeout(cover_timer); $('.cover').removeClass('h'); $('.cover').addClass('h'); cover_timer = setTimeout(function(){ $('.cover').addClass('hidden'); }, 1000); } function post_win(link, formid, callback, skip_win){ link += link.indexOf('?') < 0 ? '?' : '&'; link += "format=json"; showloading(); $.post(link, $('#'+formid).serialize(), function(result){ if(!callback && result.redirect) callback = function(){ location.href = result.redirect; } if(skip_win) return callback(); var win = createWindow().setTitle('系统消息').setContent(result.msg); if(callback){ win.addButton('确定', callback); }else{ win.addCloseButton('确定'); } win.append(); }, 'json').fail(function() { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法解析返回结果').addButton('确定', function(){ location.reload(); }).append(); }).always(function(){ hideloading(); }); return false; } var JSMENU = []; function dragMenu(menuObj, e, op) { e = e ? e : window.event; if(op == 1) { JSMENU['drag'] = [e.clientX, e.clientY]; JSMENU['drag'][2] = parseInt(menuObj.style.left); JSMENU['drag'][3] = parseInt(menuObj.style.top); document.onmousemove = function(e) { try{dragMenu(menuObj, e, 2); }catch(err){} }; document.onmouseup = function(e) { try{dragMenu(menuObj, e, 3); }catch(err){} }; }else if(op == 2 && JSMENU['drag'][0]) { var menudragnow = [e.clientX, e.clientY]; menuObj.style.left = (JSMENU['drag'][2] + menudragnow[0] - JSMENU['drag'][0]) + 'px'; menuObj.style.top = (JSMENU['drag'][3] + menudragnow[1] - JSMENU['drag'][1]) + 'px'; menuObj.removeAttribute('top_'); menuObj.removeAttribute('left_'); }else if(op == 3) { JSMENU['drag'] = []; document.onmousemove = null; document.onmouseup = null; } return false; } ================================================ FILE: template/default/js/kk_dropdown.js ================================================ // KK Drop-down menu (function(){ function open_menu(obj){ var menuid = 'dropdown_' + obj.getAttribute('menu-id'); if(!document.getElementById(menuid)) return false; obj.hover = true; document.getElementById(menuid).onmouseover = function(){ obj.hover = true; }; document.getElementById(menuid).onmouseout = function(){ obj.hover = false; }; document.getElementById(menuid).style.display = 'block'; document.getElementById(menuid).style.top = obj.offsetTop + obj.offsetHeight + 'px'; var left = obj.offsetLeft + obj.offsetWidth - document.getElementById(menuid).offsetWidth; if(left <= 0){ document.getElementById(menuid).style.left = obj.offsetLeft - 5 + 'px'; }else{ document.getElementById(menuid).style.left = left + 'px'; } close_menu(obj); } function close_menu(obj, force){ var menuid = 'dropdown_' + obj.getAttribute('menu-id'); if(!document.getElementById(menuid)) return false; if(!force && (document.getElementById(menuid).hover || obj.hover)){ setTimeout(function(){ close_menu(obj); }, 100); }else{ document.getElementById(menuid).style.display = 'none'; } } var selects = document.getElementsByTagName('select'); var select; for(i in selects){ select_obj = selects[i]; if(typeof select_obj != 'object') continue; if(select_obj.inited) continue; select_obj.inited = true; select_obj.style.display = 'none'; var dropdown_obj = document.createElement('ul'); dropdown_obj.id = 'dropdown_' + i; dropdown_obj.className = 'dropdown'; dropdown_obj.obj = select_obj; var select_replacer = document.createElement('div'); dropdown_obj.replacer = select_replacer; select_obj.replacer = select_replacer; select_replacer.className = 'select'; select_replacer.setAttribute("menu-id", i); select_replacer.obj = select_obj; var value_obj = document.createElement('span'); select_replacer.value = value_obj; select_replacer.appendChild(value_obj); var icon_down = document.createElement('span'); icon_down.className = "icon"; icon_down.innerText = '▼'; select_replacer.appendChild(icon_down); for(var o=0; o百度通行证:' + result.data.user_name_show + '
'); $('.tab-binded div').append('安全手机:' + result.data.mobilephone + '
'); $('.tab-binded div').append('安全邮箱:' + result.data.email + '
'); } else { $('#content-baidu_bind .tab-bind').removeClass('hidden'); } }).fail(function () { createWindow().setTitle('系统错误').setContent('发生未知错误: 无法获取绑定状态').addButton('确定', function () { location.reload(); }).append(); }).always(function () { hideloading(); }); } function _status(status) { if (typeof status == 'undefined') status = 0; status = parseInt(status); stat[(status + 2)]++; if (isMobile()) { switch (status) { case -2: return '
';
case -1:
return '
';
case 0:
return '
';
case 1:
return '
';
case 2:
return '
';
}
} else {
switch (status) {
case -2:
return '跳过签到';
case -1:
return '无法签到';
case 0:
return '待签到';
case 1:
return '签到失败';
case 2:
return '已签到';
}
}
}
function _exp(exp) {
if (typeof exp == 'undefined') exp = 0;
return parseInt(exp) == 0 ? '-' : '+' + exp;
}
function parse_hash() {
var hash = location.hash.substring(1);
if (hash.indexOf('#') >= 0) {
location.href = location.href.substring(0, location.href.lastIndexOf('#'));
location.reload();
return;
}
if (hash == "guide") {
$('#menu_guide').click();
} else if (hash == "liked_tieba") {
guide_viewed = true;
$('#menu_liked_tieba').click();
} else if (hash == "sign_log") {
$('#menu_sign_log').click();
} else if (hash == "baidu_bind") {
$('#menu_baidu_bind').click();
} else if (hash == "setting") {
$('#menu_setting').click();
} else if (hash.split('-')[0] == "history") {
load_sign_history(hash.split('-')[1]);
} else if ($('#menu_' + hash).length > 0) {
$('#menu_' + hash).click();
} else {
$('#menu_sign_log').click();
}
}
function autohide_membermenu() {
if ($("#member-menu:hover").length > 0) return setTimeout(autohide_membermenu, 500);
if ($(".avatar:hover").length > 0) return setTimeout(autohide_membermenu, 500);
$('#member-menu').fadeOut(300);
}
function autohide_sidebar() {
if ($(".sidebar:hover").length > 0) return setTimeout(autohide_sidebar, 500);
if ($(".menubtn:hover").length > 0) return setTimeout(autohide_sidebar, 500);
$('.sidebar').fadeOut();
}
function isMobile() {
return $('body').width() <= 550;
}
function load_js() {
for (id in defered_js) {
var script;
script = document.createElement('script');
script.type = 'text/javascript';
script.src = defered_js[id] + '?' + Math.random();
document.getElementsByTagName('head')[0].appendChild(script);
}
}
function loadTiebaAutoComplete() {
if (typeof localStorage == 'undefined') return;
if (!localStorage['tieba_name']) return;
$('#autocomplete-tieba').remove();
$('#append_parent').append('');
var tieba = localStorage['tieba_name'].split('||');
if (tieba.length == 0) return;
for (var i = 0; i < tieba.length; i++) {
$('#autocomplete-tieba').append('