設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 478|回復: 0
打印 上一主題 下一主題

用 python 访问 discuz 论坛

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2022-4-11 20:02:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
直接看 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()
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-5-15 09:42 , Processed in 0.233954 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表