2023最新Java获取微博cookie,可用于爬取文章(扫码登录)

目录

文章最下面含有完整main类代码,和完整控制层代码

一、发送请求获取图片和qrid

二、发送请求确认二维码已被正确扫描

三、携带拿到的alt,发送登录请求,获取cookie

 四、main类完整方法代码

五、控制层接口完整代码


文章最下面含有完整main类代码,和完整控制层代码

一、发送请求获取图片和qrid

这里注意一定要加请求头,不然会被微博拦截

HttpResponse response = HttpUtil.createGet("https://login.sina.com.cn/sso/qrcode/image?entry=weibo&size=180&callback=STK_17017598656821").header("Referer", "https://weibo.com/").execute();System.out.println(response);String regex = "\"qrid\":\"([^\"]+)\"";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(response.body());String qrid = "";if (matcher.find()) {qrid = matcher.group(1);} else {System.out.println("qrid not found");}System.out.println(qrid);String jsonText = response.body().substring(response.body().indexOf("(") + 1, response.body().lastIndexOf(")"));JSONObject jsonObject = JSON.parseObject(jsonText);String image = jsonObject.getJSONObject("data").getString("image");System.out.println("https" + image);String imageUrl = "https:" + image;String base64Image = convertImageToBase64(imageUrl);System.out.println(base64Image);

转成base64,如果要集成网页系统,可以直接将url返回给前端,可以直接显示,微博没有再做拦截

    public static String convertImageToBase64(String imageUrl) {InputStream inputStream = null;
ByteArrayOutputStream outputStream = null;try{URL url = new URL(imageUrl);inputStream = url.openStream();outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}catch (Exception e){System.out.println("图片转换异常");} finally {IoUtil.close(inputStream);IoUtil.close(outputStream);}byte[] imageBytes = outputStream.toByteArray();return Base64.getEncoder().encodeToString(imageBytes);}

二、发送请求确认二维码已被正确扫描

发送请求带上你的获取alt加密参数+时间戳

  String alt = "";while (true) {String url = "https://login.sina.com.cn/sso/qrcode/check?entry=sso&qrid=" + qrid + "&callback=STK_" + System.currentTimeMillis();HttpResponse response1 = HttpUtil.createGet(url).header("Referer", "https://weibo.com/").execute();try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {System.out.println("睡眠异常");}System.out.println(response1.body());String jsonData1 = response1.body().substring(response1.body().indexOf("(") + 1, response1.body().lastIndexOf(")"));JSONObject jsonObject1 = JSON.parseObject(jsonData1);int retcode = jsonObject1.getIntValue("retcode");if (retcode == 20000000) {alt = jsonObject1.getJSONObject("data").getString("alt");System.out.println("alt: " + alt);break;}if (retcode == 50114004 || retcode == 50114015) {return;}}

三、携带拿到的alt,发送登录请求,获取cookie

首先拼接上alt和时间戳发送请求,返回是三个链接,三个链接之中两个没有action=login的,这个一定要拼上,没有的话cookie无效

        String altUrl = "https://login.sina.com.cn/sso/login.php?entry=qrcodesso&returntype=TEXT&crossdomain=1&cdult=3&domain=weibo.com&alt=" + alt + "&savestate=30&callback=STK_" + System.currentTimeMillis();HttpResponse response1 = HttpUtil.createGet(altUrl).execute();System.out.println(response1.body());String jsonData1 = response1.body().substring(response1.body().indexOf("(") + 1, response1.body().lastIndexOf(")"));JSONObject jsonObject1 = JSON.parseObject(jsonData1);JSONArray crossDomainUrlList = jsonObject1.getJSONArray("crossDomainUrlList");System.out.println(crossDomainUrlList);List<HttpCookie> cookies = new ArrayList<>();Collections.reverse(crossDomainUrlList);HttpResponse response3 = HttpUtil.createGet((String) crossDomainUrlList.get(0)).execute();System.out.println(crossDomainUrlList.get(0)  + ":" + response3);cookies.addAll(response3.getCookies());HttpResponse response4 = HttpUtil.createGet( crossDomainUrlList.get(1) + "&action=login").execute();System.out.println(crossDomainUrlList.get(1) + "&action=login" + ":" + response4);cookies.addAll(response4.getCookies());HttpResponse response5 = HttpUtil.createGet( crossDomainUrlList.get(2) + "&action=login").execute();System.out.println(crossDomainUrlList.get(2) + "&action=login" + ":" + response5);cookies.addAll(response5.getCookies());System.out.println(cookies);String finalCookie = getString(cookies);// 输出最终的cookie字符串System.out.println(finalCookie);

cookie拼成string+去重 

    private static String getString(List<HttpCookie> cookies) {StringBuilder cookieBuilder = new StringBuilder();HashMap<String, String> cookieMap = new HashMap<>();//去重for (HttpCookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if (!cookieMap.containsKey(name)) {cookieMap.put(name, value);}}//拼装for (Map.Entry<String, String> entry : cookieMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();String keyValueString = key + "=" + value;cookieBuilder.append(keyValueString).append("; ");}//最终结果String finalCookie = cookieBuilder.toString();if (finalCookie.endsWith("; ")) {finalCookie = finalCookie.substring(0, finalCookie.length() - 2);}return finalCookie;}

 四、main类完整方法代码

这里测试的话可以使用控制台输出的base64,用一些网页工具类,将base64转成图片,扫码后,就能输出完成cookie

    public static void main(String[] args) {//获取二维码id,以及二维码链接HttpResponse response = HttpUtil.createGet("https://login.sina.com.cn/sso/qrcode/image?entry=weibo&size=180&callback=STK_17017598656821").header("Referer", "https://weibo.com/").execute();System.out.println(response);String regex = "\"qrid\":\"([^\"]+)\"";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(response.body());String qrid = "";if (matcher.find()) {qrid = matcher.group(1);} else {System.out.println("qrid not found");}System.out.println(qrid);String jsonText = response.body().substring(response.body().indexOf("(") + 1, response.body().lastIndexOf(")"));JSONObject jsonObject = JSON.parseObject(jsonText);String image = jsonObject.getJSONObject("data").getString("image");System.out.println("https" + image);String imageUrl = "https:" + image;String base64Image = convertImageToBase64(imageUrl);System.out.println(base64Image);String alt = "";while (true) {String url = "https://login.sina.com.cn/sso/qrcode/check?entry=sso&qrid=" + qrid + "&callback=STK_" + System.currentTimeMillis();HttpResponse response1 = HttpUtil.createGet(url).header("Referer", "https://weibo.com/").execute();try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {System.out.println("睡眠异常");}System.out.println(response1.body());String jsonData1 = response1.body().substring(response1.body().indexOf("(") + 1, response1.body().lastIndexOf(")"));JSONObject jsonObject1 = JSON.parseObject(jsonData1);int retcode = jsonObject1.getIntValue("retcode");if (retcode == 20000000) {alt = jsonObject1.getJSONObject("data").getString("alt");System.out.println("alt: " + alt);break;}if (retcode == 50114004 || retcode == 50114015) {return;}}String altUrl = "https://login.sina.com.cn/sso/login.php?entry=qrcodesso&returntype=TEXT&crossdomain=1&cdult=3&domain=weibo.com&alt=" + alt + "&savestate=30&callback=STK_" + System.currentTimeMillis();HttpResponse response1 = HttpUtil.createGet(altUrl).execute();System.out.println(response1.body());String jsonData1 = response1.body().substring(response1.body().indexOf("(") + 1, response1.body().lastIndexOf(")"));JSONObject jsonObject1 = JSON.parseObject(jsonData1);JSONArray crossDomainUrlList = jsonObject1.getJSONArray("crossDomainUrlList");System.out.println(crossDomainUrlList);List<HttpCookie> cookies = new ArrayList<>();Collections.reverse(crossDomainUrlList);HttpResponse response3 = HttpUtil.createGet((String) crossDomainUrlList.get(0)).execute();System.out.println(crossDomainUrlList.get(0)  + ":" + response3);cookies.addAll(response3.getCookies());HttpResponse response4 = HttpUtil.createGet( crossDomainUrlList.get(1) + "&action=login").execute();System.out.println(crossDomainUrlList.get(1) + "&action=login" + ":" + response4);cookies.addAll(response4.getCookies());HttpResponse response5 = HttpUtil.createGet( crossDomainUrlList.get(2) + "&action=login").execute();System.out.println(crossDomainUrlList.get(2) + "&action=login" + ":" + response5);cookies.addAll(response5.getCookies());System.out.println(cookies);String finalCookie = getString(cookies);// 输出最终的cookie字符串System.out.println(finalCookie);}private static String getString(List<HttpCookie> cookies) {StringBuilder cookieBuilder = new StringBuilder();HashMap<String, String> cookieMap = new HashMap<>();//去重for (HttpCookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if (!cookieMap.containsKey(name)) {cookieMap.put(name, value);}}//拼装for (Map.Entry<String, String> entry : cookieMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();String keyValueString = key + "=" + value;cookieBuilder.append(keyValueString).append("; ");}//最终结果String finalCookie = cookieBuilder.toString();if (finalCookie.endsWith("; ")) {finalCookie = finalCookie.substring(0, finalCookie.length() - 2);}return finalCookie;}public static String convertImageToBase64(String imageUrl) {InputStream inputStream = null;
ByteArrayOutputStream outputStream = null;try{URL url = new URL(imageUrl);inputStream = url.openStream();outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}catch (Exception e){System.out.println("图片转换异常");} finally {IoUtil.close(inputStream);IoUtil.close(outputStream);}byte[] imageBytes = outputStream.toByteArray();return Base64.getEncoder().encodeToString(imageBytes);}

五、控制层接口完整代码

返回类

/*** 微博二维码返回** @author youzai* @date 2023/12/06*/
@Data
public class SpiderWeiboQrVO implements Serializable {@ApiModelProperty(value = "图片url")private String imgUrl;@ApiModelProperty(value = "图片id")private String qRid;
}

控制层,这里的R是自己封装的,可以根据你的系统自己改

 控制层这里因为要集成到网页设计,第一步先是要把二维码url返回给前端,前端src渲染,渲染之后扫码,扫码完成后前端需要再次确认,将我们第一步返回给前端qrid再次返回给后端。后端执行登录逻辑,就可以获取cookie了。

@RestController
@RequestMapping("/api/spider/toolbox")
public class SpiderToolBoxController {/*** 功能描述:微博二维码获取** @return {@link R }<{@link SpiderWeiboQrVO }>* @author youzai* @date 2023/12/06*/@GetMapping("/weiboQrCode")public R<SpiderWeiboQrVO> weiboQrCode() {HttpResponse response = HttpUtil.createGet("https://login.sina.com.cn/sso/qrcode/image?entry=weibo&size=180&callback=STK_" + System.currentTimeMillis()).header("Referer", "https://weibo.com/").execute();String regex = "\"qrid\":\"([^\"]+)\"";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(response.body());String qrid = "";if (matcher.find()) {qrid = matcher.group(1);} else {return R.failed("二维码获取失败!");}String jsonText = response.body().substring(response.body().indexOf("(") + 1, response.body().lastIndexOf(")"));JSONObject jsonObject = JSON.parseObject(jsonText);String imageUrl = jsonObject.getJSONObject("data").getString("image");SpiderWeiboQrVO spiderWeiboQrVO = new SpiderWeiboQrVO();spiderWeiboQrVO.setQRid(qrid);spiderWeiboQrVO.setImgUrl(imageUrl);return R.ok(spiderWeiboQrVO);}/*** 功能描述:微博登录** @param qrid* @return {@link R }<{@link String }>* @author youzai* @date 2023/12/06*/@GetMapping("/weiboLogin/{qrid}")public R<String> weiboLogin(@PathVariable("qrid") String qrid) {String alt = "";String url = "https://login.sina.com.cn/sso/qrcode/check?entry=sso&qrid=" + qrid + "&callback=STK_" + System.currentTimeMillis();HttpResponse response1 = HttpUtil.createGet(url).header("Referer", "https://weibo.com/").execute();String jsonData1 = response1.body().substring(response1.body().indexOf("(") + 1, response1.body().lastIndexOf(")"));JSONObject jsonObject1 = JSON.parseObject(jsonData1);int retcode = jsonObject1.getIntValue("retcode");if (retcode == 20000000) {alt = jsonObject1.getJSONObject("data").getString("alt");} else {return R.failed("登录失败");}String altUrl = "https://login.sina.com.cn/sso/login.php?entry=qrcodesso&returntype=TEXT&crossdomain=1&cdult=3&domain=weibo.com&alt=" + alt + "&savestate=30&callback=STK_" + System.currentTimeMillis();HttpResponse response2 = HttpUtil.createGet(altUrl).execute();String jsonData2 = response2.body().substring(response2.body().indexOf("(") + 1, response2.body().lastIndexOf(")"));JSONObject jsonObject2 = JSON.parseObject(jsonData2);JSONArray crossDomainUrlList = jsonObject2.getJSONArray("crossDomainUrlList");List<HttpCookie> cookies = new ArrayList<>();Collections.reverse(crossDomainUrlList);HttpResponse response3 = HttpUtil.createGet((String) crossDomainUrlList.get(0)).execute();cookies.addAll(response3.getCookies());HttpResponse response4 = HttpUtil.createGet(crossDomainUrlList.get(1) + "&action=login").execute();cookies.addAll(response4.getCookies());HttpResponse response5 = HttpUtil.createGet(crossDomainUrlList.get(2) + "&action=login").execute();cookies.addAll(response5.getCookies());String finalCookie = getCookieString(cookies);return R.ok(finalCookie);}/*** 功能描述:获取cookie** @param cookies* @return {@link String }* @author youzai* @date 2023/12/06*/private static String getCookieString(List<HttpCookie> cookies) {StringBuilder cookieBuilder = new StringBuilder();HashMap<String, String> cookieMap = new HashMap<>();//去重for (HttpCookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if (!cookieMap.containsKey(name)) {cookieMap.put(name, value);}}//拼装for (Map.Entry<String, String> entry : cookieMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();String keyValueString = key + "=" + value;cookieBuilder.append(keyValueString).append("; ");}//最终结果String finalCookie = cookieBuilder.toString();if (finalCookie.endsWith("; ")) {finalCookie = finalCookie.substring(0, finalCookie.length() - 2);}return finalCookie;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP与子网掩码之间的关系

子网掩码用于确认IP所在的网段&#xff0c;网络位与子网掩码相匹配 如果有另一台主机想要与这个IP地址进行通信&#xff0c;这时需要看两台主机的IP地址是否处于同一网段&#xff0c;处于同一网段才能相互ping通。 那么怎么判断是否处于同一网段呢&#xff1f;我们就看子网掩…

提升团队效率,防止员工飞单私单的秘诀!

在如今竞争激烈的商业环境中&#xff0c;每个企业都追求更高的销售业绩和客户满意度。然而&#xff0c;有些员工可能会利用V信等社交工具进行私下交易&#xff0c;导致公司的利益损失和客户信任的瓦解。所以&#xff0c;如何防止员工飞单私单成为了一个需要解决的问题。 在这里…

解决POI导入内部错误方式

目录 1、错误报文&#xff1a; 2、解决方案 参考 3、本人采用的是在配置文件中忽略该报错&#xff0c; 1、错误报文&#xff1a; WARN o.a.poi.openxml4j.opc.ZipPackage - Entry _rels/ is not valid, so this part wont be add to the package. org.apache.poi.openxml4…

FL Studio20官方版怎么下载安装?2024最新版图文详细教程

水果音乐制作软件FL Studio2024是一款功能强大的软件音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;&#xff0c;本文主要针对FL Studio 2024怎么安装&#xff1f;来为大家带来了水果软件FL Studio 2024安装图文详细教程&#xff01;水果音乐制作软件FL Studio2024版…

智能分析/可视化安防监控系统EasyCVR风光互补远程视频监控方案

一、背景需求 在一些偏远地区&#xff0c;也具有视频监控的需求。但是这类场景中&#xff0c;一般无法就近获取市电&#xff0c;如果要长距离拉取市电&#xff0c;建设的成本非常高且长距离传输有安全隐患&#xff0c;因此风光互补远程视频监控方案的需求也较多。利用风光电转…

在 JMeter 中使用 JSON 提取器提取特定条件下的值

当你需要在 JMeter 中对接收到的 JSON 响应进行处理时&#xff0c;JSON 提取器是一个非常有用的工具。在本文中&#xff0c;我们将讨论如何使用 JSON 提取器来提取特定条件下的值&#xff0c;以满足你的需求。 问题描述 假设你收到了以下 JSON 格式的响应结果&#xff1a; {…

selenium 执行js后拿不到返回值的原因

1.js代码报错&#xff0c;可以把代码放到浏览器控制台中执行查看具体报错信息&#xff1b; 2.如果js中使用了ajax调用&#xff0c;最后return出去请求的结果值&#xff0c;记得把参数async设置为false;async默认设置为true&#xff0c;如果你的返回结果在请求的后面程序不会等待…

TCP/IP 四层体系结构

目录 ​编辑 导言&#xff1a; 应用层 1. HTTP&#xff08;超文本传输协议&#xff09; 2. FTP&#xff08;文件传输协议&#xff09; 3. SMTP&#xff08;简单邮件传输协议&#xff09; 4. POP3&#xff08;邮局协议第3版&#xff09; 5. IMAP&#xff08;互联网消息访…

Spit Problem

题目名字 Spit Problem 题目链接 题意 输入n个数字&#xff0c;表示a[i]和b&#xff0c;每个a[i]对应一个b&#xff0c;当a[j]a[i]b且a[j]ba[i];则输出yes没有就no 思路 1.遍历输出n个二维数组 2. 如题意所示写出条件 算法一&#xff1a; 实现步骤 如果有的话输出yes之后直接…

Python安装报错: This environment is externally managed

error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz is the package you are trying toinstall.这个错误信息表示当前Python环境是由系统外部管理的&…

System 2 Attention:可以提高不同LLM问题的推理能力

推理正在成为大型语言模型(llm)关注的下一个主要领域。尽管llm拥有先进的能力&#xff0c;但大多数llm经常被简单的错误绊倒&#xff0c;显示出他们在推理方面的局限性。这些模型可能会被上下文中的不相关细节所误导&#xff0c;或者受到输入提示中的偏差的影响。而后一种倾向被…

【Apollo】编译 Apollo 源码

https://github.com/ApolloAuto/apollo/blob/master/docs/01_Installation%20Instructions/apollo_build_and_test_explained.md 查看apollo.sh 的用法 ./apollo.sh --help可以编译整个模块&#xff0c;也可以单独编译某一个子模块./modules 为简单起见&#xff0c;Apollo 6.0…

JAVA:注册表窗口的实现

目录 题目要求&#xff1a; 思路大意&#xff1a; 窗体的实现&#xff1a; 窗口A&#xff1a; 窗口B&#xff1a; 窗体之间的构思&#xff1a; 关键代码的实现&#xff1a; 窗口A&#xff1a; 封装列表&#xff1a; 窗口B&#xff1a; 题目要求&#xff1a; 使用…

网站使用CDN后无法获取用户真实IP的解决方法

宝塔或Nginx环境 如果你使用的宝塔或Nginx&#xff0c;可以在宝塔面板或Nginx中&#xff0c;找到配置文件增加如下代码后&#xff0c;重载配置或者重启 Nginx 即可&#xff1a; #CDN获取真实ip set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; PHP语言函数方法…

19 高速列车场景下3Gpp 5G NR的DMRS设计与评估

文章目录 解决问题设计DMRS仿真参数仿真结果 解决问题 多普勒/扩展影响十分显著&#xff0c;设计用于信道估计时&#xff0c;需要考虑解调参考信号&#xff0c;5G用DMRS结构而不是CRS结构&#xff0c;因此需要为高速UE设计DMRS结构&#xff0c;DMRS设计是为了提高信道估计并减…

vu3 控制台报错:[Vue warn]: Unhandled error during execution of component

每次按提交的报错信息&#xff1a; runtime-core.esm-bundler.js:41 [Vue warn]: Unhandled error during execution of component event handler at <ElButton onClickfn<login> class"button" type"primary" ... > 代码&#xff1a; cons…

使用Python进行数学四则运算

当我们讨论到Python中的计算问题时&#xff0c;我们必然涉及到加法运算符&#xff08;&#xff09;、减法运算符&#xff08;-&#xff09;、乘法运算符&#xff08;*&#xff09;以及除法运算符&#xff08;/&#xff09;这四大常见的算术运算。下面&#xff0c;我将为您展示如…

【AI底层逻辑】——数学与机器学习:优雅的智慧之舞

目录 “宝藏网站” 聊聊数学 “华尔兹” “智慧之舞” 后续的章节我们将迎来新的篇章&#xff0c;新的切入点探索AI的奥秘&#xff0c;通过揭示高数、矩阵、概率论等数学知识与机器学习的关系来深入理解AI的奥秘&#xff01; “宝藏网站” 开头先给大家上几个宝藏网站&am…

性能监控软件:优化系统运行的得力助手

随着科技的飞速发展&#xff0c;企业和组织对于其信息技术基础设施的性能要求也愈发提高。为了确保系统能够高效稳定地运行&#xff0c;性能监控软件成为不可或缺的工具。本文将探讨性能监控软件的主要作用&#xff0c;以及它们在提升系统性能和稳定性方面的关键作用。 1. 实时…

Mysql8.0实现主从复制

1、什么是主从复制 数据库的主从复制&#xff08;master-slave replication&#xff09;是一种数据复制技术&#xff0c;其中一台数据库服务器&#xff08;主服务器&#xff09;上的数据变更会复制到另一台或多台数据库服务器&#xff08;从服务器&#xff09;上。这种复制可以…