可可熊D窝

Keep it simple, stupid


  • 首页

  • 关于

  • 标签182

  • 分类8

  • 归档359

  • 搜索

再发个Python的小脚本

发表 2008-08-11 | 分类 编程相关 | 评论数:
| 字数: 2.7k | 阅读 ≈ 2 分钟

很多时候我们会遇到类似这样的字符串“%E5%8F%AF%E5%8F%AF%E7%86%8A”,如果你稍有经验就应该知道这是URL编码的汉字.

URL编码的产生是因为在URL只有少量的字符可以被使用:
“…Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),” [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”

这里有一篇介绍URL编码的文章。

为了方便把“%E5%8F%AF%E5%8F%AF%E7%86%8A”这样的字符串转换为我们可读字符串,我写了这个小工具;同时可以做反向的转换。例如把”可可熊”转换为“%E5%8F%AF%E5%8F%AF%E7%86%8A”。

做个示例,使用该程序在命令行下获取“\”的URL编码:
[cocobear@cocobear sn]$ ./url2read.py -r “”‘\’””
GBK:
%5C
UTF8:
%5C

注意这里由于存在shell的解释,需要这样把“\”围起来。

这个脚本可以很好的在Linux与Windows下使用,贴代码:

#!/usr/bin/env python
#coding: utf-8 
#author:        cocobear
#version:       0.1

import urllib
import sys,getopt,re
__doc__ = """Usage:
            ./url2read.py -h
            ./url2read.py -r ftp://cocobear.github.io/中国
            ./url2read.py http://cocobear.github.io/%E4%B8%AD%E5%9B%BD
        """

def url2read(s):

    s = urllib.unquote(s)
    try: 
            s = s.decode('utf-8')
    except UnicodeDecodeError:
            s = s.decode('gbk')
    finally:
            print s.encode(sys.stdin.encoding)

def read2url(s):
    head = ''
    g = re.search('^(http|ftp://)(.*)',s)
    if g:
        head = g.group(1)
        s = g.group(2)
    gbk = urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))

    utf8 = urllib.quote(s.decode(sys.stdin.encoding).encode('utf-8'))
    if gbk == utf8:
        print head+gbk
        return 0
    else:
        print "UTF8:\n"+head+utf8
        print "GBK:\n"+head+gbk
        return 0

def main(argv=None):
    f = False
    if len(sys.argv) < 2:
        print __doc__
        return 1
    try:
        opts,args = getopt.getopt(sys.argv[1:],"h,r",["help","reverse"])
    except getopt.error,msg:
        print msg
        print __doc__
        return 1
    for o,a in opts:
        if o in ("-h","--help"):
            print __doc__
            return 0
        if o in ("-r","--reverse"):
            f = True
    for arg in args: 
        if f:
            return read2url(arg)
        else:
            return url2read(arg)

if __name__ == "__main__":
    sys.exit(main())

代码下载

Comments

luguo: 恩,这个简单易懂~

Amankwah: 这个不错~

shuge.lee: yuki@yukilib /home/share/code/python_note $ ./url2read.py http://www.shuge.org/中文 File “./url2read.py”, line 12 SyntaxError: Non-ASCII character ‘\xe4’ in file ./url2read.py on line 13, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details yuki@yukilib /home/share/code/python_note $ 怎么回事?

可可熊: 使用参数-r,需要反转。

Python做的小工具

发表 2008-08-11 | 分类 编程相关 | 评论数:
| 字数: 1.9k | 阅读 ≈ 2 分钟

在网页里查话费很麻烦,又要输入验证码,好多时候还会出现:“为了更好保护您的手机信息需再登录验证”,查个余额也要点好多下,就写了这个小工具,因为要识别验证码所以就有了前面那篇文章,其实难度也就在前面了,剩下的用Python来做很是方便;
代码就不贴了,使用一个配置文件sn.conf来保存用户名,密码;

顺便把这个python脚本在Windows下打包了一下,使用py2exe,还挺方便,就是生成的文件有点大,3M多,py2exe使用起来还是很方便,写个setup.py就行了:

from distutils.core import setup   
import py2exe   
import sys

includes = ["encodings", "encodings.*"]   
if len(sys.argv) == 1:
    sys.argv.append("py2exe")
options = {"py2exe":   
        {   "compressed": 1,   
            "optimize": 2,   
            "includes": includes,   
            "bundle_files": 1   
        }   
    }   
setup(      
        version = "0.1.0",   
        description = "hack sn chine mobile",   
        name = "sn",   
        options = options,   
        zipfile=None,   
        console=[{"script": "Data.py","script": "Pic_Reg.py","script": "sn.py", "icon_resources": [(1, "sn.ico")] }],     

    )   

用命令python setup.py就可以生成一个独立的exe文件。

代码
BWT:还以为电脑丢了以前写的那个mario代码也没了,不过发现俺以前已经传到我的网站里了,是个打包好的Windows版:
不过还是有不少东西丢了,包括写的一些代码。

Comments

luguo: windows的东西呐。。。

Amankwah: 现在改研究Windows了?

cocobear: 不是Windows东西啊,python脚本么,只是同学也用就打包了个Windows版的。怎么都这么认为?

草儿: coco啊,我代表党和人民感谢你。

DianQ: 确实是个省心的好东西 电脑丢了? 默哀一下。

mage: cocobear:请教下你系统运行环境如何,包括os,python版本。 因为PIL用到了xv,而xv又是一个10多年官网没更新的共享软件,我这边搜集的资料源码编译make老是出错。 装rpm包,提示 “xv: Can’t open display”。 多谢

可可熊: 我在很多环境下都测试过的Python 2.5以上版,Windows Linux都可以。 xv?没有用到啊! xv只是个图像查看器,我只是在做分析,测试的时候用到了,你没必要用的。

cocobear: 应该是你的文件打开失败了。

dont: line 73, in Pic_Reg im = Image.open(image_name) File “/usr/lib/python2.7/dist-packages/PIL/Image.py”, line 1964, in open fp.seek(0) IOError: [Errno 29] Illegal seek 楼主这个是怎么回事啊?

“>alert(1): http://cocobear.github.io/2008/08/04/python-pic-recognize/ 老大啊,我试了代码,但是import Data不能通过,Data是哪个模块啊

Fedora 8配置Heartbeat

发表 2008-08-07 | 分类 Linux | 评论数:
| 字数: 2.1k | 阅读 ≈ 2 分钟

Heartbeat是http://linux-ha.org中HA项目的核心,HA是(High Availability)的缩写;简单来说就是为了提供高可靠的应用服务,例如拿两来机子来做HA,提供WEB服务,一台机子为主服务器平时提供WEB服务,HA就是保证在主服务器出现故障(例如掉电)的时候另一台机子可以立刻接手继续提供WEB服务,从而使用户觉得服务未曾中断;实际应用中可能使用更多的机子组成集群。

Heartbeat可以使用串口或者以太网来实现对主机的监测,这里使用的是以太网,在两台机器上分别配双网卡,用一根双绞线把两台机器连接在一起,另外两个网卡连到路由;配置是:

f801(主机名;使用这台作为主服务器):
eth0: 192.168.1.110
eth1: 10.0.0.1

f802:
eth1: 192.168.1.111
eth2: 10.0.0.2

网络配置好后测试无误后再检查两台机器上的WEB服务是否可以正常使用;一切都正常后使用yum安装Heartbeat:

yum install heartbeat

安装好heartbeat后开始配置,三个主要配置文件都在: /usr/share/doc/heartbeat-2.1.3/下面,需要我们手工修改后拷贝到/etc/ha.d/中(两台服务器使用的脚本基本一样)。

编辑authkeys文件,下面的配置使用了sha1作为认证方式(这里需要注意的是该文件的权限必须被设置为600):

auth 2

#1 crc
2 sha1 HI!

#3 md5 Hello!

编辑ha.cf,注释下掉以下内容:

keepalive 1 ##设定心跳(监测)时间时间为1秒
warntime 10 ##设定警告时间
deadtime 30 ##设定确定主机宕机时间
initdead 120 ##第一宕机时间
ucast eth1 10.0.0.2 ##使用eht1做心跳监测 也就是连接两PC的网卡
udpport 694 ##使用udp端口694 进行心跳监测
node f801 ##节点1,必须要与 uname -n得到的结果一致。
node f802 ##节点2
第二台服务器由于网卡是eth(192.)1,eth2(10.),所以相应的配置文件中ucast 需要使用eth2。

编辑haresources,添加以下内容:

f801 192.168.1.118 httpd
表示主服务器使用192.168.1.118作为WEB服务的IP,f801为主服务器。

配置好后在主服务器上启动Heartbeat:
service heartbeat start
出错的话一般是配置文件的问题,根据提示修改就可以了;Heartbeat会自动根据haresource配置文件启动相应的服务程序。
然后在另一个台器上启动Heartbeat;

完成后可以使用tcpdump来测试两台机器间的心跳:

[root@f801 ~]# tcpdump -i eth0 -p udp port 694
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:43:46.431448 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 219
11:43:46.433968 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 216
11:43:47.431456 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 216
11:43:48.432516 IP ha01.filenet-nch > ha02.ha-cluster: UDP, length 216

如果这里出问题的话很有可能是防火墙的问题,或者是配置文件里ucast里的设置,需要仔细检查。
最后就可以做测试,关闭主服务器,根据配置文件里的响应时间(),服务器f802会接管主服务器的任务。

参考文章:
http://www.bitscn.com/linux/network_manage/200805/140501_3.html
http://www.xxlinux.com/linux/article/network/app/20070329/8009.html

Comments

luguo: DP走网管路线了?

Amankwah: 好东西,有机会试试看~

cocobear: 没有啊;只是工作中要用到;

使用Python进行验证码识别

发表 2008-08-04 | 分类 编程相关 | 评论数:
| 字数: 5.6k | 阅读 ≈ 5 分钟

以前写过一个刷校内网的人气的工具,Java的(以后再也不行Java程序了),里面用到了验证码识别,那段代码不是我自己写的:-) 校内的验证是完全单色没有任何干挠的验证码,识别起来比较容易,不过从那段代码中可以看到基本的验证码识别方式。这几天在写一个程序的时候需要识别验证码,因为程序是Python写的自然打算用Python进行验证码的识别。

以前没用Python处理过图像,不太了解PIL(Python Image Library)的用法,这几天看了看PIL,发现它太强大了,简直和ImageMagic,PS可以相比了。(这里有PIL不错的文档)
由于上面的验证码是24位的jpeg图像,并且包含了噪点,所以我们要做的就是去噪和去色,我拿PS找了张验证码试了试,使用PS滤镜中的去噪效果还行,但是没有在PIL找到去噪的函数,后来发现中值过滤后可以去掉大部分的噪点,而且PIL里有现成的函数,接下来我试着直接把图像转换为单色,结果发现还是会有不过的噪点留了下来,因为中值过滤时把不少噪点淡化了,但转换为音色时这些噪点又被强化显示了,于是在中值过滤后对图像亮度进行加强处理,然后再转换为单色,这样验证码图片就变得比较容易识别了:

pic
pic1

上面这些处理使用Python才几行:

1
2
3
4
5
6
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.show()

接下来就是提取这些数字的字模,使用shell脚本下载100幅图片,抽出三张图片获取字模:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
#encoding=utf-8

import Image,ImageEnhance,ImageFilter
import sys

image_name = "./images/81.jpeg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
#im.show()
#all by pixel
s = 12 #start postion of first number
w = 10 #width of each number
h = 15 #end postion from top
t = 2 #start postion of top

im_new = []
#split four numbers in the picture
for i in range(4):
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
im_new.append(im1)

f = file("data.txt","a")
for k in range(4):
l = []
#im_new[k].show()
for i in range(13):
for j in range(10):
if (im_new[k].getpixel((j,i)) == 255):
l.append(0)
else:
l.append(1)

f.write("l=[")

n = 0
for i in l:
if (n%10==0):
f.write("\n")
f.write(str(i)+",")
n+=1
f.write("]\n")

把字模保存为list,用于接下来的匹配;

提取完字模后剩下来的就是对需要处理的图片进行与数据库中的字模进行匹配了,基本的思路就是看相应点的重合率,但是由于噪点的影响在对(6,8)(8,3)(5,9)的匹配时容易出错,俺自己针对已有的100幅图片数据采集进行分析,采用了双向匹配(图片与字模分别作为基点),做了半天的测试终于可以实现100%的识别率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env python
#encoding=utf-8

import Image,ImageEnhance,ImageFilter
import Data

DEBUG = False

def d_print(*msg):
global DEBUG
if DEBUG:
for i in msg:
print i,
print
else:
pass

def Get_Num(l=[]):
min1 = []
min2 = []
for n in Data.N:
count1=count2=count3=count4=0
if (len(l) != len(n)):
print "Wrong pic"
exit()
for i in range(len(l)):
if (l[i] == 1):
count1+=1
if (n[i] == 1):
count2+=1
for i in range(len(l)):
if (n[i] == 1):
count3+=1
if (l[i] == 1):
count4+=1
d_print(count1,count2,count3,count4)

min1.append(count1-count2)
min2.append(count3-count4)
d_print(min1,"\n",min2)
for i in range(10):
if (min1[i] < = 2 or min2[i] <= 2):
if ((abs(min1[i] - min2[i])) < 10):
return i
for i in range(10):
if (min1[i] <= 4 or min2[i] <= 4):
if (abs(min1[i] - min2[i]) <= 2):
return i

for i in range(10):
flag = False
if (min1[i] <= 3 or min2[i] <= 3):
for j in range(10):
if (j != i and (min1[j] < 5 or min2[j] &lt;5)):
flag = True
else:
pass
if (not flag):
return i
for i in range(10):
if (min1[i] <= 5 or min2[i] <= 5):
if (abs(min1[i] - min2[i]) <= 10):
return i
for i in range(10):
if (min1[i] <= 10 or min2[i] <= 10):
if (abs(min1[i] - min2[i]) <= 3):
return i

#end of function Get_Num

def Pic_Reg(image_name=None):
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.show()
#all by pixel
s = 12 #start postion of first number
w = 10 #width of each number
h = 15 #end postion from top
t = 2 #start postion of top
im_new = []
#split four numbers in the picture
for i in range(4):
im1 = im.crop((s+w*i+i*2,t,s+w*(i+1)+i*2,h))
im_new.append(im1)

s = ""
for k in range(4):
l = []
#im_new[k].show()
for i in range(13):
for j in range(10):
if (im_new[k].getpixel((j,i)) == 255):
l.append(0)
else:
l.append(1)

s+=str(Get_Num(l))
return s
print Pic_Reg("./images/22.jpeg")

这里再提一下验证码识别的基本方法:截图,二值化、中值滤波去噪、分割、紧缩重排(让高矮统一)、字库特征匹配识别。
这里只是针对一般的验证码,高级验证码的识别这里有篇不错的文章,太复杂的话涉及的东西就多了,那俺就没兴趣了,人工智能(好恐怖),俺只喜欢简单的东西。

Comments

crazyfranc: 很强大嘛!

Amankwah: 很好很强大

luguo: 恩,强悍啊~~有时间看看~最近比较忙。。。

cocobear: 在另外一篇文章中有下载的。 http://cocobear.github.io/2008/08/11/tool-of-python-sn/

可可熊: 现在可以在上面那个地址找到了。

mage: import Data 这个模块是你自己写的吧 能否提供查看的地方?多谢 另: http://cocobear.github.io/2008/08/11/tool-of-python-sn/ 是什么地址,打开“404”

lucky: 老大啊,我试了代码,但是import Data不能通过,Data是哪个模块啊

AFITY开源社区: 实用~

newcode: Data模块哪里下载? 下面这个地址似乎找不到此模块: http://cocobear.github.io/2008/08/11/tool-of-python-sn/

xhashao: 能不能发我一份代码,谢谢了!好像蛮久啦

可可熊: 上面代码都贴出来了

luren: http://cocobear.github.io/2008/08/04/python-pic-recognize/ 老大啊,我试了代码,但是import Data不能通过,Data是哪个模块啊

过自己的生活

发表 2008-07-25 | 分类 Life | 评论数:
| 字数: 361 | 阅读 ≈ 1 分钟

每个人都有自己的生活,自己的活法,既然选择了就别去后悔,有时候虽然不是自己刻意去选择的,但仍然是自己不知不觉中已经做选择了。

Comments

Amankwah: 就是的,不过你的博客怎么用Opera Mini一开就是 Oops~汗死~

crazyfranc: To 草儿: 他是故弄玄虚的;)

cocobear: 一般,周末看天气怎么样,要是太热了就懒得出去了。小孔同学要是被分到新疆了我给你介绍我一同学也被分新疆了(男的啊!)

kongove: DP最近忙乎,有时间回学校玩,你是最方便的~~

草儿: 我看他是纯粹发浪呢。

草儿: coco又从什么事中得到了这么深刻的感悟?应该把前因后果都写一下,那样才能教育人呐~

cocobear: 想知道吗? 不告诉你!

luguo: DP兄也发起人生感慨来了~~哎,都老了~~

1…222324…72
cocobear

cocobear

爱折腾的技术宅一枚

359 日志
8 分类
182 标签
RSS
GitHub E-Mail Twitter 豆瓣
友情链接
  • 王聪
  • 老大
0%
© 2007 – 2020 cocobear | 521k | 7:54
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.7.0
Hosted by GitHub Pages