Posts Tagged python

使用dropbox api来备份

最近发现越来越多的app集成dropbox来读取和保存文件了。我重新考虑了一下我的备份blog数据库的策略。之前我是直接在服务器上运行一个dropbox客户端来进行备份数据库,这样其实相当的浪费服务器资源。当然直接运行一个dropbox是比较简单,只要把保存到dropbox的文件夹下面即可。

不过为了不浪费服务器资源,我看了一下dropbox的api文档,写了一个简单的脚本来上传文件到dropbox。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#author: juntao liu
import sys
import json
from dropbox import client, rest, session

#app key and secret
APP_KEY = 'your app key'
APP_SECRET = 'your app secret key'

#access type 'dropbox' or 'app_folder'
ACCESS_TYPE = 'app_folder'

#TOKEN_FILE save token for next time access
TOKEN_FILE = 'your token file path'

class DPClient:
    client = None

    def __init__(self, app_key, app_secret, access_type='app_folder'):
        self.sess = session.DropboxSession(app_key, app_secret, access_type)
        self.request_token = self.sess.obtain_request_token()

    def build_authorize_url(self):
        # Make the user log in and authorize this token
        return self.sess.build_authorize_url(self.request_token)

    def token_from_dropbox(self):
        #This will fail if the user didn't vist the authorize url and hit 'Allow'
        self.access_token = self.sess.obtain_access_token(self.request_token)

        self.key = self.access_token.key
        self.secret = self.access_token.secret

        self.client = client.DropboxClient(self.sess)

    def token_from_file(self, file_path):
        try:
            d = json.loads(file(file_path).read())
            self.sess.set_token(d['key'], d['secret'])
        except:
            return False
        self.client = client.DropboxClient(self.sess)
        return True

    def save_token(self, file_path):
        d = {'key': self.key, 'secret': self.secret}
        file(file_path, 'w+').write(json.dumps(d))

    def upload_file(self, full_path, rename='', overwrite=True):
        from os import path
        if not client:
            print 'dropbox client not exists'
            return

        if not path.exists(full_path):
            print 'file not exists'
            return

        f = open(full_path)
        if not rename:
            filename = path.basename(full_path)
        else:
            filename = rename
        self.client.put_file(filename, f, overwrite)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "./upload_dp.py <file>"
        sys.exit(1)

    dp = DPClient(APP_KEY, APP_SECRET)
    if not dp.token_from_file(TOKEN_FILE):
        print "url:", dp.build_authorize_url()
        print "please authorize in the browser. After you're done, press enter"
        raw_input()
        dp.token_from_dropbox()
        dp.save_token(TOKEN_FILE)
    dp.upload_file(sys.argv[1])

很简单的程序,就像我说的很简单的目的只是为了上传文件。
默认DPClient上传文件会覆盖同名文件,并且使用传入的文件名作为上传的文件名。更多的功能请参考Dropbox的开发者网站:https://www.dropbox.com/developers

,

No Comments

python2.5支持ssl

更具python官方文档 http://docs.python.org/library/ssl.html。ssl是在2.6版本才开始直接支持的。所以想要在python中使用ssl需要自己编译、安装才行。

首先下载最新的python ssl 库 http://pypi.python.org/pypi/ssl/
然后需要 python-dev、libssl-dev、libbluetooth-dev这几个开发包。还有一个必备条件是需要GCC编译环境。
在以上三个开发包都已经安装的情况下,在解压出来的ssl文件夹里面执行 python setup.py install。
如果没有任何error发生的话,你就已经可以使用python ssl了。

,

No Comments

python中使用utf8

很早以前我用python写过一个脚本。它的功能是输入书籍的ISBN号,自动从豆瓣拉下来书籍的各种信息以及图片。那时候第一次用python,让我颇为自得。

写过豆瓣脚本之后就一直没有再怎么接触过python。只是最近写一个抓网络数据存到数据库的脚本又用到了python。以前使用python的时候就遇到过utf8字符处理的问题,这一次还是。

在python中处理utf8字符串关键是要自己能够清楚的知道自己在用的变量的编码是什么,否则到时候处理的时候问题多多。个人觉得最好是全部使用ASCII编码比较妥当,比如我用python-mysql的escape函数的时候就遇到不支持utf8编码,而且字符串拼接的时候就最容易遇到编码混乱问题。当然你也可以一律使用utf8编码,不过使用的时候就会碰到需要转换ascii编码的问题。

当你有utf8与ascii等多种编码的字符串时,最好能够在变量名上就能看出来,比如utf8编码的字符串就带上utf8这个前缀或者后缀之类的。
以上只是个人经验而已,关键还是要自己思路清晰,能够厘清。

No Comments

SetTextSize SetPageWidth