用户登录,服务器登录接口是q_account.php么?post没反应。。。。

用户登录,服务器登录接口是q_account.php么?post没反应。。。。


不知道用户登录的服务器接口是不是 [url]http://account.178.com/q_account.php[/url]? 我post之后却无回应。我用的用户名和密码的key是v_nickname 和v_pwd。
[@zeg][@吸片]

还有在链接之后加 lite=xml,以获取主题列表的时候。服务器提示未登录。那些不需要登录的板块也这样提示。不知道咋回事。



觙irefox tamper data插件,什么都清清楚楚


[b]Reply to [pid=122425971,6701786,1]Reply[/pid] Post by 吸片 (2013-11-22 23:56)[/b]

那么。那个提示未登录的,该怎么解决啊?下载不下来xml。 [s:37]


从登陆页面来看,应该是
[code]_act=login
to=http://bbs.ngacn.cc
email=username
password=password[/code]
么?
难道是我理解错误?


向[url]http://account.178.com/q_account.php[/url]请求 返回的cookie是类似于这种:
_i=EGe64o1bk*;
_l=138518*;
_178c=7029*;  

但是向[url]http://bbs.ngacn.cc/nuke.php?func=login[/url]请求 返回的cookie是类似于这种:
ngacn0comUserInfo=%25BD%25*;
ngacn0comUserInfoCheck=236918879905*;
ngacn0comInfoCheckTime=1385189289;
_i=21OQIJMa4%2*;
ngaPassportUid=702938;
ngaPassportUrlencodedUname=%25BD%25AD%25B*;


分别用这两个cookie分别访问[url]http://nga.178.com/nuke.php?__lib=login&__act=set_cookie[/url]
结果都会返回NO LOGIN
不知道为啥


[quote][pid=122443398]Reply[/pid] [b]Post by lintx (2013-11-23 13:20):[/b]

从登陆页面来看,应该是<br/>[code]_act=login<br/>to=http://bbs.ngacn.cc<br/>email=username<br/>password=password[/code]<br/>么?<br/>难道是我理解错误?[/quote]
确实是这样的key。 但是从178登录不是实现真的登录,虽然cookie已经有了。主题列表还是读不出来。不知道你是怎么实现的。


[quote][pid=122447556]Reply[/pid] [b]Post by 江湖的骗子 (2013-11-23 15:05):[/b]

向[url]http://account.178.com/q_account.php[/url]请求 返回的cookie是类似于这种:<br/>_i=EGe64o1bk*;<br/>_l=138518*;<br/>_178c=7029*;&nbsp; &nbsp;<br/><br/>但是...[/quote]
昨晚试了一晚。178登录上了,nga还是未登录。主题列表都读不出来,是不是应该在每次发送请求的时候都带上cookie?


API不看,这样也开发?
[quote][pid=120783309]10 登录[/pid]
因为NGA和178使用不同的cookie名字……所以登录了178之后NGA可能依然是未登录状态
这时可以访问
[code]http://nga.178.com/nuke.php?__lib=login&amp;__act=set_cookie[/code]
此地址会接受178的用户信息cookie
服务器会在返回请求时设置nga.178.com使用的cookie
并跳转到bbs.ngacn.cc的同样地址~设置bbs.ngacn.cc使用的cookie
之后访问nga论坛即可变为登录状态 [/quote]

改动



[quote][pid=122455146,6701786,1]Reply[/pid] [b]Post by lintx (2013-11-23 18:20):[/b]

API不看,这样也开发?
[/quote]

我将正确的帐号密码POST到[[url]http://account.178.com/q_account.php[/url]]。 得到的响应头里“Set-Cookie”里是成功的登录信息。得到的cookies里包括_sid、_i、_l、_178c、_e在内。
我将它们分别以header 或 body POST到 [url]http://nga.178.com/nuke.php?__lib=login&__act=set_cookie[/url]。
两种情况下,服务器的响应头里"Set_Cookie" 里都是 ngaPassportUid=guest0529...... 请问是什么原因?纠结好久了。 [s:36]


楼主这是在开发什么平台的客户端


之前我找到两个方法解决

第一种,先从178登录,返回cookie中的_178c,_sid,_e分别对应uid,cid,expires。将这三个参数post到[url]http://bbs.ngacn.cc/nuke.php?func=login[/url],即可得到nga的cookie。

使用node.js实现的部分代码:
[code]
  var ReqSimulator = require('../core/ReqSimulator');
var config = require('../../config');
var simul = new ReqSimulator();
var getMatch = require('../utils/common').getMatch;

/**
* @deprecated 改用RsaLogin登录,简化逻辑
*/
var Login = function (proxy) {
this.proxy = proxy;
return this;
};
/**
* 登录178
*/
Login.prototype.loginSite = function () {
var self = this;
simul.url('https://account.178.com/q_account.php').data(config.loginSite).post(function () {
if (this.getCookiesString()) {
console.log(this._url, this.getCookiesString());
self.proxy.emit('siteCookie', this.getCookiesString());
} else {
self.proxy.emit('error', new Error('登录178失败'));
}
});
};
/**
* 登录nga论坛
*/
Login.prototype.loginNga = function () {
var self = this;
self.proxy.assign('siteCookie', function (siteCookie) {
var data = {
func: 'login',
uid: getMatch(siteCookie, new RegExp(/_178c=(\d*)%23/), 1),
cid: getMatch(siteCookie, new RegExp(/_sid=(\w*);/), 1),
expires: getMatch(siteCookie, new RegExp(/_e=(\d*);/), 1)
};
simul.url('http://bbs.ngacn.cc/nuke.php').data(data).post(function () {
if (this.getCookiesString()) {
console.log(this._url, this.getCookiesString());
self.proxy.emit('ngaCookie', this.getCookiesString());
} else {
self.proxy.emit('error', new Error('登录Nga失败'));
}
});
});
self.loginSite();
};
module.exports = Login;
[/code]

第二种方法,比较简单。通过rsa加密密码,然后发送给一个post请求即可,不需要两次保存cookie。但是还不确定是否通用。
具体原理可以跟踪[url]http://bbs.ngacn.cc/nuke.php?func=login&normal_login[/url]试试。
步骤:
1.发送get请求到[url]http://bbs.ngacn.cc/nuke.php?func=login&normal_login&gs&raw=2[/url],返回的值暂称为gs。  
2.在[url]http://bbs.ngacn.cc/nuke.php?func=login&normal_login[/url]源码的46行和47找到m和e,值是固定的,可以直接拿来用。
3.设置rsa公钥,参数n和e1对应的就是上一步拿到的m和e。
4.加密后的密码 = 制表符 + rsa.encrypt(密码原文 + 制表符 + gs):
[code]
  return '\t' + rsa.encrypt(password + '\t' + gs)
[/code]
5.提交post请求到[url]http://bbs.ngacn.cc/nuke.php?func=login[/url],参数:
[code]
{
'login_type': 'use_name',
'username': 用户名,
'password': 加密后的密码,
'expires': 31536000
};
[/code]
6.最后拿到返回cookie即可。

rsa的加密算法参考[url]http://bbs.ngacn.cc/nuke.php?func=login&normal_login[/url]源代码36-40行的几个脚本。

使用node.js实现的部分代码:
[code]
var ReqSimulator = require('../core/ReqSimulator');
var config = require('../../config');
var simul = new ReqSimulator();
var RSAKey = require('../utils/rsa/rsa').RSAKey;

var loginUrl = 'http://bbs.ngacn.cc/nuke.php?func=login';
var gsUrl = 'http://bbs.ngacn.cc/nuke.php?func=login&normal_login&gs&raw=2';


var encryptPassword = function (password, gs) {
var m = 'ac8035fde4630e011ab3f32f85e85c8eddd7bb5519092e6788f0b6f94995ae86df7078315b00aebefdbf9ed60fdfeed5b8ff41f0899a1d9e98d34669ee88b3eb29061f646017d42970dc020eb87fba0a45c798036a4567077d83e6395b1197ccf80bd621a99dca445d90ab57a1e600e10f6427cf405b474a1933eb8dfbf5009e2f2182c9a7d78d83c1157c397c7eed73c298f8004acef65ffdf89adcc7f5415ce3c755c8ae1e17281b0bcdbfb9ed96ea947e7d25aa2d2e38be10606ed63548e928867eeb797a7c33cded8d5d0319b92a195ef3295262316f6a7114567e794ff06475f24c32442bf022e9d19cea2dd72518e4ff7a571cde7c37fe8bacda00b899';
var e = '10001';
var rsa = new RSAKey();
rsa.setPublic(m, e);
return '\t' + rsa.encrypt(password + '\t' + gs);
};

var AutoRsaLogin = function (proxy) {
this.proxy = proxy;
return this;
};

AutoRsaLogin.prototype.getGs = function () {
var self = this;
simul.url(gsUrl).get(function () {
if (this.getHtml()) {
console.log(this._url, this.getHtml());
self.proxy.emit('gs', this.getHtml());
} else {
self.proxy.emit('error', new Error('获取gs失败'));
}
});
};

AutoRsaLogin.prototype.doLogin = function (username, password) {
var self = this;
self.proxy.assign('gs', function (gs) {
var data = {
'login_type': 'use_name',
'username': username,
'password': encryptPassword(password, gs),
'expires': 31536000
};
console.log(data);
simul.url(loginUrl).data(data).post(function () {
console.log(this.getHtml());
if (this.getCookiesString()) {
console.log(this._url, this.getCookiesString());
self.proxy.emit('ngaCookie', this.getCookiesString());
} else {
self.proxy.emit('error', new Error('登录Nga失败'));
}
});
});
self.getGs();
};

module.exports = AutoRsaLogin;
[/code]

使用javascript(web前端)实现的部分代码:
[code]
define(function (require, exports, module) {
......
var trim = require('utils/common').trim;
var RSAKey = require('utils/rsa/rsa').RSAKey;

var loginUrl = config.nakeServer ? '/api/login' : 'http://bbs.ngacn.cc/nuke.php?func=login';
var gsUrl = config.nakeServer ? '/api/gs' : 'http://bbs.ngacn.cc/nuke.php?func=login&normal_login&gs&raw=2';

var encryptPassword = function (password, gs) {
var m = 'ac8035fde4630e011ab3f32f85e85c8eddd7bb5519092e6788f0b6f94995ae86df7078315b00aebefdbf9ed60fdfeed5b8ff41f0899a1d9e98d34669ee88b3eb29061f646017d42970dc020eb87fba0a45c798036a4567077d83e6395b1197ccf80bd621a99dca445d90ab57a1e600e10f6427cf405b474a1933eb8dfbf5009e2f2182c9a7d78d83c1157c397c7eed73c298f8004acef65ffdf89adcc7f5415ce3c755c8ae1e17281b0bcdbfb9ed96ea947e7d25aa2d2e38be10606ed63548e928867eeb797a7c33cded8d5d0319b92a195ef3295262316f6a7114567e794ff06475f24c32442bf022e9d19cea2dd72518e4ff7a571cde7c37fe8bacda00b899';
var e = '10001';
var rsa = new RSAKey();
rsa.setPublic(m, e);
return '\t' + rsa.encrypt(password + '\t' + gs);
};

var LoginView = BasicView.extend({
...
doLogin: function () {
var self, username ,password;
self = this;
username = self.$el.find('.username').val();
password = self.$el.find('.password').val();
$.get(gsUrl, function (gs) {
var data = {
'login_type': 'use_name',
'username': username,
'password': encryptPassword(password, gs),
'expires': 31536000
};
$.post(loginUrl, data, function (resp) {
var success, msg;
if (resp.match(/登录成功/)) {
success = true;
msg = '登录成功';
} else {
success = false;
if (resp.match(/密码错误/)) {
msg = '密码错误';
} else if (resp.match(/错误尝试过多/)) {
msg = '错误尝试过多,请等待1~30分钟后登录';
} else {
msg = '登录失败';
}
}
alert(msg);
});
});
return false;
},
...
});
module.exports = LoginView;
});

[/code]


楼上高人


[b]Reply to [pid=122675145,6701786,1]Reply[/pid] Post by zhihuzeye (2013-11-27 20:45)[/b]

谢谢 [s:25] 。我已经能够正常登录了,用的第二种的登录地址。第一种我把3个参数post过去,并没有登录成功。所以用到第二种的登录方法。这里面我的密码没有加密,直接post过去也能正常登录。


[quote][pid=122447556,6701786,0]Reply[/pid] [b]Post by 江湖的骗子 (2013-11-23 15:05):[/b]
向[url]http://account.178.com/q_account.php[/url]请求 返回的cookie是类似于这种:
_i=EGe64o1bk*;
_l=13851.......[/quote]


[quote][pid=122447556,6701786,0]Reply[/pid] [b]Post by 江湖的骗子 (2013-11-23 15:05):[/b]
向[url]http://account.178.com/q_account.php[/url]请求 返回的cookie是类似于这种:
_i=EGe64o1bk*;
_l=13851.......[/quote]
Ghh


[quote][pid=122675145,6701786,0]Reply[/pid] [b]Post by zhihuzeye (2013-11-27 20:45):[/b]
之前我找到两个方法解决
第一种,先从178登录,返回cookie中的_178c,_sid,_e分别对应uid,cid,expires。将这三个参数post到[url]http://.......[/quote]


[quote][pid=122769684,6701786,0]Reply[/pid] [b]Post by wwwbbat (2013-11-29 15:14):[/b]

谢谢 [s:25] 。我已经能够正常登录了,用的第二种的登录地址。第一种我把3个参数post过去,并没有登录成功。所以用到第二种的登录方法。这里面我的密码没有加密,直接post过.......[/quote]


[b]Reply to [pid=122769684,6701786,1]Reply[/pid] Post by [uid=3496926]wwwbbat[/uid] (2013-11-29 15:14)[/b]
顶一个。。。


提问这个登录接口适合移动端使用否??