误删了phpwind下data-bbscache怎么办?

今天手残,把上述文件夹给删了,而缺没有备份,网页直接打不开了 网上的回答五花八门,有登陆后台重建缓存的,有分析install.php重建文件夹的。。。各种无语啊 还是自己想的办法好: 自己在本地重建建立一个一模一样的phpwind,然后把生成的bbscache文件夹覆盖回去即可! 难点在于如何搭建一模一样的phpwind,主要是数据库的用户名密码和域名,还有后台管理的用户名密码,讲一下步骤: 先在host里绑定域名www.abc.com到127.0.0.2 在Apache或其他服务器新建虚拟主机127.0.0.2,别名设为www.abc.com 把俺炸U那个文件拷贝进去,安装吧~

June 22, 2014 · 1 min · Me

Shell中各种奇怪的变量

这些变量是随系统运行而变化的,灵活使这些变量可简化我们的操作和更好地控制bash shell的行为。 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

June 18, 2014 · 1 min · Me

使用python模拟登陆腾讯微博

由于业务需要,研究了一下腾讯微博等登陆,下面分享一些经验给大家: 标题写的是腾讯微博的登陆,其实也可以隐身到腾讯旗下多个产品的登陆,比如QQ空间,webQQ等,想到这儿大伙是不是很激动呢? [TOC] 表急,等我细细道来。 数据采集 有时候简单的数据不需要这么大费周折!使用某些语言自带的web工具也是可以的!下面我以Python为例: 分析登录过程 登录过程需要抓包,我是用的HttpWatch,大体步骤如下 第一步 手动登陆,抓包,记录登录过程 当输入完账号后想服务器请求验证码 等级登陆按钮后将登录信息发送至认证服务器,实现第一次认证 服务器返回登陆成功信息,其中包含最终URL 第二次认证,获取腾讯微博的cookie 第二步 伪造登录过程 获取验证码 根据验证码计算出加密后的密码以及其他信息,发送GET请求至认证服务器 根据返回URL获取最终cookie 工作难点 本文假设读者理解http协议及数据包的发送原理,以此为基础,工作的难点就集中在数据的准备上。 密码的加密原理 cookie的处理 header的UA及refer的一致性 密码加密算法 以下提取自登录页面的c_login_2.js文件 function getEncryption(password, uin, vcode) { var str1 = hexchar2bin(md5(password)); var str2 = md5(str1 + uin); var str3 = md5(str2 + vcode.toUpperCase()); return str3 } if (b == "login") { d.u = encodeURIComponent(pt.plogin.at_accout); d.verifycode = $("verifycode").value; if (pt.plogin.needShowNewVc && pt....

June 16, 2014 · 1 min · Me

mysql的多表删除

mysql默认是禁用多表删除语句的,之前的做法都是先把条件缓存,然后逐条执行 delete from a where a.xxx in (123123,123123); delete from b where b.xxxx in (123123,123123); 如果写成下面这种绝对是错误的! delete * from a,b where xxxx in ... 今天突然发现原来mysql也是可以一条sql删除多表数据的,下面来分析一下 多表删除其实思路还是比较简单的,首先条件就是多个表(一般就两个表,织梦的文章信息存在3个表里,删除起来很麻烦)有关联 其次,删除条件一般都是由关联的这一行组成的,也可能不是,没有关系,我们先写一个试试: DELETE p.*, pp.* FROM pw_threads p, pw_tmsgs pp WHERE p.tid = pp.tid AND p.tid in(SELECT tid FROM pw_threads WHERE postdate>UNIX_TIMESTAMP('2014-06-12 00:00:00') and fid=136) 逻辑都通着,但是会报错 You can’t specify target table ‘A’ for update in FROM clause 原因是: In general, you cannot modify a table and select from the same table in a subquery....

June 12, 2014 · 1 min · Me

记一次goagent的设置

##下载 项目地址: https://github.com/goagent/goagent APP配置 到https://appengine.google.com/新建一个或多个app,注意记录下app的ID! 一个appid每天只有1G的流量 上传服务器端脚本 解压至某文件夹,此处假设为d:\app\goagent318\,然后进去server,运行uploader.bat批处理 按提示输入信息即可,可能会很慢。 多个appid请用’|’隔开,即回车键上面那个 貌似现在一个帐号能创建25个app,每天25G流量,够用了吧? 只要在服务器上部署成功,以后就不用管server文件夹了 :-D ,除非你又要添加新的app才会用到! 此步骤只是把goagent的服务器端部署到你的在线APP上,等待你去调用他,所以下一步就是配置本地的文件,以实现对接。 部署成功的标志是看到这里的https://appengine.google.com/应用都在running即可! 本地配置 难点在这一步,废话比较多,我就粘贴一下官网的教程吧 编辑local\proxy.ini,把其中appid = goagent中的goagent 改成你之前申请的应用的appid (用windows的记事本也可以) 如果要使用多个appid,appid之间用|隔开,如:appid1|appid2|appid3,每个appid必须确认上传成功才能使用 格式 如下: [gae] appid = app-0|app-1|app-3|app-4 运行local下的goagent.exe,测试一下配置是否成功!推荐迅雷的代理测试 高级技巧 修改goagent端口 你可以修改端口以达到分流的作用,比如,使用默认8087端口上网用,再建一个使用8089端口的goagent,然后使用这个端口下载东西或者什么的,只要端口不冲突,你就可以建立多个代理,以达到分流的目的! 怎么修改呢? 先结束goagent进程,复制一份出来命名goagent318-d,原来的那个叫goagent318-w,d means download,w means web! 还是修改那个proxy.ini,找到[listen],应该在第一行,然后修改port = 8087为port = 8089,端口就改好了 讲appid按需分配给各个端口对应的程序,如我有十个app,给迅雷分5个,web分4个,再留一个备用! 在chrome中使用goagent 这个要用到SwitchySharp,怎么使用,自己百度吧! goagent的GUI版本 这个挺不错的,方便小白使用,推荐下载绿色版! 围观地址:https://goagent.codeplex.com/ 打造自己的网页代理 这个比较酷!不适用google,而是使用自己的网站做代理!只要你的主机在香港或者美国,就可以用PHP模拟成goagent的server端,然后就可以翻越GFW了 设置方法请参考 http://www.blogfeng.com/goagent-space-into-a-proxy-server-for-php.html 2015年1月12日更新: 更新项目地址 fqrouter2已经停止更新 更好的翻墙方案 shadowsocks

June 10, 2014 · 1 min · Me

用Python写了个日志清理的脚本

欢迎吐槽! #! /usr/bin/env python # -*- coding: utf-8 -*- import os,time,shutil path = os.getcwd() target_dir = [] cal = [] target_dir.append('/var/lib/mysql/log/') target_dir.append('/newlogs/') target_dir.append('/oldlogs/') #初始化删除文件名 del_ext = ['frm','MYD','MYI'] #你要保留几天 days_before = 5 #初始化删除日期 for x in xrange(days_before+1,days_before+30): cal.append(time.strftime('%Y_%m_%d',time.localtime(time.time() - x*24*3600))) #初始化删除文件名,使用笛卡尔积! fl = map('.'.join, [[x,y] for x in cal for y in del_ext]) #以日期命名的文件夹 cal = [] for x in xrange(days_before+1,days_before+30): cal.append(time.strftime('%Y-%m-%d',time.localtime(time.time() - x*24*3600))) fl += cal #获取文件扩展名 def get_ext(filename): return filename....

June 10, 2014 · 1 min · Me

python时间函数整理

有一些是拷的,自己加了一点,大家凑活看吧 #-*- coding:utf-8 -*- import time import datetime #in python is float while in php is int currenttime = 1402244512.48 print time.time() print time.ctime() print time.ctime(currenttime) print time.localtime() print type(time.localtime()) print time.strftime('%Y-%m-%d',time.localtime(time.time()-3600*24)) print time.strftime('%Y-%m-%d %H:%I:%S',time.localtime(time.time())) print time.strftime('%Y-%m-%d %H:%I:%S',time.gmtime(time.time())) currentstr = '2013-08-21 17:05:01' print time.strptime(currentstr,'%Y-%m-%d %H:%I:%S') ''' python中时间日期格式化符号: %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数(00=59) %S 秒(00-59) %a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %j 年内的一天(001-366) %p 本地A....

June 9, 2014 · 1 min · Me

Python标准库urllib2的使用细节

以下转自 http://blog.csdn.net/pleasecallmewhy/article/details/8925978 [TOC] Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库。这里总结了一些 urllib2 的使用细节。 Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用下面的方式 import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'}) null_proxy_handler = urllib2.ProxyHandler({}) if enable_proxy: opener = urllib2.build_opener(proxy_handler) else: opener = urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener) 这里要注意的一个细节,使用 urllib2.install_opener() 会设置 urllib2 的全局 opener 。这样后面的使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的 Proxy 设置等。比较好的做法是不使用 install_opener 去更改全局的设置,而只是直接调用 opener 的 open 方法代替全局的 urlopen 方法。 Timeout 设置 在老版 Python 中,urllib2 的 API 并没有暴露 Timeout 的设置,要设置 Timeout 值,只能更改 Socket 的全局 Timeout 值。...

June 5, 2014 · 2 min · Me

http_build_query妙用

http_build_query这个函数可以很方便的构造一个请求所需要的参数。(不分GET,POST) 这个函数可以把一个数组转化为一串字符 栗子1: <?php $data = array('foo'=>'bar', 'baz'=>'boom', 'cow'=>'milk', 'php'=>'hypertext processor'); //第二个参数是分割使用的符号 echo http_build_query($data) . "\n"; echo http_build_query($data, '', '&amp;'); # foo=bar&baz=boom&cow=milk&php=hypertext+processor # foo=bar&amp;baz=boom&amp;cow=milk&amp;php=hypertext+processor ?> 栗子二: <?php $data = array('user'=>array('name'=>'Bob Smith', 'age'=>47, 'sex'=>'M', 'dob'=>'5/12/1956'), 'pastimes'=>array('golf', 'opera', 'poker', 'rap'), 'children'=>array('bobby'=>array('age'=>12, 'sex'=>'M'), 'sally'=>array('age'=>8, 'sex'=>'F')), 'CEO'); //第二个参数,如果数组没有键值,则自动添加键值 echo http_build_query($data, 'flags_'); ?> 输出: user%5Bname%5D=Bob+Smith&user%5Bage%5D=47&user%5Bsex%5D=M&user%5Bdob%5D=5%2F12%2F1956&pastimes%5B0%5D=golf&pastimes%5B1%5D=opera&pastimes%5B2%5D=poker&pastimes%5B3%5D=rap&children%5Bbobby%5D%5Bage%5D=12&children%5Bbobby%5D%5Bsex%5D=M&children%5Bsally%5D%5Bage%5D=8&children%5Bsally%5D%5Bsex%5D=F&flags_0=CEO 把上面的请求传给一个PHP文件处理,打印传递来的参数,会得到以下结果: Array ( [_GET] => Array ( [user] => Array ( [name] => Bob Smith [age] => 47 [sex] => M [dob] => 5/12/1956 ) [pastimes] => Array ( [0] => golf [1] => opera [2] => poker [3] => rap ) [children] => Array ( [bobby] => Array ( [age] => 12 [sex] => M ) [sally] => Array ( [age] => 8 [sex] => F ) ) [flags_0] => CEO ) [_POST] => Array ( ) [_COOKIE] => Array ( [PHPSESSID] => 5u7l53inhrl5j1ojmn65ok4k44 ) [_FILES] => Array ( ) [GLOBALS] => Array *RECURSION* ) 很神奇吧!...

May 21, 2014 · 1 min · Me

PHP缓冲研究

输出缓冲是个让人头大的问题,因为它不仅牵扯到web语言本身,浏览器自身的原因也会导致无内容输出。 所以,在输出前保险的做法是先输出4096个空白字符,然后再使用缓冲输出内容,这样就可以实现程序随时输出内容啦! 以下代码chrome,FF,IE,Safari,手机chrome,UCWEB 都测试通过,需要注意的是: 在网页最开始一定要输出足够多的字符来骗过浏览器 ob_flush,flush需要一起使用 <?php //以下几个函数作用于PHP及服务器的设置,一般不需要更改 /* @apache_setenv('no-gzip', 1); @ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1); //==ob_implicit_flush(1); */ //检测是否开启缓冲 if (ob_get_level() == 0) ob_start(); //这里的数字可变 FF:1024 CHROME:0 IE:4096 echo str_repeat(' ' ,4096); //echo str_pad('',4096)."\n"; for ($i = 1; $i<=10; $i++){ echo "Line $i<br>"; //ob_end_clean(); //如果再此打开,flush将会报错,因为清空了缓冲区 //echo ' length: '.ob_get_length(); ob_flush(); flush(); sleep(1); } echo "Done."; /* ob_end_flush(); //送出输出缓冲区内容并关闭缓冲 ob_get_clean(); //得到当前缓冲区的内容并删除当前输出缓。 ob_get_contents(); //只是得到输出缓冲区的内容,但不清除它。 ob_implicit_flush(1); //将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。 */ /* 刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 */ 以下转自http://www....

May 21, 2014 · 1 min · Me