搜索
aardio官方社区 门户 查看主题

inet.whttp 库实现多用户同时登录

发布者: lujjjh | 发布时间: 2011-10-15 15:11| 查看数: 19679| 评论数: 19|帖子模式

很多人在做多用户登录的时候碰到过一个问题,怎么样让多个用户同时登录并且互不影响。有人提出记录 Cookie,再用指定的 Cookie 提交。但是aardio中并不需要你掌握这些,甚至不用知道 Cookie 是什么东西。
aardio中有一个 inet.whttp 库,每个 inet.whttp 对象都是一个独立的会话,互不影响,很容易就能实现这样的效果。例如我创建了两个 inet.whttp 对象,并不会因为其中的一个登录了百度,另一个也受其影响地自动登录了。

下面给出一个简单的应用,其中用到两个不同的帐号登录到 115,待两个帐号都登录后,分别获取这两个帐号的信息,再登出。

import inet.whttp;
clsUser =
class {
   
ctor (username, password) {
        
this.username = username;
        
this.password = password;
        
        
this._whttp = ..inet.whttp();
    }
   
    login =
function () {
        
this._whttp.beginRequest("http://passport.115.com/?ac=login", "POST", "http://www.115.com/");
        
this._whttp.writeHeader("Content-Type: application/x-www-form-urlencoded");
        
this._whttp.disableRedirects();
        
var re, status = this._whttp.send(
            ..string.format(
               
"%s=%s&%s=%s&back=http%%3A%%2F%%2Fwww.115.com&goto=http%%3A%%2F%%2F115.com",
               
"login%5Baccount%5D", encode(this.username),
               
"login%5Bpasswd%5D", encode(this.password)
            )
        );
        
this._whttp.endRequest();
        
return status == 302;
    }
   
    logout =
function () {
        
this._whttp.beginRequest("http://passport.115.com/?ac=logout&goto=http%3A%2F%2F115.com");
        
this._whttp.send();
        
this._whttp.endRequest();
    }
   
    getInfo =
function () {
        
var str = this._whttp.get("http://my.115.com/");
        
var re = {};
        
if (str) {
            re.islogin = !!..string.match(str,
"is_login\:1");
            
if ( ! re.islogin) return re;
            
            re.userid = ..string.match(str,
"user_id\: ""(\d+)");
            re.username = ..string.match(str,
"user_name\: ""([^""]+)");
            re.email = ..string.match(str,
"email\: ""([^""]+)");
            re.isvip = !!..string.match(str,
"is_vip\:  Number('1')");
        }
        
return re;
    }
}

namespace clsUser {
    encode =
function (str) {
        
return ..inet.url.encode( ..string.fromto(str, 65001, 0) );
    }
}

io.open();

var passports = {
    { username =
"aardiotest"; password = "asd123" };
    { username =
"aautest2"; password = "asd123" };
    { username =
"Not_Existing"; password = "123123" };
};

var users = {};

// 遍历所有账户信息,登录所有用户
for (k, v in passports) {
   
var username, password = v["username"], v["password"];
   
   
var user = clsUser(username, password);
   
// 登录用户
    io.stdout.write("正在登录 " + username + "...");
    io.print( user.login() ?
"成功" : "失败" );
   
   
// 记录到 users 表中
    table.push(users, user);
}

// 遍历所有用户,显示信息,并且登出
for (i = 1; #users) {
   
var user = users[ i ];
   
   
// 显示用户信息
    var userInfo = user.getInfo();
   
if (userInfo.islogin) {
        io.print( userInfo[
"username"], table.tostring(userInfo) );
        
        
// 登出
        user.logout();
        io.print( userInfo[
"username"] + "已登出" );
    }
}

评分

参与人数 4专家分 +345 银币 +50 收起 理由
S.G + 10 浅显易懂!
qqmmcc + 100 + 40 很给力!
低调点 + 45 赞一个!
Jacen.He + 200

查看全部评分

最新评论

929589698 发表于 2011-10-15 17:49:42

{:3_59:}赞一个

赞一个
dafei2599 发表于 2011-10-15 18:17:21

太需要了~好哈哈

太需要了~好哈哈
aiwen 发表于 2011-10-16 00:17:44

非常不错,感谢!

非常不错,感谢!
ljtnine 发表于 2011-10-17 14:15:36

感谢分享,支持

感谢分享,支持
tjfuyongjie 发表于 2011-10-18 09:06:06

lujjjh总是给出惊喜,呵呵

lujjjh总是给出惊喜,呵呵
jyb21 发表于 2011-11-22 21:47:04

{:3_59:}呵呵 看起来很吃力

呵呵 看起来很吃力
gggg874 发表于 2011-11-23 08:11:54

好,太好了

好,太好了
guyaping1234 发表于 2012-1-14 15:02:39

请问: ..string.format( "%s=%s&%s=%s&back=http%%3A%%2F%%2Fwww.11

请问:
..string.format(
                "%s=%s&%s=%s&back=http%%3A%%2F%%2Fwww.115.com&goto=http%%3A%%2F%%2F115.com",
                "login%5Baccount%5D", encode(this.username),
                "login%5Bpasswd%5D", encode(this.password)
这个是怎么得到的??

点评

用抓包工具就可以了,或者可以分析网页中的表单  发表于 2012-2-19 15:01
ghl781258 发表于 2012-2-19 11:16:33

仰望中。。。。。

仰望中。。。。。
jyb21 发表于 2012-7-29 01:18:27

再mark一次 明天再看一遍

再mark一次 明天再看一遍
ninja911 发表于 2012-9-22 21:33:54

lujjjh,在么? 我的当前AATUO版本是2.3.2.057,我直接复制你的源码下载,并没有显示出用户信息以及相应的退出操作。 今天问了老大,wht

lujjjh,在么? 我的当前AATUO版本是2.3.2.057,我直接复制你的源码下载,并没有显示出用户信息以及相应的退出操作。

今天问了老大,whttp 是会话独立,但是不会保存cookie。 那么请问,115是不是仅仅判断session,而没有判断cookie呢?
lujjjh 发表于 2012-9-22 21:51:24

[quote][size=2][color=#999999]ninja911 发表于 2012-9-22 21:33[/color] [url=forum.ph

ninja911 发表于 2012-9-22 21:33
lujjjh,在么? 我的当前AATUO版本是2.3.2.057,我直接复制你的源码下载,并没有显示出用户信息以及相应的退 ...

115的接口已经变了,这份代码当然不能用了。不能保存Cookie实际上指的是,不会将持久Cookie保存到文件中,可以理解成所有Cookie都作为会话Cookie来对待。

至于Session,实际上是由Cookie延伸出来的一个东西,其本质还是会话Cookie,特别之处只是在于Session的内容是记录在服务端的,客户端Cookie中记录的只是一个标识符。
以利亚先生丶 发表于 2012-12-11 16:10:06

这代码看着就是高级。。赏析悦目的。。 不过有个问题。我一直很疑惑的是。。 this._whttp = ..inet.whttp(); 这俩 “..”

这代码看着就是高级。。赏析悦目的。。
不过有个问题。我一直很疑惑的是。。
  this._whttp = ..inet.whttp();
这俩 “..” 的含义是什么。经常会看到的例如..io.print
..string.load
这跟
var whttp=inet.whttp()
有啥不同呢?或者说好处
以利亚先生丶 发表于 2014-4-5 18:04:09

虽然现在已经会了。但是时隔这么就,再看一遍这么精简的代码。总是还有些其他收获。谢谢楼主

虽然现在已经会了。但是时隔这么就,再看一遍这么精简的代码。总是还有些其他收获。谢谢楼主
wjmcu 发表于 2014-4-29 10:02:04

太好了

太好了
spy8888 发表于 2014-6-18 19:31:54

好教材 谢谢!!

好教材 谢谢!!
liqidis 发表于 2014-6-21 10:55:06

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=46976&ptid=3633][co

以利亚先生丶 发表于 2012-12-11 16:10
这代码看着就是高级。。赏析悦目的。。
不过有个问题。我一直很疑惑的是。。
  this._whttp = ..inet.wht ...

在命名空间内部访问全局命名空间,需要在前面加上 .. 来表示访问全局命名空间。
badtomato 发表于 2014-6-21 16:35:54

学习了!!!!

学习了!!!!
12下一页

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-11-23 20:54 , Processed in 0.109375 second(s), 19 queries , WinCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表