直接看 HTTP 请求是直接简单的办法, 前提是解决"登录"问题.
1 .. UCenter的API调用的交互过程
2
3 ======================================
4 UCenter的API调用的交互过程
5 ======================================
6
7 .. 宏定义区
8 .. |date| date::
9 .. 宏定义区结束
10
11 :作者: ZYS
12 :联系: yeshengzou # # gmail.com
13 :日期: |date|
14 :标签: web
15
16 :abstract:
17
18 简单讲解了 UCenter 的 API 调用的交互过程。
19
20 .. contents:: 内容索引 Table of Contents
21 .. section-numbering::
22
23 文中的 ``uc_authcode`` 函数由 http://hi.baidu.com/fledna/blog/ ... d39dc9d00060f8.html 处获取。
24
25
26 最后出去的数据是什么样
27 ======================================
28
29 所谓的 API 调用,无非就是向 UCenter 的一些预定义的地址,按 HTTP 协议,以 POST 方式发出请求。
30
31 以用户登陆为例(实际上我觉得这里说成是用户认证更准备一点):
32
33 * 主机: ``114.112.169.33``
34 * 端口: ``8001``
35 * 地址: ``/dz/index.php``
36 * 方法: ``POST``
37 * 参数:
38
39 * m: ``"user"`` (模块?)
40 * a: ``"login"`` (行为?)
41 * inajax: ``"2"`` (是否为AJAX调用?)
42 * release: ``"20090212"`` (版本号?)
43 * appid: ``"1"`` (在 UCenter 中预定义的appid,它有对应的 **app_key** 用于参数加密)
44 * input: ... (经过 UCenter 自己的 *对称加密算法* 加密的包含相关参数的字符串)
45
46 以上就是一个用户登陆的 API 调用,使用 ``curl`` 来实现的话,形如:
47
48 .. code:: shell
49
50 curl http://114.112.169.33:8001/dz/index.php \
51 -d "m=user&a=login&inajax=2&release=20090212&appid=1\
52 input=4ea84dTR%2FA7zDacjl%2F%2FF6evmMxX%2BsCg%2B%2FxItAs\
53 yGxJ9EoYPYgyVQWbWwZQI9bR342mkbVjKcYHlvZ0GpObOa7Li7\
54 oV0WX8I0X9ceojvfDi%2BiHjCHc41f%2F9cY1i5WUsIyb9cipE\
55 YShCQv9S9ka8Gg8Zoyl3ChF9XlvyNkuzFsHkmwfMpQthNkqP%2\
56 FTeURZFsJKdkLRG%2Ft0hqVfMIiKOg"
57
58 当然,其关键的,还是 ``input`` 这个参数如何得到的问题了。
59
60
61 对称加密算法
62 ======================================
63
64 前面说过, ``input`` 是使用 UCenter 自己的对称加密算法得到的一个字符串(很显然最终是经过 *base64* 编码的),具体的算法就不细说了,可以在网上搜到各种语言的实现。
65
66 如果把算法包装成一个叫 ``uc_authcode`` 的函数的话,那么它的调用过程形如:
67
68 .. code:: python
69
70 uc_authcode(s, 'ENCODE', key='test')
71 uc_authcode(s, 'DECODE', key='test')
72
73 其中:
74
75 * ``s`` 是需要进行加密的字符串,在实际使用中,是经过 URL 编码的一组参数。
76 * ``ENCODE`` 和 ``DECODE`` 是标明进行加密运算还是解密运算。
77 * ``key`` 就是与前面的 ``app_id`` 对应的那个 ``app_key`` ,这个需要 UCenter 提供。
78
79 同样以用户登陆为例,用户登陆的接口需要传送的参数包括有:
80
81 * username: ``'justin'`` (用户名)
82 * password': ``'jjh123'`` (用户密码)
83 * isuid': ``'0'`` (是否是使用的 UID )
84 * checkques': ``'0'`` (是否检查登陆问题)
85 * questionid': ``''`` (问答的 ID )
86 * answer': ``''`` (问题的答案)
87 * agent': ``md5('').hexdigest()`` (客户端的 md5 ,忽视它吧)
88 * time': ``time.time() * 1000`` (当前时间,单位是 **毫秒**)
89
90 我们把以上参数进行 URL 编码后,使用 ``uc_authcode`` 配合 ``app_key`` 进行加密就得到了 ``input`` 了。
91
92 在 Python 中的实现形如:
93
94 .. code:: python
95
96 input_p = {
97 'username': 'justin',
98 'password': 'jjh123',
99 'isuid': '0',
100 'checkques': '0',
101 'questionid': '',
102 'answer': '',
103 'agent': md5('').hexdigest(),
104 'time': time.time() * 1000,
105 }
106 input = uc_authcode(urlencode(input_p), 'ENCODE', key='test')
107
108
109 完整的例子
110 ======================================
111
112 .. code:: python
113
114 # -*- coding: utf-8 -*-
115
116 import httplib
117 from urllib import urlencode
118 import time
119 from hashlib import md5
120 from uc_authcode import uc_authcode
121
122
123 def login():
124 conn = httplib.HTTPConnection('114.112.169.33', 8001)
125 input_p = {
126 'username': 'justin',
127 'password': 'jjh123',
128 'isuid': '0',
129 'checkques': '0',
130 'questionid': '',
131 'answer': '',
132 'agent': md5('').hexdigest(),
133 'time': time.time() * 1000,
134 }
135 input = uc_authcode(urlencode(input_p), 'ENCODE', key='test')
136 p = {
137 'm': 'user',
138 'a': 'login',
139 'inajax': '2',
140 'release': '20090212',
141 'appid': '1',
142 'input': input,
143 }
144
145 conn.request('POST', '/dz/index.php', urlencode(p), {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'})
146 print conn.getresponse().read()
147
148 if __name__ == '__main__':
149 login() |