如何用Java开发实现自动订阅商品到货通知,助我们轻松购得心仪商品?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1554个文字,预计阅读时间需要7分钟。
目录+背景+思路+分析产品信息API+定时请求商品信息API,查看商品库存+发送消息通知+特殊声明+背景+朋友想从XX超市APP购买一些物美价廉的东西,但因为人太多货少,经常缺货。
目录
- 背景
- 思路
- 分析商品信息api
- 定时请求商品信息api,查看商品库存
- 发送消息通知
- 特别声明
背景
朋友想从XX超市app购买一些物美价廉的东西,但是因为人多货少经常都是缺货的状态,订阅了到货通知也没什么效果,每次收到短信通知进入app查看的时候都没货了。最近任务做完了,闲着也是闲着就想着帮他解决这个问题。
思路
为什么每次到货通知进去看都没货呢?猜想可能有几种情况,可能这个通知并不是实时的一有货就通知,也可能是订阅的人太多了没有全部发。总之,这个到货通知不靠谱,那就只能自己实现一个到货通知了。
实现步骤:
- 分析商品信息api
- 定时请求商品信息api查看商品库存
- 发送消息通知
分析商品信息api
先用Charles或者Fiddler等工具分析查看商品数据时请求的api数据,之前有写过Charles的具体使用方法,有兴趣的同学可以看一下,这边就不再细说了。
手机wifi代理配置Charles主机地址,查看api数据,根据api名称和返回内容,可以判断接口路径是:/api/v1/xxx/goods-portal/spu/queryDetail
分析下api的返回数据内容,可以看到具体的库存信息(删除了许多没用的数据),通过名称分析可以定位到库存字段为:stockQuantity,所以我们就可以通过这个api来查看具体商品的库存数据了
{ "data": { "spuId": "1277934", "hostItem": "980033855", "storeId": "6782", "title": "Member's Mark 精选鲜鸡蛋 30枚装", "masterBizType": 1, "viceBizType": 1, "categoryIdList": [ "10003023", "10003228", "10004626", "10012102" ], "isAvailable": true, "isPutOnSale": true, "sevenDaysReturn": false, "intro": "MM 精选鲜鸡蛋 30枚", "subTitle": "(粉壳鸡蛋/褐壳鸡蛋, 两种随机发货, 不影响鸡蛋品质) 精心培育 每一颗鸡蛋都可溯源 口感香醇 做法多样 懒人早餐", "brandId": "10194688", "weight": 1.5, "desc": "", "priceInfo": [ { "priceType": 2, "price": "0", "priceTypeName": "原始价" }, { "priceType": 1, "price": "2380", "priceTypeName": "销售价" } ], "stockInfo": { "stockQuantity": 68, "safeStockQuantity": 0, "soldQuantity": 0 }, "limitInfo": [ { "limitType": 3, "limitNum": 5, "text": "限购2件", "cycleDays": 1 } ], "deliveryAttr": 3, "favorite": false, "giveaway": false, "beltInfo": [ ], "isStoreExtent": false, "isTicket": false }, "code": "Success", "msg": "", "errorMsg": "", "traceId": "a80e1d3df8f7f216", "requestId": "54c25d584f8a4b39b95ba7bdd1331da6.182.16740102252700000", "rt": 0, "success": true }
确定完接口返回数据后,我们还要获取接口的请求数据request params(如上图所示),因为请求数据中带有商品的信息和个人的位置信息,不同的位置可能会查询到不同的仓库库存(待验证)。
定时请求商品信息api,查看商品库存
本文以Java为例,代码仅供参考和学习讨论。
获取到api信息后,我们就可以使用OkHttp或者webclient等请求工具类定时访问api,查看商品库存信息。
引入pom依赖
<dependency> <groupId>com.squareup.okxxxx/api/v1/xxx/goods-portal/spu/queryDetail") // 有参数的话添加参数,可多个 .addParam(data) // 也可以添加多个 .addHeader("Content-Type", "application/json; charset=utf-8") // 如果是true的话,会类似于postman中post提交方式的raw,用json的方式提交,不是表单 // 如果是false的话传统的表单提交 .post(true) .sync(); // System.out.println(res); JSONObject json = JSONObject.parseObject(res); val stockQuantity = json.getJSONObject("data").getJSONObject("stockInfo").getIntValue("stockQuantity"); System.out.println(DateUtil.now() + " 库存:" + stockQuantity); if (stockQuantity > 0 ) { sendNotify(); } else { Thread.sleep(10000); } } } @SneakyThrows private void sendNotify() { for (int i = 0; i < 3; i++) { System.out.println("send email"); EmailUtil.sendTextEmail(EmailDto.builder() .subject("有货了快来抢购!!!") .context("有货了快来抢购!!!") .build()); Thread.sleep(60000); } } }
注意点:
- 请求不要太频繁,不要违背爬虫规则
- 短信通知大部分是需要收费的,所以使用邮件通知
发送消息通知
本次案例使用的是qq邮件通知,qq邮箱发送需要进入设置中开启pop3服务,开启后会有一个独立密码用来发送邮件。
发送邮件工具类示例:
package util; import entity.EmailDto; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.Message.RecipientType; import javax.mail.internet.*; import java.io.*; import java.util.Date; import java.util.Properties; /** * 使用SMTP协议发送电子邮件 */ public class EmailUtil1 { // 邮箱账号 private final static String USERNAME = "xxx@qq.com"; // 邮箱密码 private final static String PASSWORD = "xxx"; // 邮件发送协议 private final static String PROTOCOL = "smtp"; // SMTP邮件服务器 private final static String HOST = "smtp.qq.com"; // SMTP邮件服务器默认端口 private final static String PORT = "587"; // 发件人 private static String from = "xxx@qq.com"; // 是否要求身份认证 private final static String IS_AUTH = "true"; // 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息) private final static String IS_ENABLED_DEBUG_MOD = "false"; // 收件人 private static String to = "aaa@qq.com"; // 初始化连接邮件服务器的会话信息 private static Properties props = null; static { props = new Properties(); props.setProperty("mail.transport.protocol", PROTOCOL); props.setProperty("mail.smtp.host", HOST); props.setProperty("mail.smtp.port", PORT); props.setProperty("mail.smtp.auth", IS_AUTH); props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD); // props.setProperty("mail.smtp.ssl.enable", "true"); } /** * 发送简单的文本邮件 */ public static void sendTextEmail(EmailDto dto) throws Exception { // 创建Session实例对象 Session session = Session.getDefaultInstance(props); // 创建MimeMessage实例对象 MimeMessage message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(from)); // 设置邮件主题 message.setSubject(dto.getSubject()); // 设置收件人 message.setRecipient(RecipientType.TO, new InternetAddress(to)); // 设置发送时间 message.setSentDate(new Date()); // 设置纯文本内容为邮件正文 message.setText(dto.getContext()); // 保存并生成最终的邮件内容 message.saveChanges(); // 获得Transport实例对象 Transport transport = session.getTransport(); // 打开连接 transport.connect(USERNAME, PASSWORD); // 将message对象传递给transport对象,将邮件发送出去 transport.sendMessage(message, message.getAllRecipients()); // 关闭连接 transport.close(); } }
特别声明
- 请勿将文章的任何内容用于商业或非法目的,否则后果自负。
- 文章中涉及的任何代码,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
以上就是java开发实现订阅到货通知帮我们买到想买的东西的详细内容,更多关于java开发到货订阅通知的资料请关注自由互联其它相关文章!
本文共计1554个文字,预计阅读时间需要7分钟。
目录+背景+思路+分析产品信息API+定时请求商品信息API,查看商品库存+发送消息通知+特殊声明+背景+朋友想从XX超市APP购买一些物美价廉的东西,但因为人太多货少,经常缺货。
目录
- 背景
- 思路
- 分析商品信息api
- 定时请求商品信息api,查看商品库存
- 发送消息通知
- 特别声明
背景
朋友想从XX超市app购买一些物美价廉的东西,但是因为人多货少经常都是缺货的状态,订阅了到货通知也没什么效果,每次收到短信通知进入app查看的时候都没货了。最近任务做完了,闲着也是闲着就想着帮他解决这个问题。
思路
为什么每次到货通知进去看都没货呢?猜想可能有几种情况,可能这个通知并不是实时的一有货就通知,也可能是订阅的人太多了没有全部发。总之,这个到货通知不靠谱,那就只能自己实现一个到货通知了。
实现步骤:
- 分析商品信息api
- 定时请求商品信息api查看商品库存
- 发送消息通知
分析商品信息api
先用Charles或者Fiddler等工具分析查看商品数据时请求的api数据,之前有写过Charles的具体使用方法,有兴趣的同学可以看一下,这边就不再细说了。
手机wifi代理配置Charles主机地址,查看api数据,根据api名称和返回内容,可以判断接口路径是:/api/v1/xxx/goods-portal/spu/queryDetail
分析下api的返回数据内容,可以看到具体的库存信息(删除了许多没用的数据),通过名称分析可以定位到库存字段为:stockQuantity,所以我们就可以通过这个api来查看具体商品的库存数据了
{ "data": { "spuId": "1277934", "hostItem": "980033855", "storeId": "6782", "title": "Member's Mark 精选鲜鸡蛋 30枚装", "masterBizType": 1, "viceBizType": 1, "categoryIdList": [ "10003023", "10003228", "10004626", "10012102" ], "isAvailable": true, "isPutOnSale": true, "sevenDaysReturn": false, "intro": "MM 精选鲜鸡蛋 30枚", "subTitle": "(粉壳鸡蛋/褐壳鸡蛋, 两种随机发货, 不影响鸡蛋品质) 精心培育 每一颗鸡蛋都可溯源 口感香醇 做法多样 懒人早餐", "brandId": "10194688", "weight": 1.5, "desc": "", "priceInfo": [ { "priceType": 2, "price": "0", "priceTypeName": "原始价" }, { "priceType": 1, "price": "2380", "priceTypeName": "销售价" } ], "stockInfo": { "stockQuantity": 68, "safeStockQuantity": 0, "soldQuantity": 0 }, "limitInfo": [ { "limitType": 3, "limitNum": 5, "text": "限购2件", "cycleDays": 1 } ], "deliveryAttr": 3, "favorite": false, "giveaway": false, "beltInfo": [ ], "isStoreExtent": false, "isTicket": false }, "code": "Success", "msg": "", "errorMsg": "", "traceId": "a80e1d3df8f7f216", "requestId": "54c25d584f8a4b39b95ba7bdd1331da6.182.16740102252700000", "rt": 0, "success": true }
确定完接口返回数据后,我们还要获取接口的请求数据request params(如上图所示),因为请求数据中带有商品的信息和个人的位置信息,不同的位置可能会查询到不同的仓库库存(待验证)。
定时请求商品信息api,查看商品库存
本文以Java为例,代码仅供参考和学习讨论。
获取到api信息后,我们就可以使用OkHttp或者webclient等请求工具类定时访问api,查看商品库存信息。
引入pom依赖
<dependency> <groupId>com.squareup.okxxxx/api/v1/xxx/goods-portal/spu/queryDetail") // 有参数的话添加参数,可多个 .addParam(data) // 也可以添加多个 .addHeader("Content-Type", "application/json; charset=utf-8") // 如果是true的话,会类似于postman中post提交方式的raw,用json的方式提交,不是表单 // 如果是false的话传统的表单提交 .post(true) .sync(); // System.out.println(res); JSONObject json = JSONObject.parseObject(res); val stockQuantity = json.getJSONObject("data").getJSONObject("stockInfo").getIntValue("stockQuantity"); System.out.println(DateUtil.now() + " 库存:" + stockQuantity); if (stockQuantity > 0 ) { sendNotify(); } else { Thread.sleep(10000); } } } @SneakyThrows private void sendNotify() { for (int i = 0; i < 3; i++) { System.out.println("send email"); EmailUtil.sendTextEmail(EmailDto.builder() .subject("有货了快来抢购!!!") .context("有货了快来抢购!!!") .build()); Thread.sleep(60000); } } }
注意点:
- 请求不要太频繁,不要违背爬虫规则
- 短信通知大部分是需要收费的,所以使用邮件通知
发送消息通知
本次案例使用的是qq邮件通知,qq邮箱发送需要进入设置中开启pop3服务,开启后会有一个独立密码用来发送邮件。
发送邮件工具类示例:
package util; import entity.EmailDto; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.Message.RecipientType; import javax.mail.internet.*; import java.io.*; import java.util.Date; import java.util.Properties; /** * 使用SMTP协议发送电子邮件 */ public class EmailUtil1 { // 邮箱账号 private final static String USERNAME = "xxx@qq.com"; // 邮箱密码 private final static String PASSWORD = "xxx"; // 邮件发送协议 private final static String PROTOCOL = "smtp"; // SMTP邮件服务器 private final static String HOST = "smtp.qq.com"; // SMTP邮件服务器默认端口 private final static String PORT = "587"; // 发件人 private static String from = "xxx@qq.com"; // 是否要求身份认证 private final static String IS_AUTH = "true"; // 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息) private final static String IS_ENABLED_DEBUG_MOD = "false"; // 收件人 private static String to = "aaa@qq.com"; // 初始化连接邮件服务器的会话信息 private static Properties props = null; static { props = new Properties(); props.setProperty("mail.transport.protocol", PROTOCOL); props.setProperty("mail.smtp.host", HOST); props.setProperty("mail.smtp.port", PORT); props.setProperty("mail.smtp.auth", IS_AUTH); props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD); // props.setProperty("mail.smtp.ssl.enable", "true"); } /** * 发送简单的文本邮件 */ public static void sendTextEmail(EmailDto dto) throws Exception { // 创建Session实例对象 Session session = Session.getDefaultInstance(props); // 创建MimeMessage实例对象 MimeMessage message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(from)); // 设置邮件主题 message.setSubject(dto.getSubject()); // 设置收件人 message.setRecipient(RecipientType.TO, new InternetAddress(to)); // 设置发送时间 message.setSentDate(new Date()); // 设置纯文本内容为邮件正文 message.setText(dto.getContext()); // 保存并生成最终的邮件内容 message.saveChanges(); // 获得Transport实例对象 Transport transport = session.getTransport(); // 打开连接 transport.connect(USERNAME, PASSWORD); // 将message对象传递给transport对象,将邮件发送出去 transport.sendMessage(message, message.getAllRecipients()); // 关闭连接 transport.close(); } }
特别声明
- 请勿将文章的任何内容用于商业或非法目的,否则后果自负。
- 文章中涉及的任何代码,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
以上就是java开发实现订阅到货通知帮我们买到想买的东西的详细内容,更多关于java开发到货订阅通知的资料请关注自由互联其它相关文章!

