💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
weibo.com 提供公开的 API窗口。 我们可以利用这个API来登录。 本小节放到了 httplib2下面;但实际上我用一个新的库来完成这个操作。 它就是:requests。 很多人都觉得urllib, httplib不太好用。 requests出现相对来说比较晚,使用起来方便很多。 网址:http://docs.python-requests.org/en/latest/ requests 是需要安装的。 ~~~ sudo easy_install requests ~~~ ### 登录weibo.com原理 我们通过一个登录weibo.com的例子来说明。 登录weibo.com的原理见: [http://www.douban.com/note/201767245/](http://www.douban.com/note/201767245/) [http://blog.vsharing.com/liyu2012/A1447194.html](http://blog.vsharing.com/liyu2012/A1447194.html) 为了防止以上文章被删除,我转载到本站论坛: [http://uliweb.clkg.org/forum/3/168](http://uliweb.clkg.org/forum/3/168) [http://uliweb.clkg.org/forum/3/169](http://uliweb.clkg.org/forum/3/169) 摘抄重要的原理部分: ~~~ 1, 在提交POST请求之前, 需要GET 获取两个参数。 地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18) 得到的数据中有 "servertime" 和 "nonce" 的值, 是随机的,其他值貌似没什么用。 2, 通过httpfox 观察POST 的数据, 参数较复杂,其中 “su" 是加密后的username, "sp"是加密后的password。"servertime" 和 ”nonce" 是上一步得到的。其他参数是不变的。 username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1]; password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。 即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。 ~~~ ### 用 request的session登录 这样后来的每次访问都可以继承以前的session,系统会保存一些登录信息。 ~~~ session = requests.session( headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHT' 'ML, like Gecko) Chrome/21.0.1180.89 Safari/537.1' } ) resp = session.get( 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sina' 'SSOController.preloginCallBack&su=%s&client=%s' % (base64.b64encode(username), WBCLIENT) ) ~~~ 上面的步骤是取得 "servertime" 和 "nonce" 的值 通过正则表达式,分离出 servertime,nonce。。。 ~~~ pre_login_str = re.match(r'[^{]+({.+?})', resp.content).group(1) pre_login_json = json.loads(pre_login_str) ~~~ ### 登录请求的数据 ~~~ data = { 'entry': 'weibo', 'gateway': 1, 'from': '', 'savestate': 7, 'useticket': 1, 'ssosimplelogin': 1, 'su': base64.b64encode(urllib.quote(username)), 'service': 'miniblog', 'servertime': pre_login_json['servertime'], 'nonce': pre_login_json['nonce'], 'pcid': pre_login_json['pcid'], 'vsnf': 1, 'vsnval': '', 'pwencode': 'wsse', 'sp': sha1(sha1(sha1(password)) + str(pre_login_json['servertime']) + pre_login_json['nonce']), 'encoding': 'UTF-8', 'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.si' 'naSSOController.feedBackUrlCallBack', 'returntype': 'META' } ~~~ ### 开始登录 ~~~ resp = session.post( 'http://login.sina.com.cn/sso/login.php?client=%s' % WBCLIENT, data=data ) ~~~ ### 登录成功后获取用户信息 ~~~ login_url = re.search(r'replace\([\"\']([^\'\"]+)[\"\']', resp.content).group(1) resp = session.get(login_url) login_str = re.match(r'[^{]+({.+?}})', resp.content).group(1) ~~~ ### 查看用户 uid 并且通过uid访问用户的页面 ~~~ uid = login_info['userinfo']['uniqueid'] url = "http://weibo.com/u/"+uid resp = session.get(url) ~~~