Java模拟登陆微博获取cookie+使用微博图床api上传图片

前言

Wbp4j

前排安利以下使用java完成的基于微博图床api实现的一个上传图片的小轮子,然后里面也有完整的代码可以查看,欢迎戳一下~ 传送门

目的

因为最近个人小项目里需要上传图片,看着自己的1M小水管产生了使用微博图床的念头,然后就开干了。

废话

老夫写代码复制粘贴就是干,结果一搜几乎都是php跟python
image
语言而已嘛!道理是相通的问题不大的(疯狂暗示

登陆

站在巨人的肩膀上确实是能轻松不少,经过搜索引擎的指引我们知道微博登录分两个步骤 ,第一个是预登陆,获取相关的登录信息之后再登录

预登陆

去微博首页随便填个用户名,然后通过抓包可以发现
image
这有一个神奇的prelogin请求,这就是我们想要的

https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTkxNjE1MjM0NSU0MHFxLmNvbQ%3D%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1528984661146

再看一下参数,一眼(?)就能看出 一下两个参数是我们需要的
image
su:base64后的用户名
_:时间戳

这就好办了,拼接一下~

private PreLogin preLogin() throws IOException {
        String preLoginUrl = "https://login.sina.com.cn/sso/prelogin.php?";
        String base64Username = Base64.getEncoder().encodeToString(username.getBytes());
        String params = "entry=weibo&su=" + base64Username + "MTIzNDU2&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=";
        String url = preLoginUrl + params + System.currentTimeMillis();
}

然后这里假装GET了一下那个url,返回的是一段json
image

然后再保存一下这些信息,然后预登陆就完成啦,是不是挺简单呢
image
到这里确实还是简单的,但是到后面就蛋疼了

登录

首先来看一下预登陆返回的json

{
    "retcode":0,
    "servertime":1528984659,
    "pcid":"yfe839c398fb963099182103a19af18353ce05",
    "nonce":"VOMF8H",
    "pubkey":"EB2A38568661887FA1...3181D6442443",
    "rsakv":"1330428213",
    "is_openlock":0,
    "showpin":0,
    "exectime":13
}

emmm就看一下,这些都有啥用接下来说,然后我们再来登录一下看看都发了些什么东西
image

里面有几个字段是根据prelogin返回的内容发回去的所以不用管,就是那个sp是个啥玩意呢,虽然我知道是密码没错,看到rsa2,看到pubkey就觉得事实并非这么简单,根据搜索引擎的指引,我们找到微博用于登录的加密密码的js
image
这是密码加密的核心代码了
然后对着写不就完事了嘛,当然是这么想的
看着别人python的rsa.encode(pubkey,*啥)的

由于个人对加密这一块几乎没啥概念,所以只能继续依靠搜索引擎的能力的,找了半天使用java加密微博密码的,要么是直接用脚本引擎去执行以上的js代码,要么就是自己用浏览器登录后再把cookie复制粘贴,emmm,作为全自动的模拟登陆不能忍,然后花了一个下午去摸索终于成功了,不想多说了直接贴代码吧,反正我也解释不来为啥这么干

以下哪个pubExp我也不知道叫啥随便起的名字,对应着以上js的那个"10001"

public static String encode(String toEncode, String pubKey, String pubExp)
        throws NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidKeySpecException, InvalidKeyException, BadPaddingException,
        IllegalBlockSizeException {

    KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
    BigInteger modulus = new BigInteger(pubKey, 16);
    BigInteger publicExponent = new BigInteger(pubExp, 16);
    RSAPublicKeySpec rsaPublicKeySpec = new RSAPublicKeySpec(modulus, publicExponent);
    PublicKey publicKey = keyFactory.generatePublic(rsaPublicKeySpec);
    Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] encodeStr = cipher.doFinal(toEncode.getBytes());
    return BytesUtils.bytesToHex(encodeStr);
}

然后最难的步骤已经成功啦,接下来只需要把对应的参数填上去就ok啦,然后再post就完事啦~

使用springboot做基础框架,提供简单页面做图片上传,接口直接模拟微博登陆,上传完成后返回图片保存链接 public String getSinaCookies() { String base64name = Base64Utils.encodeToString(username.getBytes()); String loginUrl = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543"; String params = "entry=sso&gateway=1&from=null&savestate=30&useticket=0&pagerefer;=&vsnf=1&su;=" + base64name; params += "&service=sso&sp;=" + password + "&sr=1920*1080&encoding=UTF-8&cdult=3&domain=sina.com.cn&prelt=0&returntype=TEXT"; //登录 try { URL url = new URL(loginUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); OutputStream out = conn.getOutputStream(); out.write(params.getBytes()); out.flush(); out.close(); String sessionId = ""; String cookieVal = ""; String key = null; //取cookie for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) { if (key.equalsIgnoreCase("set-cookie")) { cookieVal = conn.getHeaderField(i); cookieVal = cookieVal.substring(0, cookieVal.indexOf(";")); sessionId = sessionId + cookieVal + ";"; } } if (sessionId != null) { String[] cookiearr = sessionId.split(";"); for (int i = 0; i < cookiearr.length; i++) { if (cookiearr[i].startsWith("SUB") && !cookiearr[i].startsWith("SUBP")) { sessionId = cookiearr[i] + ";"; } } } return sessionId; } catch (Exception e) { e.printStackTrace(); return null; } }
使用Java实现模拟微博登录并保存Cookie的过程可以参考以下示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; public class CookieSimulation { public static void main(String[] args) { try { // 1. 发送GET请求获取登录页面 String loginUrl = "https://weibo.com/login.php"; URL url = new URL(loginUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 2. 获取响应中的Cookie Map<String, List<String>> headerFields = connection.getHeaderFields(); List<String> cookies = headerFields.get("Set-Cookie"); StringBuilder cookieBuilder = new StringBuilder(); if (cookies != null) { for (String cookie : cookies) { cookieBuilder.append(cookie).append("; "); } } String cookie = cookieBuilder.toString(); // 3. 构造POST请求参数 String postData = "username=your_username&password=your_password"; // 4. 发送POST请求模拟登录 URL loginPostUrl = new URL("https://weibo.com/login.php"); HttpURLConnection loginPostConnection = (HttpURLConnection) loginPostUrl.openConnection(); loginPostConnection.setRequestMethod("POST"); loginPostConnection.setRequestProperty("Cookie", cookie); loginPostConnection.setDoOutput(true); loginPostConnection.getOutputStream().write(postData.getBytes()); // 5. 获取登录结果 int responseCode = loginPostConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 登录成功,可以继续后续操作 // 6. 发送其他请求时,将保存的Cookie添加到请求头中 URL otherUrl = new URL("https://weibo.com/other"); HttpURLConnection otherConnection = (HttpURLConnection) otherUrl.openConnection(); otherConnection.setRequestProperty("Cookie", cookie); // 7. 处理其他请求的响应 // ... } else { // 登录失败,处理失败情况 // ... } } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,这只是一个简单示例,实际的微博登录可能涉及更复杂的流程和参数。您可能需要根据微博登录页面的具体情况进行适当的修改。此外,使用爬虫时要遵守网站的规则,并确保您的行为合法和道德。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值