- 浏览: 184486 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
为什么昵称都叫没了:
对的,我也在做微信公众平台的开发,发现一个简单的教程 http ...
微信公众平台API -
guji528:
想找一个好一点的调试器,不知eric是否OK,有空再研究一下
Eric IDE安装 -
youyang:
受教了,不得不顶。
NoSQL非关系数据库简介 -
zhongzhai:
谢谢分享,波一个
Java中的UDP协议编程 -
huwenbiao2010:
有实现JPopupMenu透明的案例不,发个给我 ,谢谢了 , ...
一道笔试题
两个不错的Python Fetion的东西,现在我还不懂,转贴到这里,以后再研究研究。。
1. It's so large, so I have to copy hyperlink here.
http://code.google.com/p/pytool/source/browse/trunk/PyFetion/PyFetion.py
Home page: http://cocobear.info/blog/2008/12/03/write-fetion-with-python-pyfetion/
2. Copy the source code here.
#----------------------------------------------------------------------------------------------------------------------
#!/usr/bin/env python
# -*- coding: gbk -*-
import binascii
import hashlib
import re
import StringIO
import urllib
import urllib2
import uuid
import xml.etree.ElementTree as ET
from getpass import getpass
from optparse import OptionParser
FETION_URL = 'http://221.130.45.203/ht/sd.aspx'
FETION_SIPC = '221.130.45.203:8080'
FETION_LOGIN_URL = 'https://nav.fetion.com.cn/ssiportal/SSIAppSignIn.aspx'
FETION_CONFIG_URL = 'http://nav.fetion.com.cn/nav/getsystemconfig.aspx'
FETION_SIPP = 'SIPP'
DEBUG = False
class Fetion:
ssic = ''
sid = ''
domain = ''
call = 0
seq = 0
guid = None
contacts = []
def __init__(self, mobileno, password):
self.mobileno = mobileno
self.password = password
self.http_tunnel = FETION_URL
self.sipc_proxy = FETION_SIPC
def login(self):
re_ssic = re.compile('ssic=(.*?);')
re_sid = re.compile('sip:(\d+)@(.+);')
login_url = FETION_LOGIN_URL
data = {'mobileno' : self.mobileno, 'pwd' : self.password}
conn = urllib2.urlopen(login_url, urllib.urlencode(data))
# Get ssic
headers = str(conn.headers)
res = re_ssic.findall(headers)
if res:
ssic = res[0]
response = conn.read()
# Get other attribs from response
xmldoc = ET.XML(response)
status_code = xmldoc.attrib['status-code']
user_node = xmldoc.find('user')
uri = user_node.attrib['uri']
mobile_no = user_node.attrib['mobile-no']
user_status = user_node.attrib['user-status']
# get sid and domain from uri
res = re_sid.findall(uri)
if res:
sid, domain = res[0]
self.ssic = ssic
self.sid = sid
self.domain = domain
def http_register(self):
arg= '<args><device type="PC" version="0"
client-version="3.1.0480" /><caps
value="fetion-im;im-session;temp-group" /><events
value="contact;permission;system-message" /><user-info
attributes="all" /><presence><basic value="400" desc=""
/></presence></args>'
_call = self.next_call()
# request 1
_url = self.next_url('i')
response = self.send_request(_url, FETION_SIPP)
# request 2
msg = self.create_sip_data('R fetion.com.cn SIP-C/2.0',
(('F',self.sid), ('I',_call), ('Q','1 R')), arg) + FETION_SIPP
_url = self.next_url()
response = self.send_request(_url, msg)
# request 3
_url = self.next_url()
response = self.send_request(_url, FETION_SIPP)
re_nonce = re.compile('nonce="(\w+)"')
nonce = re_nonce.findall(response)[0]
# request 4
_cnonce = self.calc_cnonce() # calculate cnonce
_response = self.calc_response(nonce, _cnonce) # calculate response
_salt = self.calc_salt() # calculate salt
msg = self.create_sip_data('R fetion.com.cn SIP-C/2.0', (('F',
self.sid), ('I',_call), ('Q', '2 R'), ('A', 'Digest
algorithm="SHA1-sess",response="%s",cnonce="%s",salt="%s"' %
(_response, _cnonce, _salt))), arg) + FETION_SIPP
_url = self.next_url()
response = self.send_request(_url, msg)
# request 5
_url = self.next_url()
response = self.send_request(_url, FETION_SIPP)
def get_contacts_list(self):
arg = '<args><contacts><buddy-lists
/><buddies attributes="all" /><mobile-buddies
attributes="all" /><chat-friends /><blacklist
/></contacts></args>'
_call = self.next_call()
msg = self.create_sip_data('S fetion.com.cn SIP-C/2.0',
(('F',self.sid), ('I',_call), ('Q','1 S'), ('N','GetContactList')),
arg) + FETION_SIPP
_url = self.next_url()
self.send_request(_url, msg)
_url = self.next_url()
response = self.send_request(_url, FETION_SIPP)
re_contacts = re.compile('uri="(sip[^"]+)"')
res = re_contacts.findall(response)
return res
def get_contacts_info(self, contacts_list):
if contacts_list:
arg = '<args><contacts attributes="all">'
for contact in contacts_list:
arg += '<contact uri="%s" />' % contact
arg += '</contacts></args>'
_call = self.next_call()
msg = self.create_sip_data('S fetion.com.cn SIP-C/2.0',
(('F',self.sid), ('I',_call), ('Q','1 S'), ('N','GetContactsInfo')),
arg) + FETION_SIPP
_url = self.next_url()
self.send_request(_url, msg)
_url = self.next_url()
response = self.send_request(_url, FETION_SIPP)
re_info = re.compile('uri="([^"]+)".*?mobile-no="([^"]+)"')
res = re_info.findall(response)
for contact in contacts_list:
if not filter(lambda x: x[0] == contact, res):
res.append((contact, ''))
self.contacts = res
def get_contact_sid(self, info):
sid = None
if info[:4] == 'sip:':
sid = filter(lambda x: x[0] == info, self.contacts)
elif len(info) == 9:
sid = filter(lambda x: x[0][4:13] == info, self.contacts)
elif len(info) == 11:
sid = filter(lambda x: x[1] == info, self.contacts)
return sid and sid[0][0] or None
def get_system_config(self):
msg = '<config><user mobile-no="%s" /><client
type="PC" version="3.2.0540" platform="W5.1" /><servers
version="0" /><service-no version="0" /><parameters
version="0" /><hints version="0" /><http-applications
version="0" /></config>' % self.mobileno
request = urllib2.Request(FETION_CONFIG_URL, data=msg)
conn = urllib2.urlopen(request)
response = conn.read()
xmldoc = ET.parse(StringIO.StringIO(response))
result = xmldoc.find('//http-tunnel').text
if result:
self.http_tunnel = result
result = xmldoc.find('//sipc-proxy').text
if result:
self.sipc_proxy = result
def send_sms(self, to, content):
_call = self.next_call()
msg = self.create_sip_data('M fetion.com.cn SIP-C/2.0',
(('F',self.sid), ('I',_call), ('Q','1 M'), ('T',to), ('N','SendSMS')),
content) + FETION_SIPP
_url = self.next_url()
self.send_request(_url, msg)
_url = self.next_url()
response = self.send_request(_url, FETION_SIPP)
if 'Send SMS OK' in response:
return True
else:
return False
def send_cat_sms(self, to, content):
_call = self.next_call()
msg = self.create_sip_data('M fetion.com.cn SIP-C/2.0',
(('F',self.sid), ('I',_call), ('Q','1 M'), ('T',to),
('N','SendCatSMS')), content) + FETION_SIPP
_url = self.next_url()
self.send_request(_url, msg)
_url = self.next_url()
response = self.send_request(_url, FETION_SIPP)
if 'Send SMS OK' in response:
return True
else:
return False
def send_request(self, url, data):
if not self.guid:
self.guid = str(uuid.uuid1())
headers = {
'User-Agent' : 'IIC2.0/pc 3.1.0480',
'Cookie':'ssic=%s' % self.ssic,
'Content-Type' : 'application/oct-stream',
'Pragma' : 'xz4BBcV%s' % self.guid,
}
request = urllib2.Request(url, headers=headers, data=data)
conn = urllib2.urlopen(request)
response = conn.read()
if DEBUG:
print 'DEBUG'.center(78, '*')
print 'URL:', url
print 'Data:', data
print 'Response:', response
print 'DEBUG'.center(78, '*')
print
return response
def create_sip_data(self, invite, fields, arg=''):
sip = invite + '\r\n'
for k, v in fields:
sip += '%s: %s\r\n' % (k, v)
sip += 'L: %s\r\n\r\n%s' % (len(arg), arg)
return sip
def next_call(self):
self.call += 1
return self.call
def next_url(self, t='s'):
self.seq += 1
return '%s?t=%s&i=%s' % (self.http_tunnel, t, self.seq)
def calc_cnonce(self):
md5 = hashlib.md5()
md5.update(str(uuid.uuid1()))
return md5.hexdigest().upper()
def hash_password(self):
salt = '%s%s%s%s' % (chr(0x77), chr(0x7A), chr(0x6D), chr(0x03))
sha1 = hashlib.sha1()
sha1.update(self.password)
src = salt + sha1.digest()
sha1 = hashlib.sha1()
sha1.update(src)
return '777A6D03' + sha1.hexdigest().upper()
def calc_response(self, nonce, cnonce):
hashpassword = self.hash_password()
binstr = binascii.unhexlify(hashpassword[8:])
sha1 = hashlib.sha1()
sha1.update('%s:%s:%s' % (self.sid, self.domain, binstr))
key = sha1.digest()
md5 = hashlib.md5()
md5.update('%s:%s:%s' % (key, nonce, cnonce))
h1 = md5.hexdigest().upper()
md5 = hashlib.md5()
md5.update('REGISTER:%s' % self.sid)
h2 = md5.hexdigest().upper()
md5 = hashlib.md5()
md5.update('%s:%s:%s' % (h1, nonce, h2))
return md5.hexdigest().upper()
def calc_salt(self):
return self.hash_password()[:8]
def SendSMS(mobile,password,to,body):
fetion = Fetion(mobile, password)
fetion.get_system_config()
fetion.login()
fetion.http_register()
fetion.get_contacts_info(fetion.get_contacts_list())
if to:
sid = fetion.get_contact_sid(to)
if not sid:
sid = to
if sid:
if fetion.send_cat_sms(sid, body):
print 'Sent SMS'
else:
print 'Error occurs'
def main():
# create a options parser
parser = OptionParser()
parser.add_option('-m', '--mobile', dest='mobile', type='string',
help='mobile phone number')
parser.add_option('-p', '--password', dest='password', type='string',
help='login password')
parser.add_option('-t', '--to', dest='to', type='string',
help='SMS to')
parser.add_option('-b', '--body', dest='body', type='string',
help='SMS body')
parser.add_option('-l', '--long-body', dest='lbody', type='string',
help='SMS long body')
(options, args) = parser.parse_args()
# handle options
if not options.mobile:
parser.error('-m option is required')
mobile = options.mobile
if not options.password:
password = getpass()
else:
password = options.password
fetion = Fetion(mobile, password)
fetion.get_system_config()
fetion.login()
fetion.http_register()
fetion.get_contacts_info(fetion.get_contacts_list())
if options.to:
sid = fetion.get_contact_sid(options.to)
if not sid:
sid = options.to
if sid:
if options.body:
if fetion.send_sms(sid, options.body):
print 'Sent SMS'
else:
print 'Error occurs'
elif options.lbody:
if fetion.send_cat_sms(sid, options.lbody):
print 'Sent SMS'
else:
print 'Error occurs'
if __name__ == '__main__':
body_unicode = u"Send mail content"
body_unicode *= 10
body_utf = body_unicode.encode('utf-8')
#s.encode('utf-8')
#s.encode('utf8')
#s = unicode(s,"cp936")
SendSMS('13557715959','550505','13551505755',body_utf)
#--------------------------------------------------------------------------------------------------------------------------
发表评论
-
Python 操作注册表
2013-11-21 14:26 815通过Python操作注册表有两种方式,第一种 ... -
mac osx 10.8.2编译mod_wsgi的问题修复
2013-03-05 02:13 912错误提示: $ make /usr/sbin/ap ... -
Eric IDE安装
2011-06-01 09:31 2944参考了两篇文章,汇总了一下: http://h ... -
如何使用Python搭建高性能的Web网站
2010-05-12 11:25 2208一篇老文章,值得参考。 http://www ... -
import 初探 —— 导入 Package
2009-08-25 17:13 872众所周知,import 也许是 Python 中最 ... -
Python mysql 中文乱码
2009-02-26 15:18 1311import MySQLdbdb_user = "t ... -
python调用系统命令
2009-02-25 18:47 58211.os.system()例如:os.system('ls') ...
相关推荐
PythonFetion客户端是一款利用Python编程语言开发的飞信(Fetion)应用程序。飞信是中国移动推出的一款即时通讯服务,允许用户通过短信、互联网等方式进行免费或低成本的通信。这款Python实现的客户端旨在为用户提供...
在这个压缩包文件中,我们看到的是一个针对飞信3.0版本的修改版,名为"Fetion 3_fetion java_fetion3",特别强调了"HighlinZhu"的修改,以及加入了“震动”功能和进行了“窗口优化”。 1. **飞信3.0基础功能**: -...
【标题】"fetion.rar_fetion_visual c" 涉及的IT知识点主要集中在飞信(Fetion)的客户端开发以及使用Visual C#编程语言实现通过Web URL发送短信的功能。 飞信是中国移动推出的一款即时通讯软件,允许用户通过网络...
标题中的“PHP Fetion 类 可以用”指的是在PHP编程语言中存在一个Fetion类,这个类可能被用于处理与中国移动飞信(Fetion)服务相关的交互。飞信是中国移动推出的一种即时通讯工具,允许用户通过手机或电脑进行文字...
标题“开源 Fetion api java”指的是一个开源的Java API,用于与Fetion(飞信)服务进行交互。Fetion是一种由中国移动推出的即时通讯软件,允许用户通过互联网或手机发送短信、语音消息以及进行语音通话。这个API...
标题中的“fetion.rar_fetion”暗示了一个与飞信相关的项目,飞信是一款由中国移动推出的即时通讯软件,允许用户免费发送短信、进行语音聊天等。在这个项目中,使用了Python编程语言来实现发送飞信的功能。描述提到...
final Fetion fetion = new Fetion("phone","password"); fetion.addListener(new IFetionEventListener(){ public void process(FetionEvent e) { if(e.getFirstLine()!=null && e.getFirstLine...
fetion.sendSms2SelfPhone("给自己发个试哈^_^..."); //fetion.logout(); } } 为了怕玩的人多了,移动服务器发现,请大家测试自己的手机玩,尽量少发 一切后果自负... 无奈啊.......... 欢迎到这 ...
1. 需要包含进你的程序的文件只有一个:PHPFetion.php。如: require 'PHPFetion.php'; 2. 调用方法如: $fetion = new PHPFetion('13500001111', '123123'); // 手机号、飞信密码 $fetion->send('13500001111', ...
fetion mrp
Linux版的"Fetion_for_x64"是一款专为64位Linux操作系统设计的飞信客户端,它允许用户在Linux环境下发送短信至手机。飞信,全称中国移动飞信,是中国移动推出的一种融合语音(IVR)、短信、GPRS等多种通信方式的即时...
"Fetion.jar"是一个基于Java平台的应用程序,它利用Java的可移植性,使得该飞信客户端可以在多种操作系统上运行,包括但不限于Windows、Linux和Mac OS。Java应用程序通常以.jar(Java Archive)格式打包,这样可以将...
综合以上分析,这个"Fetion.rar_fetion_love"压缩包是一个结合了飞信服务与情感元素的打包资源,包含了一个可能的飞信客户端安装程序和一个来自pudn.com的文本文件。用户可以通过解压和运行Fetion.exe来体验与飞信...
Fetion_3.4.3_ty.jar
这里的"Fetion服务端(windows\linux)"表明该服务端实现了跨操作系统平台的支持,既能在Windows系统上运行,也能在Linux系统上运行,这通常需要采用跨平台的开发工具和语言,如Java或Python。 2. **PHP短信发送...
在“Fetion.rar_fetion_fetion Visual Basic_飞信”这个压缩包中,我们可以看到与飞信相关的编程资源,特别是与Visual Basic的结合,这表明它是关于如何使用Visual Basic来控制和操作飞信的教程或者代码示例。...
飞信是中国移动推出的一款通信软件,全称为"Fetion",在2008年时的版本为"Fetion_2008"。这款应用旨在提供便捷、高效的即时通讯服务,尤其注重融合手机与互联网的通讯体验。下面将详细阐述飞信的主要功能、发展历程...
标签“fetion”和“飞信”进一步确认了我们讨论的主题,这两个标签通常与移动通信和免费短信服务关联,也是飞信品牌的主要标识。 至于压缩包子文件的文件名称“LibFetion”,这很可能是飞信客户端的库文件或者动态...
而“fetion.zip_fetion php”这个标题暗示我们这里有一个使用PHP编写的飞信客户端或者服务端的程序。 PHP是一种广泛使用的开源服务器端脚本语言,特别适合于Web开发,可以嵌入到HTML中。在这个场景中,"fetion.php"...
标题"Fetion.zip_fetion CSharp"指出这是一个与飞信相关的C#编程项目,而“飞信”是中国电信推出的一款即时通讯软件,允许用户通过网络免费向中国移动、联通、电信的手机用户发送短信。"CSharp"表示这里的实现是使用...