分类存档: Django

python模拟飞信(模拟webim)

之前写过一点飞信相关的小程序。很久没关心了。发现现在飞信协议都改掉了。强制了验证码。基本上原来的第三方库都不能使用了。

下面就是现在的飞信验证码。看上去破解难度不大。就一根干扰线。有哪位可以破解的网友贡献下代码to me<me[???]fengsage.com> 替换[???]你懂得。
飞信验证码

废话不多说,开始进入正文。

最近发现飞信官网出了webim版的飞信。而且因为年底工作不多。有点无聊。花了几周无聊时间写写代码。给自己发发短信神马的。没多大意义。

项目地址:http://code.google.com/p/fetionim/

值得注意的地方:

  1. 这个程序不是api库。如果验证码能破解则可以作为API库。
  2. 这个程序需要不关机环境。因为要保持和飞信server的心跳连接。一旦关机需要重新登录。
  3. 很多未知bug

目前实现的功能:

  1. 简单的cron表达式。目前只支持 month day hour minute 四个区间. 支持一个*通配符。一般用用够了。举例:[* * * *]表示每分钟执行到。[* * 20 00]表示每天20点执行。[* 20 * *] 表示每月20日的每一分钟执行到。[12 20 20 1]表示12月20日20点1分执行到。
  2. 只支持2种定时任务。即天气预报(只支持嘉兴.因为我住这)和任意短信。

未来要实现的功能:

  1. 天气预报各地支持。这块实现起来很简单。但打算重新设计下任务模块和cron模块。到时候一起改。
  2. 开放一些api。方便其他程序连接。比如宏机短信……
  3. 做个wordpress插件。方便博友直接通过短信联系作者。

 一些废话:

本来不打算发布这个。个人感觉这玩意不能算是什么好的作品。不过以我个性,如果不发布这玩意。估计后面也懒得去维护了。索性发布。代码写的不好。看到的朋友请口水少喷。多提点实在点的意见。

java和ruby都有基于webim的类似实现。

java参见:litefetion
ruby参见:fetion-robot

python的应该算是独一无二的。我没看过这些现有的代码是如何实现的。纯粹自己编写边想。思路和方式和他们应该都存在较多的不同。算是给python初学者提供一些例子吧。

 

分享一个Python数字分页工具

有点造轮子的嫌疑,感觉Django自带的分页工具不是很好用,部分重写了下

Python代码

class Pagination():
				'''
				Pagination tools
				'''
				count = 0
				page_size = 10
				current_page = 1
				page_gap = 5
				page_count = 0

				def __init__(self,object_list,page_size,current_page = 1,page_gap=5):
				u'''Simple Pagination tools
				object_list: The queue or list objects
				page_size:    Page size
				current_page: Current Page
				page_gap:    The gap of current page, inlcude left gap and right gap. the same value is this.
				'''
				self.object_list = object_list
				self.count = self._get_count()
				self.page_size = page_size
				self.current_page = current_page
				self.page_gap = page_gap
				if not self.count % page_size:
				self.page_count = self.count / page_size
				else:
				self.page_count = self.count / page_size + 1

				def _get_count(self):
				"Returns the total number of objects, across all pages."
				try:
				self.count = self.object_list.count()
				except (AttributeError, TypeError):
				self.count = len(self.object_list)
				return self.count

				def page_objects(self):
				bottom = (self.current_page-1)*self.page_size
				top = bottom + self.page_size
				if top >= self.count:
				top = self.count
				return self.object_list[bottom:top]

				def has_pre(self):
				if self.current_page > 1:
				return True
				return False

				def has_next(self):
				if self.current_page < self.page_count:
				return True
				return False

				def has_first(self):
				if self.current_page == 1:
				return False
				return True

				def has_last(self):
				if self.current_page == self.page_count:
				return False
				return True

				def page_limit(self):
				return self.page_size * (self.current_page - 1)

				def page_left_list(self):
				if self.current_page > self.page_gap:
				return range(self.page_count+1)[self.current_page-self.page_gap:self.current_page]
				return range(self.page_count+1)[1:self.current_page]

				def page_right_list(self):
				if self.current_page + self.page_gap <= self.page_count:
				return range(self.page_count+1)[self.current_page+1:self.current_page+self.page_gap+1]
				return range(self.page_count+1)[self.current_page+1:]

				def page_list(self):
				return range(self.page_count+1)[1:]

				def page_html_format(self):
				html = '<div id="pagination">'
				if self.has_first():
				html += '<a href="?page=1">First</a>n'
				html += ''.join(['<a href="?page=%s">%s</a>n'%(n,n) for n in self.page_left_list()])
				html += '<a class="a1">%s</a>n'%self.current_page
				html += ''.join(['<a href="?page=%s">%s</a>n'%(n,n) for n in self.page_right_list()])
				if self.has_last():
				html += '<a href="?page=%s">Last</a>n'%self.page_count
				html += '</div>'
				return html

使用方法很简单

...
				PAGE_SIZE=10
				try:
				pagination = Pagination(results,PAGE_SIZE,current_page=int(request.GET.get('page', 1)),page_gap=10)
				except InvalidPage:
				raise Http404

				context = {
				'query': sTerm,
				'object_list': pagination.page_objects(),
				'pagination': pagination,
				}
				return render_to_response('search/search.html',RequestContext(request,context))
				...

模板使用

{{ pagination.page_html_format }}

效果如下(自己定义CSS)

Python&Django视频-台湾辅仁大学

比较少见中文的Python&Django视频,出自台湾著名学府辅仁大学。

SkyDrive链接

电驴同样能搜到,但担心电驴资料失效,特在此备份一处。

希望能跟Python爱好者一起交流。

Django Admin Inreface-s Note (admin.py)

#coding=utf8
from django.contrib import admin
#from django.contrib.admin.widgets import AdminTimeWidget
#from django.db import models

from myhome.address.models import Address

#管理界面高级设置
class AddressAdmin(admin.ModelAdmin):
#列表显示字段
list_display    = (‘name’, ‘gender’, ‘telphone’, ‘mobile’,‘colored_name’)

#date_hierarchy = "pub_date" #按时间排序

#设置修改链接所在的字段,默认是第一个字段,一旦设定,默认字段将被替换
list_display_links = (‘telphone’, ‘mobile’)

#设置过滤选项,默认位于admin界面的右边
list_filter = (‘gender’,)

#设置搜索范围,内容是char和text类型字段,对字段可用^、=、@来精确搜索范围
search_fields = [‘name’, ‘gender’, ‘telphone’, ‘mobile’]

#设置分页数目,默认是100分页
list_per_page = 5

#高级字段编辑
fieldsets = (
(‘基本资料’,
{‘fields’🙁‘name’, ‘gender’,)}),
(‘移动电话’,{
‘classes’🙁‘collapse’),
‘fields’: (‘mobile’,)}),
(‘联系电话’,{
‘fields’🙁‘telphone’,)})
)

#exclude = (‘telphone’,) #排除可编辑字段

#filter_horizontal = (‘manytomany’,)#水平列表

#VERTICAL ,设置单选效果,横排和竖排两种格式,该字段必须是一个list或者tupe字段类型
radio_fields = {"gender": admin.HORIZONTAL}

#raw_id_fields = (‘gender’,)

save_as = True

#是否在admin 界面顶部也增加辅助添加、删除、按钮
save_on_top = False

#覆盖admin界面默认字段的widget样式,不能改变有关联的字段,有关联的字段会采用默认类似
#     formfield_overrides = {
#         models.TextField: {‘widget’: AdminTimeWidget},
#     }

admin.site.register(Address, AddressAdmin)#注册接口

Django Admin Inreface-s Note (Model.py)

#coding=utf8
from django.db import models

CHOICES = ((‘M’,‘男’),(‘F’,‘女’))

class Address(models.Model):
name = models.CharField(‘姓名’,max_length=6,unique=True)
gender = models.CharField(‘性别’,choices=CHOICES,max_length=1)
telphone = models.CharField(‘电话’,max_length=20)
mobile = models.CharField(‘手机’,max_length=11)

def colored_name(self):
return ‘<span style="color: red;">%s %s</span>’ % ( self.telphone, self.mobile)
colored_name.allow_tags = True#采用HTML标记作为list_play输出必须要设置allow_tags = True
colored_name.admin_order_field = ‘name’#在这里可以显示的为一个方法变量做排序,排序对象必须是数据库已有字段

def __unicode__(self):
return self.name

Django1.0官方教程(中文)(转载)

不知道是不是这位仁兄所创,姑且转载之,非常感谢他分享!

1、Django 1.0 中文文档—–指导 第一部分

2、Django 1.0 中文文档—–指导 第二部分 自动生成管理工具

3、Django 1.0 中文文档—–指导 第三部分 发布视图

4、Django 1.0 中文文档—–指导 第四部分 编写表单

此外推荐一本提高书!《Django Book》 中文版地址:http://djangobook.py3k.cn/