iphone13到底香不香,真的这么难抢?

约定不等于承诺〃 2024-05-11 09:04 132阅读 0赞
先水俩图

iphone12/13抢购自动化测试脚本

请添加图片描述
在这里插入图片描述

说在前面

本文核心内容

  1. iphone13 有货通知 NodeJs脚本
  2. iphone13 抢购的python+selenium自动化测试脚本
  3. iphone12 预约抢购的python+selenium自动化测试脚本
起因

首先说明本菜狗不是什么专业评测,起因只是因为刷新闻时,看到铺天盖地的新闻:13有多香,高刷有多好,供货多紧张,根本抢不到等。作为一个好奇心重的菜狗,就只是想单纯的看看这确有其事还是故弄玄虚的噱头!
在这里插入图片描述

走起
  1. 登录苹果官网,映入眼帘的大苹果

看起来是挺不错,但是价格也很感人

在这里插入图片描述2.去看看有没有货,现货怎么取,快递啥时候到

看似确实货源紧张,都快排到圣诞节了,而且现货也没有,只能在线购买,可能网上说的是真的?

在这里插入图片描述
在这里插入图片描述
3.一探究竟

选了一下我要取货,怎么刷都刷不出来,表面看起来确实是没货啊!

在这里插入图片描述

实操代码

为了解决这个抢不到或者无法及时得到有货通知的问题,采用以下解决方法!

1.iphone13 有货通知 NodeJs脚本

当有货时发送邮件通知,通过手速进行抢购

js代码
  1. /*
  2. * @Author: JavaDog
  3. * @Date: 2021-09-19 21:22:49
  4. * @LastEditTime: 2021-10-12 14:55:49
  5. * @Description: iphone13 pro 银色 256g/512g
  6. * @FilePath: apple13.js
  7. */
  8. var https = require("https");
  9. var http = require("http");
  10. var querystring = require("querystring");
  11. var request = require("request");
  12. // 是否有货地址,可以替换成你的自己想要的型号
  13. let url = [
  14. "https://www.apple.com.cn/shop/fulfillment-messages?pl=true&mt=compact&parts.0=MLTG3CH/A&searchNearby=true&store=R557",
  15. "https://www.apple.com.cn/shop/fulfillment-messages?pl=true&mt=compact&parts.0=MLTC3CH/A&searchNearby=true&store=R557",
  16. ];
  17. // 循环定时器
  18. setInterval(() => {
  19. url.forEach((item) => {
  20. https.get(item, function (response) {
  21. var body = [];
  22. response.on("data", function (chunk) {
  23. body.push(chunk);
  24. });
  25. response.on("end", function () {
  26. body = Buffer.concat(body);
  27. let json = JSON.parse(body.toString());
  28. let content = json.body.content;
  29. let pickupMessage = content.pickupMessage;
  30. let store = pickupMessage.stores[0];
  31. let partsAvailability = store.partsAvailability;
  32. let obj =
  33. partsAvailability["MLTG3CH/A"] ||
  34. partsAvailability["MLTC3CH/A"] ||
  35. partsAvailability["MLTJ3CH/A"] ||
  36. partsAvailability["MLTE3CH/A"];
  37. let pickupDisplay = obj.pickupDisplay;
  38. let storePickupProductTitle = obj.storePickupProductTitle;
  39. let pickupSearchQuote = obj.pickupSearchQuote;
  40. // 重要参数拼接
  41. let result =
  42. storePickupProductTitle +
  43. " " +
  44. pickupDisplay +
  45. " " +
  46. pickupSearchQuote +
  47. " " +
  48. new Date();
  49. if (pickupDisplay != "unavailable" || pickupDisplay == "available") {
  50. // 有货
  51. console.log(result);
  52. // 此处注意,请改成自己的邮件发送服务器,或者其他通知平台,本人的是自己的阿里云邮箱
  53. mail(result, storePickupProductTitle);
  54. } else {
  55. // 无货
  56. console.log(result);
  57. }
  58. });
  59. });
  60. });
  61. }, 1000);
  62. // 有货邮件提醒
  63. function mail(noSimilarModelsText, storePickupProductTitle) {
  64. var options = {
  65. headers: {
  66. "Content-Type": "application/json",
  67. "admin-authorization": "dfaf86e4e45f4906a6ef8d180efba1c0",
  68. },
  69. url: "https://blog.javadog.net/api/admin/mails/test",
  70. method: "POST",
  71. json: true,
  72. body: {
  73. to: "862422627@qq.com",
  74. subject: storePickupProductTitle,
  75. content: noSimilarModelsText,
  76. },
  77. };
  78. function callback(error, response, data) {
  79. console.log("----info------", data);
  80. }
  81. request(options, callback);
  82. }
启动

node apple.js

启动时,使用命令 node apple.js 即可,前置条件需要已安装node,如未安装,请参考 Node.js 安装配置,启动后详见下图。如需放置服务器启动,请参考pm2应用进程管理器。

在这里插入图片描述

结论

经过放置服务器24小时不间断的测试得出:每天还是有少量的现货,但只在早上9-12点之间,每天现货量大约在1-5个左右(青岛地区测试),秒杀时间基本在半分钟之内,否则立刻无货
在这里插入图片描述
在这里插入图片描述

2.iphone12 抢购python+selenium自动化测试脚本【只针对谷歌浏览器】

通过python+selenium自动化,让代码帮我们处理。
此处用iphone 12作为流程演示,因为12基本无需抢购,流程可以跑通
?本菜狗之前没有接触过python,写的垃圾请大佬勿喷!

前置条件

了解python+selenium,可可以参考 Python+Selenium基础入门及实践

注意

如果没有chromedriver.exe 请按照谷歌浏览器版本匹配规则进行选择!本人谷歌版本94.0.4606.81 32位点击下载本人所用的 chromedriver.exe
在这里插入图片描述
切记chromedriver.exe依赖如果不是32位的话可能会报如下错误

WebDriverException:Message:unknown error:cannot find Chrome binary

在这里插入图片描述

python代码
  1. from selenium import webdriver
  2. from datetime import datetime
  3. from selenium.webdriver.support.select import Select
  4. import time
  5. # iphone12 自动化测试
  6. print("iphone12 自动化测试开始")
  7. # 访问测试的url定义
  8. url = "https://www.apple.com.cn/shop/buy-iphone/iphone-12"
  9. # 1. 创建浏览器对象 这里的Chrome中的变量是chromedriver的驱动地址
  10. driver = webdriver.Chrome()
  11. # 2. 跳转到apple官网
  12. driver.get(url)
  13. # 3. 隐式等待 设置 防止预售的网络的阻塞
  14. driver.implicitly_wait(10)
  15. # 4.1 开始选择规格【此处我选择了-12 mini】
  16. element_sku = driver.find_element_by_name('dimensionScreensize')
  17. driver.implicitly_wait(10)
  18. element_sku.click()
  19. # 4.2 选择颜色【此处我选择了-白色】
  20. element_color = driver.find_element_by_xpath(
  21. '//*[@value="white"]')
  22. driver.execute_script("arguments[0].click();", element_color)
  23. driver.implicitly_wait(10)
  24. # 4.3 选择内存【此处我选择了-256g】
  25. element_memory = driver.find_element_by_xpath(
  26. '//*[@value="256gb"]')
  27. driver.execute_script("arguments[0].click();", element_memory)
  28. driver.implicitly_wait(10)
  29. # 4.4 你是否有智能手机要折抵 【此处我选择了-没有旧机折扣】
  30. element_old = driver.find_element_by_xpath('//*[@id="noTradeIn"]')
  31. driver.execute_script("arguments[0].click();", element_old)
  32. driver.implicitly_wait(10)
  33. # 4.5 Applecare 【此处我选择了-无Applecare】
  34. element_care = driver.find_element_by_id('applecareplus_58_noapplecare_label')
  35. driver.execute_script("arguments[0].click();", element_care)
  36. driver.implicitly_wait(10)
  37. # 4.6 添加到购物袋
  38. element_car = driver.find_element_by_xpath(
  39. '//*[@value="add-to-cart"]')
  40. driver.execute_script("arguments[0].click();", element_car)
  41. driver.implicitly_wait(10)
  42. # 5 页面跳转查看购物袋
  43. element_check = driver.find_element_by_xpath(
  44. '//*[@value="proceed"]')
  45. driver.execute_script("arguments[0].click();", element_check)
  46. driver.implicitly_wait(10)
  47. # 6 结账
  48. element_check_out = driver.find_element_by_xpath(
  49. '//*[@id="shoppingCart.actions.navCheckout"]')
  50. driver.execute_script("arguments[0].click();", element_check_out)
  51. driver.implicitly_wait(10)
  52. # 7.1 输入用户名
  53. element_username = driver.find_element_by_id(
  54. 'signIn.customerLogin.appleId')
  55. element_username.send_keys('appleId账号')
  56. driver.implicitly_wait(10)
  57. # 7.2 输入密码
  58. element_password = driver.find_element_by_id(
  59. 'signIn.customerLogin.password')
  60. element_password.send_keys('密码')
  61. driver.implicitly_wait(10)
  62. # 7.3 点击登录
  63. element_login = driver.find_element_by_id(
  64. 'signin-submit-button')
  65. element_login.click()
  66. driver.implicitly_wait(10)
  67. # 8.1 你希望如何收到订单商品 【此处我选择了-我要取货】
  68. element_want_order = driver.find_element_by_id(
  69. 'fulfillmentOptionButtonGroup1')
  70. driver.execute_script("arguments[0].click();", element_want_order)
  71. driver.implicitly_wait(10)
  72. # 8.2 点击显示此地附近的零售店
  73. element_selectdistrict = driver.find_element_by_xpath(
  74. '//*[@aria-describedby="rs-fulfillment-storelocator-error"]')
  75. driver.execute_script("arguments[0].click();", element_selectdistrict)
  76. driver.implicitly_wait(10)
  77. # 8.3 点击山东
  78. element_provice = driver.find_element_by_xpath(
  79. '//*[@value="山东"]')
  80. driver.execute_script("arguments[0].click();", element_provice)
  81. driver.implicitly_wait(10)
  82. # 8.4 点击青岛
  83. element_city = driver.find_element_by_xpath(
  84. '//*[@value="青岛"]')
  85. driver.execute_script("arguments[0].click();", element_city)
  86. driver.implicitly_wait(10)
  87. # 8.5 点击市南
  88. element_area = driver.find_element_by_xpath(
  89. '//*[@value="市南区"]')
  90. driver.execute_script("arguments[0].click();", element_area)
  91. driver.implicitly_wait(20)
  92. # 8.6 选择取货零售店 【此处我选择了-Apple 青岛万象城】
  93. element_pickupTab = driver.find_element_by_id(
  94. 'checkout.fulfillment.pickupTab.pickup.storeLocator-R557')
  95. driver.execute_script("arguments[0].click();", element_pickupTab)
  96. driver.implicitly_wait(20)
  97. # 8.7 选择取货时间 【根据时间自己定】
  98. element_pickup_time = driver.find_element_by_xpath(
  99. '//*[@value="11"]')
  100. driver.execute_script("arguments[0].click();", element_pickup_time)
  101. driver.implicitly_wait(10)
  102. # 8.8 选择取货时间段 【此处我选择了-默认第一个时间段】
  103. element_time_quantum = driver.find_element_by_xpath(
  104. '//*[@aria-labelledby="timeWindows_label"]')
  105. Select(element_time_quantum).select_by_index(1)
  106. driver.implicitly_wait(15)
  107. # 8.9 继续填写取货详情
  108. element_checkout = driver.find_element_by_id(
  109. 'rs-checkout-continue-button-bottom')
  110. driver.implicitly_wait(15)
  111. driver.execute_script("arguments[0].click();", element_checkout)
  112. element_checkout.click()
  113. driver.implicitly_wait(10)
  114. # 9.1 请填写收件人手机号码
  115. element_Phone = driver.find_element_by_name('fullDaytimePhone')
  116. element_Phone.send_keys('手机号')
  117. driver.implicitly_wait(10)
  118. # 9.2 请填写收件人身份证
  119. element_nationalId = driver.find_element_by_name('nationalId')
  120. element_nationalId.send_keys('身份证')
  121. driver.implicitly_wait(10)
  122. # 9.3 检查订单
  123. element_checkoutPay = driver.find_element_by_id(
  124. 'rs-checkout-continue-button-bottom')
  125. driver.execute_script("arguments[0].click();", element_checkoutPay)
  126. driver.implicitly_wait(10)
  127. # 10 立即下单 【此处我选择了-微信支付】
  128. element_billingOptions = driver.find_element_by_id(
  129. 'checkout.billing.billingOptions.options.2')
  130. driver.execute_script("arguments[0].click();", element_billingOptions)
  131. driver.implicitly_wait(10)
  132. # 11.1 确定
  133. element_orderPay = driver.find_element_by_id(
  134. 'rs-checkout-continue-button-bottom')
  135. driver.execute_script("arguments[0].click();", element_orderPay)
  136. driver.implicitly_wait(15)
  137. # 12 确认订单
  138. element_endPay = driver.find_element_by_xpath(
  139. '//*[@aria-describedby="rs-checkout-continuedisclaimer-bottom"]')
  140. driver.execute_script("arguments[0].click();", element_endPay)
  141. driver.implicitly_wait(15)
  142. # 11 退出浏览器
  143. time.sleep(10)
  144. # driver.quit()
  145. print("iphone12 自动化测试结束")
启动

python apple-12.py

全自动操作过程动图

在这里插入图片描述

Tip

其中账号密码相关需要替换成自己的,并且苹果官网会有卡顿延时,及403等异常,属于正常情况。

3.iphone13 预约抢购的python+selenium自动化测试脚本【只针对谷歌浏览器】
前置条件同iphone 12
Tips

因iphone13 无货,代码中加入了一个while判断,重复拉取省市区进行有无货的重新加载

python 代码
  1. from selenium import webdriver
  2. from datetime import datetime
  3. from selenium.webdriver.support.select import Select
  4. import pdb
  5. import time
  6. # iphone13 自动化测试
  7. print("iphone13 自动化测试开始")
  8. # 访问测试的url定义
  9. url = "https://www.apple.com.cn/shop/buy-iphone/iphone-13-pro"
  10. # 1. 创建浏览器对象 这里的Chrome中的变量是chromedriver的驱动地址
  11. driver = webdriver.Chrome()
  12. # 2. 跳转到apple官网
  13. driver.get(url)
  14. # 3. 隐式等待 设置 防止预售的网络的阻塞
  15. driver.implicitly_wait(10)
  16. # 4. 开始选择规格【此处我选择了-13 pro】
  17. element_sku = driver.find_element_by_name('dimensionScreensize')
  18. driver.implicitly_wait(10)
  19. element_sku.click()
  20. # 4.2 选择颜色【此处我选择了-银色】
  21. element_color = driver.find_element_by_xpath(
  22. '//*[@value="silver"]')
  23. driver.execute_script("arguments[0].click();", element_color)
  24. driver.implicitly_wait(10)
  25. # 4.3 选择内存【此处我选择了-256g】
  26. element_memory = driver.find_element_by_xpath(
  27. '//*[@value="256gb"]')
  28. driver.execute_script("arguments[0].click();", element_memory)
  29. driver.implicitly_wait(10)
  30. # 4.4 你是否有智能手机要折抵 【此处我选择了-没有旧机折扣】
  31. element_old = driver.find_element_by_xpath('//*[@id="noTradeIn"]')
  32. driver.execute_script("arguments[0].click();", element_old)
  33. driver.implicitly_wait(10)
  34. # 4.5 Applecare 【此处我选择了-无Applecare】
  35. element_care = driver.find_element_by_id('iphonexs_ac_iup_noapplecare_label')
  36. driver.execute_script("arguments[0].click();", element_care)
  37. driver.implicitly_wait(10)
  38. # 4.6 添加到购物袋
  39. element_car = driver.find_element_by_xpath(
  40. '//*[@value="add-to-cart"]')
  41. driver.execute_script("arguments[0].click();", element_car)
  42. driver.implicitly_wait(10)
  43. # 5 页面跳转查看购物袋
  44. element_check = driver.find_element_by_xpath(
  45. '//*[@id="root"]/div[2]/div/div/div[2]/div/form/button')
  46. driver.execute_script("arguments[0].click();", element_check)
  47. driver.implicitly_wait(10)
  48. # 6 结账
  49. element_check_out = driver.find_element_by_xpath(
  50. '//*[@id="shoppingCart.actions.checkout"]')
  51. driver.execute_script("arguments[0].click();", element_check_out)
  52. driver.implicitly_wait(10)
  53. # 7.1 输入用户名
  54. element_username = driver.find_element_by_id(
  55. 'signIn.customerLogin.appleId')
  56. element_username.send_keys('苹果appleId')
  57. driver.implicitly_wait(10)
  58. # 7.2 输入密码
  59. element_password = driver.find_element_by_id(
  60. 'signIn.customerLogin.password')
  61. element_password.send_keys('密码')
  62. driver.implicitly_wait(10)
  63. # 7.3 点击登录
  64. element_login = driver.find_element_by_id(
  65. 'signin-submit-button')
  66. element_login.click()
  67. driver.implicitly_wait(10)
  68. # 8.1 你希望如何收到订单商品 【此处我选择了-我要取货】
  69. element_want_order = driver.find_element_by_id(
  70. 'fulfillmentOptionButtonGroup1')
  71. driver.execute_script("arguments[0].click();", element_want_order)
  72. driver.implicitly_wait(10)
  73. # 8.2 点击显示此地附近的零售店
  74. selectdistrict = driver.find_element_by_xpath(
  75. '//*[@aria-describedby="rs-fulfillment-storelocator-error"]')
  76. driver.execute_script("arguments[0].click();", selectdistrict)
  77. driver.implicitly_wait(10)
  78. # 8.3 点击山东
  79. element_provice = driver.find_element_by_xpath(
  80. '//*[@value="山东"]')
  81. driver.execute_script("arguments[0].click();", element_provice)
  82. driver.implicitly_wait(10)
  83. # 8.4 点击青岛
  84. element_city = driver.find_element_by_xpath(
  85. '//*[@value="青岛"]')
  86. driver.execute_script("arguments[0].click();", element_city)
  87. driver.implicitly_wait(10)
  88. # 8.5 点击市南
  89. element_area = driver.find_element_by_xpath(
  90. '//*[@value="市南区"]')
  91. driver.execute_script("arguments[0].click();", element_area)
  92. driver.implicitly_wait(20)
  93. # 因为无货需要判断元素是否可以点击
  94. isOK = driver.find_element_by_id(
  95. 'checkout.fulfillment.pickupTab.pickup.storeLocator-R557').is_enabled()
  96. isOKFlag = bool(1 - isOK)
  97. #print("准备isOKFlag " + str(isOKFlag))
  98. # while循环查看是否有货
  99. while isOKFlag:
  100. try:
  101. # 重新调用省市区
  102. #print("进来了isOKFlag " + str(isOKFlag))
  103. driver.implicitly_wait(20)
  104. selectdistrict = driver.find_element_by_xpath(
  105. '//*[@aria-describedby="rs-fulfillment-storelocator-error"]')
  106. driver.execute_script("arguments[0].click();", selectdistrict)
  107. driver.implicitly_wait(20)
  108. provice = driver.find_element_by_xpath(
  109. '//*[@value="山东"]')
  110. driver.execute_script("arguments[0].click();", provice)
  111. city = driver.find_element_by_xpath(
  112. '//*[@value="青岛"]')
  113. driver.execute_script("arguments[0].click();", city)
  114. area = driver.find_element_by_xpath(
  115. '//*[@value="市南区"]')
  116. driver.execute_script("arguments[0].click();", area)
  117. driver.implicitly_wait(20)
  118. isOK = driver.find_element_by_id(
  119. 'checkout.fulfillment.pickupTab.pickup.storeLocator-R557').is_enabled()
  120. isOKFlag = bool(1 - isOK)
  121. #print("最后了isOK " + str(isOKFlag))
  122. except:
  123. print("异常了 ")
  124. break
  125. # tips: 经验证,苹果官网如果在付款页面之前实体店无货,若有货后在结算页面也无法选择实体店
  126. # 8.6 选择取货零售店 【此处我选择了-Apple 青岛万象城】
  127. element_pickupTab = driver.find_element_by_id(
  128. 'checkout.fulfillment.pickupTab.pickup.storeLocator-R557')
  129. driver.execute_script("arguments[0].click();", element_pickupTab)
  130. driver.implicitly_wait(20)
  131. # 8.7 选择取货时间 【根据时间自己定】
  132. element_pickup_time = driver.find_element_by_xpath(
  133. '//*[@value="11"]')
  134. driver.execute_script("arguments[0].click();", element_pickup_time)
  135. driver.implicitly_wait(10)
  136. # 8.8 选择取货时间段 【此处我选择了-默认第一个时间段】
  137. element_time_quantum = driver.find_element_by_xpath(
  138. '//*[@aria-labelledby="timeWindows_label"]')
  139. Select(element_time_quantum).select_by_index(1)
  140. driver.implicitly_wait(15)
  141. # 8.9 继续填写取货详情
  142. element_checkout = driver.find_element_by_id(
  143. 'rs-checkout-continue-button-bottom')
  144. driver.implicitly_wait(15)
  145. driver.execute_script("arguments[0].click();", element_checkout)
  146. element_checkout.click()
  147. driver.implicitly_wait(20)
  148. # 9.1 请填写收件人手机号码
  149. element_Phone = driver.find_element_by_name('fullDaytimePhone')
  150. element_Phone.send_keys('电话')
  151. driver.implicitly_wait(10)
  152. # 9.2 请填写收件人身份证
  153. element_nationalId = driver.find_element_by_name('nationalId')
  154. element_nationalId.send_keys('身份证号')
  155. driver.implicitly_wait(10)
  156. # 9.3 检查订单
  157. element_checkoutPay = driver.find_element_by_id(
  158. 'rs-checkout-continue-button-bottom')
  159. driver.execute_script("arguments[0].click();", element_checkoutPay)
  160. driver.implicitly_wait(10)
  161. # 10 立即下单 【此处我选择了-微信支付】
  162. element_billingOptions = driver.find_element_by_id(
  163. 'checkout.billing.billingOptions.options.2')
  164. driver.execute_script("arguments[0].click();", element_billingOptions)
  165. driver.implicitly_wait(10)
  166. # 11.1 确定
  167. element_orderPay = driver.find_element_by_id(
  168. 'rs-checkout-continue-button-bottom')
  169. driver.execute_script("arguments[0].click();", element_orderPay)
  170. driver.implicitly_wait(15)
  171. # 12 确认订单
  172. element_endPay = driver.find_element_by_xpath(
  173. '//*[@aria-describedby="rs-checkout-continuedisclaimer-bottom"]')
  174. driver.execute_script("arguments[0].click();", element_endPay)
  175. driver.implicitly_wait(15)
  176. # 11 退出浏览器
  177. time.sleep(10)
  178. # driver.quit()
  179. print("iphone13 自动化测试结束")
启动

python apple-13.py

全自动操作过程动图

在这里插入图片描述

脚本成果

在这里插入图片描述

写在最后

以上订单均为测试所用,本菜狗并没有购买iphone,也希望大家还是多多支持国货,没有针对,没有道德绑架,只是希望我们国家产物越来越优秀❤️


?猜你想问

如何与狗哥联系进行探讨
关注公众号【JavaDog程序狗】

公众号回复【入群】或者【加入】,便可成为【程序员学习交流摸鱼群】的一员,问题随便问,牛逼随便吹,目前群内已有超过200+个小伙伴啦!!!
9c7ad3b5b2079a72c10509d7a07f129c.png

此群优势:

  1. 技术交流随时沟通
  2. 任何私活资源免费分享
  3. 实时科技动态抢先知晓
  4. CSDN资源免费下载
  5. 本人一切源码均群内开源,可免费使用
2.踩踩狗哥博客

javadog.net

大家可以在里面留言,随意发挥,有问必答

3214478168f4754d3274ab0954a71ff0.png


?猜你喜欢

文章推荐

【规范】看看人家Git提交描述,那叫一个规矩

【工具】用nvm管理nodejs版本切换,真香!

【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本

【项目实战】SpringBoot+uniapp+uview2打造H5+小程序+APP入门学习的聊天小项目

【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

【模块分层】还不会SpringBoot项目模块分层?来这手把手教你!

【ChatGPT】手摸手,带你玩转ChatGPT

【ChatGPT】SpringBoot+uniapp+uview2对接OpenAI,带你开发玩转ChatGPT


463e148ee1c297349e0b7920da855082.jpeg

发表评论

表情:
评论列表 (有 0 条评论,132人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Blink

    ![1362737771-5c7867fec6839_articlex][] Blink 开源了有一段时间了,竟然没发现有人写相关的博客,其实我已经在我的知识星球里开始写了,