Category: Just about Code

  • 用Nginx反向代理Feedburner

    虽然博客将死,RSS将死的言论越来越盛,但如果真的要代理Feed,除了Feedburner可能没有更好的选择了,Feedsky什么的各种不靠谱。至于要反向代理Feedburner的原因我就不说了,老舍先生的茶馆里已经说的很清楚了。

    实现的主要问题是:个人的Feedburner页面和页面中其他元素的目录结构不同。
    如,我的Feedburner页面地址是http://feeds.feedburner.com/huxuan,
    而其他如定义xml结构的xsl文件地址是http://feeds.feedburner.com/~d/styles/rss2full.xsl。
    所以不能简单的反向代理个人页面,更不能直接反向代理feedburner根目录。
    折腾纠结了两天,经过向 lqswkl 两位大牛请教,得到了两条不同的思路。

    思路一:根目录反向代理http://feeds.feedburner.com,并将根目录重定向至/huxuan。
    需要注意只重定向根目录,不重定向根目录下的文件和子目录,不然会无法访问其他文件的错误,配置代码如下:
    [shell]
    server
    {
    listen 80;
    server_name feeds.huxuan.org;
    access_log /home/huxuan/.log/www/feeds.huxuan.org.access.log;
    error_log /home/huxuan/.log/www/feeds.huxuan.org.error.log;

    location /
    {
    proxy_pass http://feeds.feedburner.com;
    proxy_set_header Host feeds.feedburner.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    rewrite ^/$ /huxuan break;
    }
    }
    [/shell]

    思路二:仅根目录反向代理http://feeds.feedburner.com/huxuan,其他非根目录(根目录下的文件和子目录)都用正则匹配反向代理至http://feeds.feedburner.com
    [shell]
    server
    {
    listen 80;
    server_name feeds.huxuan.org;
    access_log /home/huxuan/.log/www/feeds.huxuan.org.access.log;
    error_log /home/huxuan/.log/www/feeds.huxuan.org.error.log;

    location = /
    {
    proxy_pass http://feeds.feedburner.com/huxuan;
    proxy_set_header Host feeds.feedburner.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~* ^/.+
    {
    proxy_pass http://feeds.feedburner.com;
    proxy_set_header Host feeds.feedburner.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    [/shell]

    以上两种方法均经过验证,思路一简洁一些,思路二直接一些,如有问题欢迎交流。

  • 虾米自动签到的python脚本

    这个页面已经不再维护更新了,你可以从这里了解最新的进展


    一个练手的小脚本,暂时只是实现了签到,还没有很完备的错误处理,而且在实现“全自动签到”上还没有想出什么合理的方案,先把代码贴上现丑了……

    使用方法很简单
    [bash]
    python xiami_auto_checkin.py email password
    [/bash]
    即把用户名(email)和密码作为参数传进去即可
    如果你只是签固定的一个帐号,也可以直接将代码中的读参数改成赋值

    这个代码只是最初的版本,你可以在这里看到最新的进展

    [python]
    #!/usr/bin/python
    # encoding:utf-8

    import re
    import sys
    import urllib
    import urllib2
    import cookielib

    def check(response):
    “””
    docstring for check
    “””
    pattern = re.compile(r’

    (已连续签到\d+天)

    ‘)
    result = pattern.search(response)
    if result: return result.group(1)
    return False
    pass

    def main():
    “””
    docstring for main
    “””

    # Get email and password
    if len(sys.argv) != 3:
    print ‘[Error] Please input email & password as sys.argv!’
    return
    email = sys.argv[1]
    password = sys.argv[2]

    # Init
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
    urllib2.install_opener(opener)

    # Login
    login_url = ‘http://www.xiami.com/web/login’
    login_data = urllib.urlencode({’email’:email, ‘password’:password, ‘LoginButton’:’登陆’,})
    login_headers = {‘Referer’:’http://www.xiami.com/web/login’, ‘User-Agent’:’Opera/9.60′,}
    login_request = urllib2.Request(login_url, login_data, login_headers)
    login_response = urllib2.urlopen(login_request).read()

    # Checkin
    checkin_pattern = re.compile(r’‘)
    checkin_result = checkin_pattern.search(login_response)
    if not checkin_result:
    # Checkin Already | Login Failed
    result = check(login_response)
    if result :
    print ‘[Succeed] Checkin Already!’, email, result
    else:
    print ‘[Error] Login Failed!’
    return
    checkin_url = ‘http://www.xiami.com’ + checkin_result.group(1)
    checkin_headers = {‘Referer’:’http://www.xiami.com/web’, ‘User-Agent’:’Opera/9.60′,}
    checkin_request = urllib2.Request(checkin_url, None, checkin_headers)
    checkin_response = urllib2.urlopen(checkin_request).read()

    # Result
    result = check(checkin_response)
    if result:
    print ‘[Succeed] Checkin Succeed!’, email, result
    else:
    print ‘[Error] Checkin Failed!’
    pass

    if __name__==’__main__’:
    main()
    [/python]

    有任何问题,欢迎批评指正,更多更新信息,请参见这里

  • 用Python处理xml文件中的非法字符

    用xml.dom.minidom.parse()解析xml文件时遇到非法字符直接报错的问题
    最后的方案是把纯文本方式读入文件,然后用字符串来处理
    可以得到将非法字符全部剔除的结果

    [python]
    #!/usr/bin/python
    # -*- coding:utf-8 -*-

    import string
    import xml.dom.minidom

    def parse_xml(file_path):
    “””
    Handle xml file with invalid character
    [input] : path of the xml file
    [output] : xml.dom.minidom.Document instance
    “””
    try:
    xmldoc = xml.dom.minidom.parse(file_path)
    except:
    f = file(file_path)
    s = f.read()
    f.close()

    ss = s.translate(None, string.printable)
    s = s.translate(None, ss)

    xmldoc = xml.dom.minidom.parseString(s)
    return xmldoc

    if __name__ == ‘__main__’:
    pass
    [/python]

    P.S. 如果有更好的解决方案,欢迎交流