English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introducción:
Amigos, aquí estamos, últimamente alguien me preguntó cómo simular el inicio de sesión en Weibo para extraer datos, escuché y luego tomé un profundo suspiro, y me dije a mí mismo, es hora de que el viejo hombre salga a escena, por lo que hoy, aproveché el tiempo para organizar y discutir brevemente.
Primero:
Para ingresar a Weibo, es necesario realizar un inicio de sesión previo, es decir, base de la cuenta64Cifrado, encriptación de contraseñas con RSA y solicitudhttp://login.sina.com.cn/sso/prelogin.phpObtener algunos parámetros necesarios para el inicio de sesión a través de un enlace, la cadena devuelta es como:
{"retcode":0,"servertime":1487292003,"pcid":"gz-9e1f24c9acdefb111e1c8078558c7d9c0bf2"nonce":"VHRDG1"pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443"rsakv":"1330428213"is_openlock":0,"lm":1,"smsurl":"https:\"}}/\/login.sina.com.cn\/sso\/msglogin#63;entry=weibo&mobile=18360903574&s=ea7a2e91c5f1d6da7f42aa87fe6963d0","showpin":0,"exectime":222}
A continuación, se muestra el código de procesamiento previo de inicio de sesión:
/** * @author LongJin * @description Información de inicio de sesión inicial<br> Devolver false indica que el inicio inicial ha fallado * @return */ public boolean preLogin(){ boolean flag = false; try { su = new String(Base64.encodeBase64(URLEncoder.encode(username, "UTF-8").getBytes())); String url = "http:";//login.sina.com.cn/sso/prelogin.php#63;entry=weibo&rsakt=mod&checkpin=1&" + "client=ssologin.js(v1.4.5)&_=" + getTimestamp(); url += "&su=" + su; String content; content = HttpUtils.getRequest(client, url); System.out.println("contenido------------" + contenido); JSONObject json = JSONObject.fromObject(content); System.out.println(json); servertime = json.getLong("servertime"); nonce = json.getString("nonce"); rsakv = json.getString("rsakv"); pubkey = json.getString("pubkey"); flag = encodePwd(); } catch (UnsupportedEncodingException e) { System.out.println("Lanzar la excepción UnsupportedEncoding"); } catch (ClientProtocolException e) { System.out.println("抛出ClientProtocol异常"); } catch (IOException e) { System.out.println("抛出IO异常"); } return flag; }
Además:
Después de obtener los parámetros necesarios para el inicio de sesión, utilice la solicitud POSThttp://login.sina.com.cn/sso/login.phpIntroduciendo los datos de procesamiento previo de inicio de sesión como parámetros en la solicitud, se obtuvo el siguiente resultado:
<html> <head> <meta http-equiv="Contenido"-Type" content="text"/html; charset=GBK" /> <title>新浪通行证</title> <script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script> </head> <body> 正在登录 ... <script> try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1518828005"http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]});} catch(e){ var msg = e.message; var img = new Image(); var type = 1; img.src = 'http://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type; }try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://passport.weibo.com/wbsso/login?ssosavestate=1518828005&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&ticket=ST-NTUwODg3MjkxMQ==-1487292005-gz-FF56C545999F864FC6C7AB86FCA9FA4A-1&retcode=0');});} catch(e){ var msg = e.message; var img = new Image(); var type = 2; img.src = 'http://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type; } </script> </body> </html>
然后用正则截取其中我们想要的部分:location.replace('')中间部分,正则表达式为:
String expresión = "ubicación.replace\('([\s\S*?);)'\);";
将正则得到的结果进行处理,如果成功则使用get请求得到的链接,登录部分的代码如下:
/** * @author LongJin * @description 登录 * @return true: 登录成功 */ public boolean login() { if(preLogin()) { String url = "http:";//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15); List<NameValuePair> parms = new ArrayList<NameValuePair>(); parms.add(new BasicNameValuePair("entry", "weibo")); parms.add(new BasicNameValuePair("geteway", ""));1")); parms.add(new BasicNameValuePair("from", "")); parms.add(new BasicNameValuePair("savestate", ""));7")); parms.add(new BasicNameValuePair("useticket", ""));1")); parms.add(new BasicNameValuePair("pagerefer", "http:"));//login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D%2F" parms.add(new BasicNameValuePair("vsnf", ""));1")); parms.add(new BasicNameValuePair("su", su)); parms.add(new BasicNameValuePair("service", "miniblog")); parms.add(new BasicNameValuePair("servertime", servertime)); + "")); parms.add(new BasicNameValuePair("nonce", nonce)); parms.add(new BasicNameValuePair("pwencode", "rsa"));2")); parms.add(new BasicNameValuePair("rsakv", rsakv)); parms.add(new BasicNameValuePair("sp", sp)); parms.add(new BasicNameValuePair("encoding", "UTF-8")); parms.add(new BasicNameValuePair("prelt", "182")); parms.add(new BasicNameValuePair("url", "http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack")); parms.add(new BasicNameValuePair("domain", "sina.com.cn")); parms.add(new BasicNameValuePair("returntype", "META")); try { String contenido = HttpUtils.postRequest(client, url, parms); System.out.println("contenido----------" + contenido); String expresión = "ubicación.replace\('([\s\S*?);)'\);";//\(' ' \) Traducción de caracteres especiales para coincidir con el contenido dentro de (' '')//ubicación.replace([\s\S]*?); Pattern p = Pattern.compile(expresión); Matcher m = p.matcher(contenido); if(m.find()) { System.out.println("ss = ");+m.group()); ubicación = m.group(1); if(ubicación.contains("reason=")) {//Si has llegado a este paso, felicitaciones, has producido un error errInfo = ubicación.substring(ubicación.indexOf("reason=") + 7); errInfo = URLDecoder.decode(errInfo, "GBK"); } System.out.println("ubicación = ");+ubicación); String resultado = HttpUtils.getRequest(client, ubicación);//.substring(2, location.length()-2) int beginIndex = result.indexOf("("); int endIndex = result.lastIndexOf(")"); result = result.substring(beginIndex+1, endIndex);//截取括号里面的json字符串 //content = URLDecoder.decode(content, "UTF-8; JSONObject jsonObject = JSONObject.fromObject(result);//转换为json //获取uniqueid+userdomain用于访问时带的参数 uniqueid = jsonObject.getJSONObject("userinfo").getString("uniqueid"); userdomain = jsonObject.getJSONObject("userinfo").getString("userdomain"); System.out.println("result--------------" + result); return true; } } } catch (ClientProtocolException e) { System.out.println("抛出ClientProtocol异常"); } catch (IOException e) { System.out.println("抛出IO异常"); } } return false; }
补充一下密码加密部分的代码:
private static String sina_js = "var sinaSSOEncoder=sinaSSOEncoder||{};(function(){var hexcase=0;var chrsz=8;this.hex_sha1=function(s){return binb2hex(core_sha1(str2binb(s),s.length*chrsz));};var core_sha1=function(x,len){x[len>>5]|=0x80<<(24-len%32);x[((len+64>>>9)<<4)+15]=len;var w=Array(80);var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;var e=-1009589776;for(var i=0;i /** * La contraseña se encripta con RSA * Devuelve false para indicar que la encriptación ha fallado * @return */ private boolean encodePwd() { Gestor de gestores de scripts sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("javascript"); try { // Usar la encriptación de js, RSA, llamar a métodos internos de js. Aquí uso una cadena, también se puede poner directamente en un archivo y leer, como se muestra en los comentarios a continuación. se.eval(sina_js); //Llamar a la función interna de js para encriptar if (se instanceof Invocable) { Invocable iv = (Invocable) se; sp = (String) iv.invokeFunction("getpass", this.password, this.servertime, this.nonce, this.pubkey); } /* FileReader fr = new FileReader("E:\\encoder.js"); se.eval(fr); Invocable invocableEngine = (Invocable) se; String callbackvalue = (String) invocableEngine.invokeFunction("encodePwd", pubkey, servertime, nonce, password); sp = callbackvalue;*/ return true; } catch (ScriptException e) { // TODO Auto-bloque de captura de excepciones generado //e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-bloque de captura de excepciones generado //e.printStackTrace(); } errInfo = "¡Fallo en la encriptación de la contraseña!"; return false; } /** * @author LongJin * @description Devuelve la información de error * @return */ public String getErrInfo() { return errInfo; }La parte de inicio de sesión se ha completado básicamente.
Finalmente, realicemos una prueba de inicio de sesión y captura de datos:
public static void main(String[] args) throws ClientProtocolException, IOException { SinaWeibo weibo = new SinaWeibo("**", ", "}}***;//Las contraseñas y nombres de usuario no se revelarán aquí if(weibo.login()) { System.out.println("¡Éxito de inicio de sesión!"); InputStream con= HttpUtils.getRequests(client, "http://weibo.com/u/"+uniqueid+userdomain);//Obtener el flujo de entrada solicitando la página personal String cont = readStreamByEncoding(con, "UTF-8;//Convertir el flujo de entrada devuelto en una cadena String sb = HttpUtils.getText(cont);//Obtener el contenido de la parte de texto a través de jsoup //readStreamOutFileByEncoding(sb); también se puede escribir el contenido obtenido en un archivo } System.out.println("¡Fallo de inicio de sesión!"); } }El resultado obtenido es:
text--------------Voté por la opción "Yi Jianlian" . #MVP local # El grupo de selección del MVP de la temporada regular de la liga local está compuesto por miembros de la Comisión de Noticias de la Federación de Baloncesto de China, representantes de los medios locales recomendados por los clubes, Sina tiene un voto y enviaremos las opiniones de los fans a la federación. ¿Quién es el MVP local de esta temporada? #63;63;63;63;Se ha completado el inicio de sesión completo, espero que se den muchas sugerencias para mejorar.
Esto es todo el contenido del artículo, espero que el contenido de este artículo pueda ayudar a todos a aprender o trabajar. También espero que todos den más apoyo al tutorial de clamor!
Aviso: el contenido de este artículo se ha obtenido de la red, pertenece a los propietarios originales, el contenido ha sido contribuido y subido por usuarios de Internet de manera autónoma, este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.