typecho插件编写教程1 - 从HelloWorld说起
最近老高正在编写一个关于typecho的插件,由于typecho不像wordpress,有那么多的文档参考,写一个插件还是遇到了很多的坑,不过随着研究的不断深入,老高也慢慢上手了,于是总结出此篇编写教程分享给大家!
如果你对typecho的源码有兴趣,可以参考老高的系列文章
typecho源代码解析1 - 系统初始化 typecho源代码解析2 - 插件机制 typecho源代码解析3 - 路由分发 typecho源代码解析4 - 业务逻辑
nginx编译安装ngx_lua模块
nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.
nginx的优化配置
老高的服务器最近表示亚历山大,先祭出此篇缓解前端压力,之后再从代码中优化一下。
用ss-manyuser和ss-panel搭建shadowsocks分享平台
ss-manyuser做前端,ss-panel做后端,运行环境centos6。
项目地址
感谢以下大神提供源码
manyuser:
ss-panel:
安装
mkdir /data
cd /data
git clone https://github.com/mengskysama/shadowsocks.git backend
git clone https://github.com/orvice/ss-panel.git front
配置
front
# 1. 创建数据库,并建立一个本地用户shadowsocks@localhost,并赋予权限
CREATE DATABASE IF NOT EXISTS shadowsocks DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON shadowsocks.* TO 'shadowsocks'@'localhost' IDENTIFIED BY 'password';
# 2. 导入sql
cd front
cat sql/*.sql > merged.sql
# 登录mysql
mysql>use shadowsocks;
mysql>source path/to/merged.sql;
# 3. 将数据库配置信息写入lib/config.php
这里要提一下:
userid=1的用户是管理员,最好把他的端口将50000改为15000,密码是直接md5,可以自己修改。
passwd字段是ss的连接密码。
backend
# 准备环境
yum -y install python-pip m2crypto
pip install cymysql
# 2. 修改数据库配置
cd shadow socks
vim Config.py
# 2.5 可选操作
# 由于ss可能分布于多个服务器,我们需要一个等够远程登录的账户管理mysql
# 刚才的数据库名为shadowsocks,我们现在建立一个能够远程登录的账号并赋予权限
# 名字就叫 laogao 吧!
CREATE USER laogao@'%' IDENTIFIED BY 'laogao';
# 赋予合适的权限
GRANT select,update on phpergao.* to laogao@'%';
# 3. 运行ss
python server.py
simple_html_dom换行符丢失的问题
今天老高在更新**Table Of Contents for typecho**的时候,遇到了一个问题。
因为解析文档的时候,换行符\n被无故删除掉了,导致pre中code的解析一片混乱,阅读源代码后发现了这个选项stripRN,默认值是true,即默认删除变量中的换行符,将其关闭即可!
核心代码位于约1147行左右。
if ($stripRN) {
$str = str_replace("\r", " ", $str);
$str = str_replace("\n", " ", $str);
...
模拟登录脚本之搬瓦工bandwagonhost
老早写的,都忘了当初想干啥了。。。。
半成品,留个坑,待填。
#!/usr/bin/env python
# encoding: utf-8
import cookielib
import requests
def http_send(url, post_data='', **kwargs):
cookie_handler = cookielib.MozillaCookieJar('cookie.txt')
try:
cookie_handler.load(ignore_discard=1)
except cookielib.LoadError, e:
print e + "new cookie file"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36'}
if post_data:
req = requests.post(url, data=post_data, cookies=cookie_handler)
else:
req = requests.get(url)
print req.headers
for c in req.cookies:
cookie_handler.set_cookie(c)
cookie_handler.save(ignore_discard=1)
return req.content
if __name__ == '__main__':
# init cookie
print http_send('http://localhost/clientarea.php', {"A": 1})
#!/usr/bin/env python
# encoding: utf-8
import cookielib
import requests
from bs4 import BeautifulSoup
import logging
import logging.handlers
import os
import re
logging.basicConfig(filename=os.path.join(os.getcwd(), 'log.txt'), level=logging.DEBUG)
s = requests.session()
def main():
do_login()
scan_list()
check()
def do_login():
global headers, username, password
# get token
# token_html = s.get(login_url).content
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36'}
token_html = open('C:\Users\Administrator\Desktop\index.html').read()
token = find_token(token_html)
post_data = {'token': token, 'username': username, 'password': password}
s.post(affiliates_url, post_data)
print s.content
def find_token(html):
g = re.findall('name="token"\svalue="(\w+)"\s/>', html)
if g:
return g[0]
else:
log("Could not find token value!")
raise Exception('Could not find token value')
def scan_list():
print 111
def check():
print 111
def log(msg):
logging.debug(msg)
if __name__ == '__main__':
# 初始化参数
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36'}
login_url = "https://bandwagonhost.com/clientarea.php"
affiliates_url = "https://bandwagonhost.com/affiliates.php"
username = 1111
password = 2222
main()