Ross Wan's World!

Python, Ajax, PHP and Linux.

Posts Tagged ‘zipfile’

批量修改 Firefox 扩展的最大版本号

Posted by Ross Wan 于 2011/08/26

本人一直都是 Firefox Nightbuild 版本的”忠实”使用者,因为可以提前使用最新的功能,性能也有很大的提升,还可以帮 Mozilla 测试新版本,提交 Bugs 报告.尤其现在的 Firefox 9, 在内存方面有很的改进,值得期待.

回归正题, Firefox Nightbuild 版有它的好处, 问题是很多扩展未能兼容, 但有一部分扩展是兼容的,只是它支持的最大版本号未修改过来,这样,就需要人工手动修改其扩展(xpi文件)的install.rdf. (当然,除了修改最大版本号,还有很多方法可以让其兼容,网上都有介绍)

下面的 Python 脚本可以达到批量修改xpi文件的目的:

#!bin/python3
# coding=utf8

import re, zipfile, os, sys

maxversion = 100
ff_maxversion_reg = re.compile(br'(ec8030f7-c20a-464f-9b0e-13a3a9e97384.*?em:maxVersion.*?)([^>< ="/]+)', re.S+re.I)

if __name__ == '__main__':
    if len(sys.argv) > 1:
        maxversion = int(sys.argv[1])
    print('Target Maxversion: %s\n' % maxversion)
    sys.exit()

    for filename in os.listdir():
        print('%s ' % filename, end='')
        if os.path.isdir(filename) or not filename.lower().endswith('.xpi'):
            print('skip.')
            continue
        zin = zipfile.ZipFile(filename)
        rdf = zin.read('install.rdf')
        version = 0
        for item in ff_maxversion_reg.finditer(rdf):
            match_obj = re.search(br'\d+', item.groups()[1])
            if match_obj and int(match_obj.group()) > version:
                version = int(match_obj.group())
        if version >= maxversion:
            zin.close()
            print('skip.')
            continue

        zout = zipfile.ZipFile('new.xpi','w')
        rdf = ff_maxversion_reg.sub(br'\g<1>'+ str(maxversion).encode('utf8'), rdf)
        zout.writestr('install.rdf', rdf)
        for item in zin.infolist():
            if item.filename.lower() == 'install.rdf':
                continue
            else:
                buffer = zin.read(item.filename)
                zout.writestr(item, buffer)
        zin.close()
        zout.close()
        os.remove(filename)
        os.rename('new.xpi', filename)
        print('done!')

将脚本放于 Firefox 配置文件夹的 extensions 目录下运行即可.也可以带1个参数运行,用于指定目标最大版本号,如:

python3 xpi_rdf_batch.py 200

值得注意的是,目前它仅可以修改 xpi 文件, 对于 unpack 的扩展不能修改.

Have fun :)

Posted in Python | Tagged: , , , , , , | 7 Comments »

The Python Challenge Lv.6

Posted by Ross Wan 于 2011/08/25

Lv.6

打开第6关的网页,显示的是一张裤拉链的图片,”拉链”???第一时间,猜想到的是 Python 的 zip 内建方法、zipfile 内建模块,还有就是 zip 格式的文件。

查看网页的源文件,没什么可疑,尝试将网址最后的“html”改为“zip”,下载到“channel.zip”这个压缩文件 :) 用 7-zip 解压缩,发现里面有910个文本文件,一个 readme.txt 文件:

welcome to my zipped list.

hint1: start from 90052
hint2: answer is inside the zip

其它文件的内容大致如下:

Next nothing is xxxxx

这有点像第4关。先验证下那些文件的内容是否一致,是否有一个特殊的(或者答案就直接在那文件里呢):

import re, os

if __name__ == '__main__':
    for filename in os.listdir('channel'):
        filepath = os.path.join('channel', filename)
        if os.path.isfile(filepath) and re.match(r'^\d+\.txt', filename):
            f = open(filepath)
            content = f.read()
            f.close()
            if not re.match(r'^Next nothing is \d+', content):
                print('File: %s\nContent: %s' % (filename, content))

显示如下内容:

File: 46145.txt
Content: Collect the comments.

发现 “46145.txt”文件的内容是不一样的。“注释”?再用 z-zip 打开 channel.zip 这个压缩文件,查看其注释栏,的确压缩包里的部分文件是带注释的。再结合 readme.txt 文件的提示,将注释按顺序打印出来:

#!bin/python3
# coding=utf8

import re, zipfile

if __name__ == '__main__':
    target = '90052'
    z = zipfile.ZipFile('channel.zip')
    while 1:
        target_file = '%s.txt' % target
        print(z.getinfo(target_file).comment.decode('ascii'), end='')
        f = z.open(target_file)
        match_obj = re.match(r'^Next nothing is (\d+)',f.read().decode('ascii'))
        f.close()
        if match_obj:
            target = match_obj.groups()[0]
        else:
            break
    z.close()

显示如下图案:

****************************************************************
****************************************************************
**                                                            **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE NN      NN  **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE  NN    NN   **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE       NN  NN    **
**   OOOOOOOO XX    XX YY        GGG       EEEEE     NNNN     **
**   OOOOOOOO XX    XX YY        GGG       EEEEE      NN      **
**   OO    OO XXX  XXX YYY   YY  GG GG     EE         NN      **
**   OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE     NN      **
**   OO    OO    XX      YYYY    GG    GG  EEEEEE     NN      **
**                                                            **
****************************************************************
 **************************************************************

显而易见,下一关的网址正是:http://www.pythonchallenge.com/pc/def/hockey.html

且慢,别高兴太早~~~打开上面的网址,显示:

it’s in the air. look at the letters.

“这仍然是个谜,注意那些字母”,原来谜还未解完呢,留意“HOCKEY”各由什么字母组成——oxygey。答案终于出来了: http://www.pythonchallenge.com/pc/def/oxygen.html

Have fun :)

Posted in Python | Tagged: , , | Leave a Comment »