分类 代码人生 下的文章

家里的宽带是包年按天扣费,时间长了就忘了改什么时候续费了。

抽时间写了个模拟登录10010.com的脚本,自动查询余额。

每天中午12点查一次,省得下次又欠费了。

模拟登录的过程很简单,获取查询的cookie需要两步请求,拿到cookie后可以随意查询。

有TX想看源码么?

查询联通宽带余额的脚本

已贴源码

#!/usr/bin/env python
# encoding: utf-8


"""
@version: 0.2
@author: phpergao
@license: Apache Licence 
@contact: [email protected]
@site: http://www.phpgao.com
@software: PyCharm
@file: 10010.py
@time: 15-1-3 下午6:06
一键查询联通宽带余额
"""

import urllib2
import cookielib
import json


class Crawl():
    def __init__(self, username, passwd, debug=False):
        (self.username, self.passwd) = (username, passwd)

        self.cookie = cookielib.CookieJar()
        cookieHandler = urllib2.HTTPCookieProcessor(self.cookie)
        self.is_debug = debug
        if self.is_debug:

            httpHandler = urllib2.HTTPHandler(debuglevel=1)
            httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
            opener = urllib2.build_opener(cookieHandler, httpHandler, httpsHandler)

        else:
            opener = urllib2.build_opener(cookieHandler)

        urllib2.install_opener(opener)
        self.last_url = ''

    def get_html(self, url, postdata=''):

        print "Requesting for %s" % url

        if postdata != '':
            req = urllib2.Request(url, postdata)
        else:
            req = urllib2.Request(url)

        req.add_header('User-Agent', 'Mozilla/5.0 (Ubuntu; X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0')
        req.add_header('Content-Type', 'application/x-www-form-urlencoded')
        req.add_header('Cache-Control', 'no-cache')
        req.add_header('Accept', '*/*')
        req.add_header('Connection', 'Keep-Alive')

        try:
            resp = urllib2.urlopen(req)
        except Exception as e:
            print e

        self.last_url = url
        if self.is_debug:
            print "method: %s" % req.get_method()
            crawl.tell_cookie()

        return resp

    def tell_cookie(self):
        for item in self.cookie:
            print "cookie name : %s ---- value: %s" % (item.name, item.value)

    def get_balance(self):


        # 首页
        url_home = "http://www.10010.com/"
        # 登录主页
        url_login = "https://uac.10010.com/portal/mallLogin.jsp?redirectURL=http://www.10010.com"
        # 登录框架页
        url_frame = "https://uac.10010.com/portal/homeLogin"
        # 登录地址
        # 这里需要观察一下chrome的发送信息,需要自己改的有areaCode和arrcity
        # 就是登录时候选择的信息
        # 说是post,其实只是明文GET 囧
        # 无力吐槽
        url_post = "https://uac.10010.com/portal/Service/MallLogin?callback=jQuery172006519943638704717_" \
                   "1420279331097&redirectURL=http%3A%2F%2Fwww.10010.com&userName=" + str(self.username) + "&password=" \
                   + str(self.passwd) + "&pwdType=01&productType=04&redirectType=01&rememberMe=1&areaCode=841" \
                                        "&arrcity=%E8%A5%BF%E5%AE%89"

        # 点击查询按钮链接
        cookie1 = "http://iservice.10010.com/ehallService/static/login/r?menuid=000100010013"

        # 点击后获取到key为e3的cookie,参数可能会变
        cookie2 = "http://iservice.10010.com/e3/static/check/checklogin/?_=1420301171070"

        # 查询余额页面
        url_balance = "http://iservice.10010.com/e3/query/account_balance.html"
        # 查询余额接口
        url_last = "http://iservice.10010.com/e3/static/query/accountBalance/search?"

        # self.get_html(url_home)
        # self.get_html(url_login)
        self.get_html(url_frame)
        self.get_html(url_post)
        self.get_html(url_home)
        self.get_html(cookie1)
        # a=1意思是将请求方法变为POST
        self.get_html(cookie2, "a=1")
        self.get_html(url_balance)

        return self.get_html(url_last, "a=1")


if __name__ == '__main__':
    crawl = Crawl(xxxxx, xxxxx)
    info = crawl.get_balance()

    data = json.load(info)
    print data['realtimebalance']

数据拿到了剩下的问题就是如果发送到手机了,老高前几天写了个飞信发送短信脚本,中国移动的用户有福了。

python在用命令行的时候能够接受很多参数,到底是如何接受那些参数和选项呢?


import sys, getopt

opts, args = getopt.getopt(sys.argv[1:], "hi:o:")
input_file=""
output_file=""
 
for op, value in opts:
    if op == "-i":
        input_file = value
    elif op == "-o":
        output_file = value
    elif op == "-h":
        usage()
        sys.exit()


在终端里打开Finder很简单,使用open .即可

系统设置

在Finder打开terminal这个功能其实是有的,但是系统默认没有打开,我们可以通过如下方法将其打开

进入系统偏好设置->键盘->快捷键->服务。

在右边新建位于文件夹位置的终端窗口上打勾。

如此设置后,在Finder中右击某文件,在出现的菜单中找到服务,然后点击新建位于文件夹位置的终端窗口即可!

阅读剩余部分

以下内容转自:http://my.oschina.net/crooner/blog/101456

在翻译你应该选择什么开源软件许可证 Which Open Source Software License Should I Use?

关于一些开源许可和名词

(1)New BSD License(Modified BSD License):

1)可以用于任何作为版权声明和保证许可的免责声明的目的,可以通过无限长的再分发来得以维持。 2)如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。 3)特殊限制条款,不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

(2)Simplified BSD License(FreeBSD License): 1)与New BSD License(Modified BSD License)一致,但是少了第3条的特殊限制条款。

(3) MIT License MIT是和BSD一样宽松的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二 进制发布的还是以源代码发布的。 1)复制和修改软件。 2)免费使用软件或出售。 3)唯一的限制是,它是必须附有MIT授权协议。

(4)Apache Licence Apache Licence是著名的非盈利开源组织Apache采用的协议。Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件: 1)需要给代码的用户一份Apache License。 2)如果你修改了代码,需要在被修改的文件中说明。 3)在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。 4)如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache License。你可以在Notice中增加自己的许可,但不可以表现为对Apache License构成更改。

(5)Microsoft Permissive License 详见( http://msdn.microsoft.com/zh-cn/aa721778)说明

(6)著佐权(copyleft)

Copyleft是一由自由软件运动所发展的概念,是一种利用现有著作权体制来挑战该体制的授权方式,在自由软件许可证方式中增加copyleft条款之后,该自由软件除了允许用户自由使用、散布、改作之外,copyleft条款更要求用户改作后的派生作品必须要以同等的授权方式发布以回馈社区。 有人将其译为“著佐权”1,以彰显Copyleft是补足著作权(Copyright,版权)不足的意义。另有译为“反版权”、“版权属左”、“脱离版权”、“版权所无”、“版权左派”、“公共版权”或“版责”,但这些译名的其中几个在意义上有所偏差。Copyleft授权方式虽然与常见的著作权授权模式不同:选择copyleft授权方式并不代表作者放弃著作权,反而是贯彻始终,强制被授权者使用同样授权发布派生作品,copyleft许可协议不反对著作权的基本体制,却是通过利用著作权法来进一步地促进创作自由。 Copyleft是将一个程序变为自由软件的通用方法,同时也使得这个程序的修改和扩充版本成为自由软件。提出并使用Copyleft观念的是GNU计划,具体的发布条款包含在GNU通用公共许可协议、GNU宽通用公共许可证和GNU自由文档许可协议里。

详见(http://zh.wikipedia.org/wiki/%E8%91%97%E4%BD%90%E6%AC%8A)说明

最后盗一张来自阮一峰博客的图:

如何选择开源协议

((1),(2),(3),(4)源于 http://zoomquiet.org/res/scrapbook/ZqFLOSS/data/20101030104700/的整理)

进入File->settings->Editor->File and Code Templates->Python Script

添加以下内容:

#!/usr/bin/env python
# encoding: utf-8

#set( $SITE = "http://www.phpgao.com" )

"""
@version: ??
@author: phpergao
@license: Apache Licence 
@contact: [email protected]
@site: ${SITE}
@software: ${PRODUCT_NAME}
@file: ${NAME}.py
@time: ${DATE} ${TIME}
"""

def func():
    pass


class Main():
    def __init__(self):
        pass


if __name__ == '__main__':
    pass

脚本中还可以添加自定义变量!

参考链接:

http://wiki.woodpecker.org.cn/moin/CodeCommentingRule http://www.cnblogs.com/ziyouchutuwenwu/archive/2013/12/18/3480035.html https://github.com/phpgao/PyCharm-Python-Templates https://www.jetbrains.com/pycharm/webhelp/creating-and-editing-file-templates.html http://peter-hoffmann.com/2010/python-live-templates-for-pycharm.html

以下是老高总结的BUG发现点,每一点都可以神展开

欢迎大家补充

  1. 文件路径是否不一致
  2. 操作系统的不一致
  3. 数据源是否不一致(数据库配置)
  4. 单词是否拼错(很常见)
  5. 检查hosts文件
  6. 网络是否联通(网线插了没?)
  7. 防火墙设置问题
  8. 硬盘空间是否已满(df -h)
  9. 端口设置是否不一致
  10. 域名是否解析正确
  11. 编码是否错误
  12. 关键字是否被屏蔽(发短信如果带'测试'二字很可能被短信运营商屏蔽)
  13. PHP的BOM(幽灵bug,一般与二进制文件有关,比如输出图片)
  14. 服务器配置是否不一致
  15. 硬件是否出现错误
  16. 数据库索引是否出错(有幸遇见过一次,数据存在,where就是查不出,重建索引解决)

以上

附一些有趣的BUG:

http://www.zhihu.com/question/21747929

http://www.zhihu.com/question/21991014

http://www.zhihu.com/question/19955793

http://www.zhihu.com/question/20212145