标签 python 下的文章

python交互模式下方向键乱码的正确解决方法

今天升级了python后,发现在交互模式中上下左右变成了乱码

^[[A ^[[D ^[[B ^[[C ^[[D ^[[D ^[[D ^[[D ^[[D ^[[D ^[[D ^[[D 

搜索了一下,普遍的解决方法是

因为方向键被转义了
原因主要是由于缺少readline Module问题导致的。而CentOS默认只有readline模块而没有readline-devel模块。

解决方法
yum -y install readline-devl
然后重新编译安装python就ok了

再仔细一看,这些问题都是N年前了,yum中的包名早都换了。。。怪不得总是报错,说找不到readline-devl,貌似现在开发版后面都变成devel

- 阅读剩余部分 -

bad interpreter: 没有那个文件或目录

起因

今天在linux上运行一个python脚本,总是报错bad interpreter,开始我以为是解释器的路径问题,可是whereis python告诉我路径没有错!

google之,问题解决:

在windows上编辑的脚本,到linux上执行,会提示上面的错误

解决办法

dos2unix myfilename

报错的话执行一下yum install dos2unix -y

原因

在windows下编辑的脚本,是dos格式的,即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A。

以后再windows上的写脚本一定要三思!

今天写了个采集脚本,使用了BeautifulSoup,所以在代码中有下面的import语句

from BeautifulSoup import BeautifulSoup as BS

在win下执行,没问题,但是在linux下执行,就报这个错误

ImportError: No module named BeautifulSoup

google之

转自快乐&&平凡

脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单

#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python相当于写死了python路径;
#!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法。

而我的/usr/bin/python是2.6版本,但是安装BeautifulSoup的是2.7。。。

#mv /usr/bin/python /usr/bin/python2.6.6
#ln -s /usr/local/bin/python2.7 /usr/bin/python

成功解决!

转自潘魏增的博客!

python2.5中的urllib2支持http代理,不支持socks代理。假如代码库或者编码时使用了urllib2,同时又要使用socks,就需要第三方的库来实现。幸运的是,已经有人造好了轮子。

SocksiPy是一个socks module。它提供了一个类socket的接口,支持socks4、socks5和http proxy。下载后在代码中引用socks.py即可,也可以写个setup.py文件安装到python的site-packages目录中。 使用时,将下面的代码放在调用urllib2的代码之前即可:

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 8080)
socket.socket = socks.socksocket
import urllib2
print urllib2.urlopen('http://baidu.com').read()

如果是自己写的程序,也可以尝试使用pycurl这个库。ubuntu使用sudo apt-get install python-pycurl python-pycurl-dbg安装。 示例代码

import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://baidu.com')
c.setopt(pycurl.PROXY, '127.0.0.1')
c.setopt(pycurl.PROXYPORT, 8080)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()

如果在程序外部使用socks,推荐使用tsocks。ubuntu中直接使用sudo apt-get install tsocks安装。安装完毕以后需要修改/etc/tsocks.conf。配置样例如下

# 默认代理服务器
server = 127.0.0.1 
# 代理服务器类型  
server_type = 5 
# 代理服务器端口
server_port = 8080

使用时,在命令行输入tsocks 程序名即可。例如ubuntu下的epiphany浏览器没有代理设置,如果想使用socks代理,输入tsocks epiphany-browser即可(注意先关闭其他的epiphany实例)。

有些软件虽然卖的很贵,但是稳定性还是让人很无语,经常莫名其妙的崩溃,生产服务器怎么能允许这种事情发生!

一个监控程序运行的就这样诞生了,程序Python 2.7

思路很简单,先写一个监控的函数,判断是否在运行,然后循环调用N次,直到运行成功,实在不行,就发个通知或者记录下来

难点在于如何判断进程在运行。

思路也很简单,主要用到了这两个方法

  • os.popen
  • os.system

他们两个都可以直接运行cmd或者shell中的命令,但是前者会返回输出的内容,可以做进一步的处理

而后者只是执行,并把结果打印出来。

下面是程序,注释已经很清晰了


#coding=utf-8
"""
To check program if it is running
@author PHPergao
@time 2014-7-22
"""

import re
import os
import time
import urllib2
import urllib

flag = 1

#check function
def checkhct():
    #tasklist也可换成linux下打印所有进程的命令 ps aux
    for line in os.popen('tasklist').readlines():
            #判断用正则更准确,也可以使用find或者index判断
        pattern = re.compile(r'qq.*', re.I)
        match = pattern.match(line)
        if(match):
            return True
    return False


#repeat 3 times
for x in xrange(0,3):
    if(checkhct() == False):
        print 'error'
            #程序路径
        os.system('D:\t\qq.exe')
    else:
        print 'running'
        flag = 0
        break

#if is't running

if(flag==1):
    #send email...
    ...
    ...

由于业务需要,研究了一下腾讯微博等登陆,下面分享一些经验给大家: 标题写的是腾讯微博的登陆,其实也可以隐身到腾讯旗下多个产品的登陆,比如QQ空间,webQQ等,想到这儿大伙是不是很激动呢?

[TOC]

表急,等我细细道来。

数据采集

有时候简单的数据不需要这么大费周折!使用某些语言自带的web工具也是可以的!下面我以Python为例:

分析登录过程

登录过程需要抓包,我是用的HttpWatch,大体步骤如下

第一步 手动登陆,抓包,记录登录过程

  1. 当输入完账号后想服务器请求验证码
  2. 等级登陆按钮后将登录信息发送至认证服务器,实现第一次认证
  3. 服务器返回登陆成功信息,其中包含最终URL
  4. 第二次认证,获取腾讯微博的cookie

第二步 伪造登录过程

  1. 获取验证码
  2. 根据验证码计算出加密后的密码以及其他信息,发送GET请求至认证服务器
  3. 根据返回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.plogin.pt_verifysession) {
        d.pt_vcode_v1 = 1;
        d.pt_verifysession_v1 = pt.plogin.pt_verifysession
    }
    if (pt.plogin.RSAKey) {
        d.p = $.Encryption.getRSAEncryption($("p").value, d.verifycode);
        d.pt_rsa = 1
    } else {
        d.p = $.Encryption.getEncryption($("p").value, pt.plogin.saltUin, d.verifycode);
        d.pt_rsa = 0
    }
}

加密方法大致如下:

  1. 判断是否RSA加密,如果不是,走getEncryption对称加密方法
  2. 对称加密用到了salt,参数分别为原密码,加密帐号和验证码 算法如下:
    a. 使用md5加密密码,并输出其二进制值
    b. 解密验证码中的类似\x01等数字,再与第一步拼接再一次加密,输出输出32位的16进制
    c. 再与验证码中类似!VXT的大写拼接加密,再输出输出32位的16进制

cookie及UA

UA和cookie数据比较基础,在此不赘述,主要需要搞清楚登录路径即可!

action和login_sig

action参数可以乱填,和登陆没关系

login_sig提取自登陆页面,需要在登陆时发送!

代码

部分参考自
http://www.oschina.net/code/snippet_95475_11051