diff --git a/.github/ISSUE_TEMPLATE/--------.md b/.github/ISSUE_TEMPLATE/--------.md
index 26076cfc..cf238abd 100644
--- a/.github/ISSUE_TEMPLATE/--------.md
+++ b/.github/ISSUE_TEMPLATE/--------.md
@@ -23,7 +23,7 @@ assignees: Johnserf-Seed
**桌面(请填写以下信息):**
-操作系统:[例如windows10 64bit]
-vpn代理:[例如开启、关闭]
--项目版本:[如1.4.2.2]
+-项目版本:[如1.5.0.0]
-py版本:[如3.11.1]
-依赖库的版本:[出错的库版本号]
diff --git a/.gitignore b/.gitignore
index b617f89a..8a440f27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -137,6 +137,8 @@ dmypy.json
/Download/
readconf.py
.vscode
-/Util/algorithm/node_modules/
+/Server/node_modules/
1.py
-test.py
\ No newline at end of file
+test.py
+/refactor
+*.db
\ No newline at end of file
diff --git a/API/API.js b/API/API.js
deleted file mode 100644
index bce81d82..00000000
--- a/API/API.js
+++ /dev/null
@@ -1,2090 +0,0 @@
-/******/ (function(modules) { // webpackBootstrap
-/******/ // install a JSONP callback for chunk loading
-/******/ function webpackJsonpCallback(data) {
-/******/ var chunkIds = data[0];
-/******/ var moreModules = data[1];
-/******/ var executeModules = data[2];
-/******/
-/******/ // add "moreModules" to the modules object,
-/******/ // then flag all "chunkIds" as loaded and fire callback
-/******/ var moduleId, chunkId, i = 0, resolves = [];
-/******/ for(;i < chunkIds.length; i++) {
-/******/ chunkId = chunkIds[i];
-/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
-/******/ resolves.push(installedChunks[chunkId][0]);
-/******/ }
-/******/ installedChunks[chunkId] = 0;
-/******/ }
-/******/ for(moduleId in moreModules) {
-/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
-/******/ modules[moduleId] = moreModules[moduleId];
-/******/ }
-/******/ }
-/******/ if(parentJsonpFunction) parentJsonpFunction(data);
-/******/
-/******/ while(resolves.length) {
-/******/ resolves.shift()();
-/******/ }
-/******/
-/******/ // add entry modules from loaded chunk to deferred list
-/******/ deferredModules.push.apply(deferredModules, executeModules || []);
-/******/
-/******/ // run deferred modules when all chunks ready
-/******/ return checkDeferredModules();
-/******/ };
-/******/ function checkDeferredModules() {
-/******/ var result;
-/******/ for(var i = 0; i < deferredModules.length; i++) {
-/******/ var deferredModule = deferredModules[i];
-/******/ var fulfilled = true;
-/******/ for(var j = 1; j < deferredModule.length; j++) {
-/******/ var depId = deferredModule[j];
-/******/ if(installedChunks[depId] !== 0) fulfilled = false;
-/******/ }
-/******/ if(fulfilled) {
-/******/ deferredModules.splice(i--, 1);
-/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
-/******/ }
-/******/ }
-/******/
-/******/ return result;
-/******/ }
-/******/
-/******/ // The module cache
-/******/ var installedModules = {};
-/******/
-/******/ // object to store loaded and loading chunks
-/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
-/******/ // Promise = chunk loading, 0 = chunk loaded
-/******/ var installedChunks = {
-/******/ 30: 0
-/******/ };
-/******/
-/******/ var deferredModules = [];
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/
-/******/ // Check if module is in cache
-/******/ if(installedModules[moduleId]) {
-/******/ return installedModules[moduleId].exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = installedModules[moduleId] = {
-/******/ i: moduleId,
-/******/ l: false,
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ // Flag the module as loaded
-/******/ module.l = true;
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/******/
-/******/ // expose the modules object (__webpack_modules__)
-/******/ __webpack_require__.m = modules;
-/******/
-/******/ // expose the module cache
-/******/ __webpack_require__.c = installedModules;
-/******/
-/******/ // define getter function for harmony exports
-/******/ __webpack_require__.d = function(exports, name, getter) {
-/******/ if(!__webpack_require__.o(exports, name)) {
-/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ }
-/******/ };
-/******/
-/******/ // define __esModule on exports
-/******/ __webpack_require__.r = function(exports) {
-/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ }
-/******/ Object.defineProperty(exports, '__esModule', { value: true });
-/******/ };
-/******/
-/******/ // create a fake namespace object
-/******/ // mode & 1: value is a module id, require it
-/******/ // mode & 2: merge all properties of value into the ns
-/******/ // mode & 4: return value when already ns object
-/******/ // mode & 8|1: behave like require
-/******/ __webpack_require__.t = function(value, mode) {
-/******/ if(mode & 1) value = __webpack_require__(value);
-/******/ if(mode & 8) return value;
-/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ var ns = Object.create(null);
-/******/ __webpack_require__.r(ns);
-/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ return ns;
-/******/ };
-/******/
-/******/ // getDefaultExport function for compatibility with non-harmony modules
-/******/ __webpack_require__.n = function(module) {
-/******/ var getter = module && module.__esModule ?
-/******/ function getDefault() { return module['default']; } :
-/******/ function getModuleExports() { return module; };
-/******/ __webpack_require__.d(getter, 'a', getter);
-/******/ return getter;
-/******/ };
-/******/
-/******/ // Object.prototype.hasOwnProperty.call
-/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ // __webpack_public_path__
-/******/ __webpack_require__.p = "https://sf3-scmcdn2-tos.pstatp.com/ies/fe_app_new/";
-/******/
-/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
-/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
-/******/ jsonpArray.push = webpackJsonpCallback;
-/******/ jsonpArray = jsonpArray.slice();
-/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
-/******/ var parentJsonpFunction = oldJsonpFunction;
-/******/
-/******/
-/******/ // add entry module to deferred list
-/******/ deferredModules.push([29,0]);
-/******/ // run deferred modules when ready
-/******/ return checkDeferredModules();
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ "113c86d39c3ccfcccc8a":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-__webpack_require__("46107d86b7941adbc814");
-
-module.exports = {
- show: function show() {
- $('#pagelet-loading').show();
- },
- hide: function hide() {
- $('#pagelet-loading').hide();
- }
-};
-
-/***/ }),
-
-/***/ "12a5c4dc26e1824fdd8b":
-/***/ (function(module, exports, __webpack_require__) {
-
-// extracted by mini-css-extract-plugin
-module.exports = {"pagelet-banner":"pagelet-banner","hide":"hide","move-hide":"move-hide","app-download":"app-download","banner-show":"banner-show","up-down":"up-down","banner-show1":"banner-show1","download-btn":"download-btn","txt":"txt"};
-
-/***/ }),
-
-/***/ "166003ecd7694b2377b6":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var OpenBrowser = __webpack_require__("adf14ea98b2960ef189a");
-
-var isVoice = false;
-var modal = new OpenBrowser(); // jump2app相关
-
-var schemas = {
- home: 'snssdk1128://feed?refer=web&gd_label={{gd_label}}',
- // 首页feed
- detail: 'snssdk1128://aweme/detail/{{id}}?refer=web&gd_label={{gd_label}}&appParam={{appParam}}&needlaunchlog=1',
- // 作品详情页
- user: 'snssdk1128://user/profile/{{uid}}?refer=web&gd_label={{gd_label}}&type={{type}}&needlaunchlog=1',
- // 用户主页
- challenge: 'snssdk1128://challenge/detail/{{id}}?refer=web&is_commerce=0',
- // 挑战详情
- music: 'snssdk1128://music/detail/{{id}}?refer=web',
- // 音乐详情
- live: 'snssdk1128://live?room_id={{room_id}}&user_id={{user_id}}&u_code={{u_code}}&from=webview&refer=web',
- // 直播间
- webview: 'snssdk1128://webview?url={{url}}&from=webview&refer=web',
- // webview
- webview_fullscreen: 'snssdk1128://webview?url={{url}}&from=webview&hide_nav_bar=1&refer=web',
- // webview 沉浸式
- poidetail: 'snssdk1128://poi/detail?id={{id}}&from=webview&refer=web',
- // poi详情页
- forward: 'snssdk1128://forward/detail/{{id}}',
- // 转发详情页
- billboard_word: 'snssdk1128://search/trending',
- // 热搜词榜
- billboard_video: 'snssdk1128://search/trending?type=1',
- // 热搜视频榜
- billboard_music: 'snssdk1128://search/trending?type=2',
- // 热搜音乐榜
- billboard_positive: 'snssdk1128://search/trending?type=3',
- // 正能量榜
- billboard_star: 'snssdk1128://search/trending?type=4' // 明星榜
-
-}; // universal link url
-
-var UNIVERSAL_LINK = 'https://www.amemv.com/redirect/?redirect_url='; // 小型模板引擎nano,仅支持JSON数据
-
-function nano(template, data) {
- return template.replace(/\{\{([\w\.]*)\}\}/g, function (str, key) {
- var keys = key.split('.');
- var v = data[keys.shift()];
-
- for (var i = 0, l = keys.length; i < l; i++) {
- v = v[keys[i]];
- }
-
- return typeof v !== 'undefined' && v !== null ? v : '';
- });
-} // 工具函数结束
-// 拼接schema
-
-
-function _schemaFactory(type, params) {
- var schema = schemas[type] || null;
-
- if (getQueryString('app') == 'douyin_lite') {
- // 抖音极速版替换appid
- schema = schema.replace(/^snssdk1128/, 'snssdk2329');
- }
-
- if (schema) {
- schema = nano(schema, params || {});
- }
-
- return schema;
-}
-
-function _nativeLinkFactory(type, params) {
- var link_tmpl = {};
- var link = link_tmpl[type] || null;
-
- if (link) {
- link = nano(link, params);
- }
-
- return link;
-}
-
-function _openAppInIframe(schema) {
- var a = document.createElement('a');
- a.setAttribute('href', schema);
- a.click();
- $('body').append(""));
-}
-
-function _getDeepLink(schema, downloadLink) {
- var deepLink = ''; // 对于universal link,ios内部schema是aweme开头,所提替换链接上的schema为 aweme 开头
-
- if (getQueryString('app') == 'douyin_lite') {
- // 抖音极速版替换appid
- schema = schema.replace(/^snssdk1128/, 'snssdk2329');
- return schema;
- }
-
- schema = schema.replace(/^snssdk1128/, 'aweme');
- deepLink = UNIVERSAL_LINK + encodeURIComponent(schema);
-
- if (downloadLink) {
- if (downloadLink.startsWith('//')) {
- downloadLink = 'https:' + downloadLink;
- }
-
- deepLink += "&next_url=".concat(encodeURIComponent(downloadLink));
- }
-
- return deepLink;
-}
-/**
- * @params {String} type 跳转类型
- * @params {Object} params 跳转参数
- * @params {String} downloadLink 下载地址
- */
-
-
-function jumpToNativeApp(type, params, downloadLink) {
- var schema = _schemaFactory(type || 'home', params);
-
- if (!schema) {
- return;
- } // alert(schema);
-
-
- if ($.os.ios) {
- var currentUrl = location.href;
- var version = parseFloat($.os.version);
- var ios9 = parseInt(version, 10) >= 9; // ios9 以下,直接用iframe的方式
-
- if (!ios9) {
- _openAppInIframe(schema);
-
- return;
- }
- /**
- * 如果是ios9及以上,那么尝试用deeplink方式打开
- * 否则,仍然像目前这样的调用方式
- * IOS下的qqbrowser,因为跳转会白屏,不采用universal link方式
- */
-
-
- if (ios9 && !$.browser.qqbrowser) {
- var deepLink = _getDeepLink(schema, downloadLink);
-
- if (schema.indexOf('detail') >= 0) {
- copyHandle();
- }
-
- if (isVoice) {
- top.location.href = deepLink;
- } else {
- location.href = deepLink;
- } // safari里,服务端重定向到schema后,无法打开app,会弹出弹框,通过刷新刷掉弹框
- // if (!$.browser.weixin && $.browser.safari) {
- // setTimeout(function() {
- // alert('his' + location.href)
- // location.href = deepLink;
- // }, 100);
- // }
-
-
- return;
- }
- /**
- * ios9 qq浏览器
- * ios9 上,通过schema跳转应用,如果安装了会提示是否跳转app,如果没安装,会提示无法打开url
- */
-
-
- setTimeout(function () {
- location.href = schema;
- setTimeout(function () {
- if (document.hidden || document.webkitHidden) {
- location.href = currentUrl;
- }
- }, 1300);
- }, 10);
- } else {
- if (!$.browser.weixin) {
- _openAppInIframe(schema);
- }
- }
-}
-
-function apploadHandler(opts) {
- var schema = _schemaFactory(opts.type || 'home', opts.params);
-
- var self = this;
-
- if ($.browser.weixin) {
- var schemaName = function (sys) {
- var suffix = '_scheme';
- var name = sys.ios ? 'ios' : 'android';
- return name + suffix;
- }($.os); // var schema = _schemaFactory(opts.type, opts.params);
-
-
- if (schema) {
- var url = [opts.downloadLink, opts.downloadLink.indexOf('?') > -1 ? '&' : '?', schemaName, "=".concat(encodeURIComponent(schema))].join(''); // ios微信直接加修改location会被屏蔽,原因未明
-
- setTimeout(function () {
- location.href = url;
- });
- return;
- }
- }
-
- if ($.os.ios) {
- var osVersion = parseFloat($.os.version);
- var ios9 = $.os.ios && osVersion >= 9;
- /*
- safari中,下载短链会呼出apple store, wap2app的时候如果用户没有安装,会alert一个错误,导致下载短链无法执行,
- 因此必须先执行下载
- */
-
- if (!$.browser.weixin && $.browser.safari && ios9) {
- // _gotoAppDownload(opts);
- // 好象不用唤起,直接下载就行啦,不敢改 :(
- // setTimeout(function () {
- // _wap2app(opts);
- // }, 1000);
- jumpToNativeApp(opts.type, opts.params, opts.downloadLink);
-
- if ($.browser.qq) {
- modal.open();
- }
- } else {
- /* ios
- 微信中,下载短链302到应用宝,同时universal link会302到 snssdk143://xx,而微信会屏蔽snssdk143://这种非http协议,
- 由于两者时间很短,几乎同时,似乎对短链的302也屏蔽的,(不太了解机制),所以两者时间上要有一定的间隔。
- 由于下载短链在当前页面打开应用宝页面,就不会执行后面的代码,所以先进行跳转
- */
- _wap2app(opts);
-
- setTimeout(function () {
- _checkOpen(function (isOpen) {
- !isOpen && _gotoAppDownload(opts);
- });
- }, 1000);
- }
-
- return;
- } else {
- // android 其它
- _openAppInIframe(schema);
-
- _checkOpen(function (isOpen) {
- !isOpen && _gotoAppDownload(opts);
- }); // qq空间无法唤起(下载)app, qq会话窗口可以,但是无法区别是从qq会话还是空间打开的页面
- // 所以在qq内,使用一个弹层引导用户在其它浏览器打开页面
-
-
- if ($.browser.qq) {
- modal.open();
- }
- }
-}
-
-function _wap2app(opts) {
- jumpToNativeApp(opts.type, opts.params);
-}
-
-function _gotoAppDownload(opts) {
- if (opts.downloadLink) {
- if (isVoice) {
- top.location.href = opts.downloadLink;
- } else {
- location.href = opts.downloadLink;
- }
-
- location.href = opts.downloadLink;
- }
-} // 检查app是否打开
-
-
-function _checkOpen(cb) {
- var _count = 0;
-
- var _clickTime = Number(new Date());
-
- var intHandle;
-
- function check(elsTime) {
- if (isVoice) {
- if (elsTime > 1000 || top.document.hidden || top.document.webkitHidden) {
- cb(true);
- } else {
- cb(false);
- }
- } else {
- if (elsTime > 1000 || document.hidden || document.webkitHidden) {
- cb(true);
- } else {
- cb(false);
- }
- }
- } // 启动间隔20ms运行的定时器,并检测累计消耗时间是否超过1000ms,超过则结束
-
-
- intHandle = setInterval(function () {
- _count++;
-
- var elsTime = Number(new Date()) - _clickTime;
-
- if (_count >= 15 || elsTime > 1000) {
- clearInterval(intHandle);
- check(elsTime);
- }
- }, 40);
-} // gd_label是唤起应用时,通知客户端记录打点的字段
-// gd_label参数: https://wiki.bytedance.net/pages/viewpage.action?pageId=179404954
-// gd_label的值有哪些: https://docs.google.com/spreadsheets/d/1EWzh4gIbE861d9Rbk-M7QNYCPnltkNt9r2ETVSV2wf4/edit#gid=2126697475
-
-
-function setGdLabel(val) {
- // click_schema_ugdsp_aweme: DSP拉活(https://bytedance.feishu.cn/docs/doccnZNSYA9Zc3FMeGQ490l6dZf#)
- var scene = getQueryString('scene');
-
- if (scene == 'dsp') {
- return 'click_schema_ugdsp_aweme';
- }
-
- if (/^click_(wexin|wap)_/.test(val)) {
- return val;
- } else {
- var type = function (weixin) {
- return weixin ? 'weixin' : 'wap';
- }($.browser.weixin);
-
- return "click_".concat(type, "_").concat(val);
- }
-}
-
-function getQueryString(name) {
- var reg = new RegExp("(^|&)".concat(name, "=([^&]*)(&|$)"), 'i');
- var r = window.location.search.substr(1).match(reg);
-
- if (r != null) {
- return unescape(r[2]);
- }
-
- return null;
-}
-
-function getUrlFromDl(dl, opts) {
- var url = '';
-
- try {
- var dlFromQuery = getQueryString('dl');
- url = dlFromQuery && opts.useDl && "//d.douyin.com/".concat(dlFromQuery, "/") || '';
- var query = (dl || '').split('?')[1] || '';
-
- if (url && query) {
- url = "".concat(url, "?").concat(query);
- }
- } catch (e) {
- console.log(e);
- }
-
- return url;
-}
-
-function copyHandle() {
- var input = document.createElement('input');
- document.body.appendChild(input);
- input.setAttribute('readonly', 'readonly');
- input.setAttribute('value', window.location.href.replace('aweme.snssdk.com', 'www.iesdouyin.com'));
- input.select();
- input.setSelectionRange(0, 9999);
-
- if (document.execCommand('copy')) {
- document.execCommand('copy');
- }
-
- document.body.removeChild(input);
- console.log('copy');
-} // download_sdk相关
-
-/**
- * @功能:跳转下载app,并尝试唤起app
- * @dependance:window.jumpToNativeApp
- */
-
-
-module.exports = {
- downloadApp: function downloadApp(dl, opts, voice) {
- isVoice = voice;
- /**
- /* downloadLink: '' // 跳转链接
- * type: '', // app唤起类型,参考schemas中的key
- * params: {}, // 跳转app参数,替换到对应schema中
- */
-
- if (opts.params && opts.params.gd_label) {
- var gd_label = setGdLabel(opts.params.gd_label);
- var params = $.extend({}, opts.params, {
- gd_label: gd_label
- });
- opts.params = params;
- }
-
- apploadHandler($.extend({
- downloadLink: getUrlFromDl(dl, opts) || dl
- }, opts));
- }
-};
-
-/***/ }),
-
-/***/ "1d2f6dd2d416eba8db8a":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-module.exports = {
- getQueryStr: function getQueryStr(params) {
- return Object.keys(params).map(function (key) {
- return [key, encodeURIComponent(params[key])].join('=');
- }).join('&');
- },
- getQueryObj: function getQueryObj() {
- var queryStr = location.search.slice(1);
-
- if (!queryStr) {
- return {};
- }
-
- var aTemp = queryStr.split('&');
- var obj = {};
- aTemp.forEach(function (param) {
- var arr = param.split('=');
- obj[arr[0]] = arr[1];
- });
- return obj;
- },
- getLastPathId: function getLastPathId() {
- return location.pathname.match(/\d+/g)[0];
- }
-};
-
-/***/ }),
-
-/***/ "206d7d768e507237f87a":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var appTrack = {
- getParams: function getParams(params, url) {
- return {
- extra: JSON.stringify(params),
- // 用于短链匹配
- append: JSON.stringify({
- // 用于动态打包
- openurl: url || '',
- postdata: [params]
- })
- };
- }
-};
-module.exports = appTrack;
-
-/***/ }),
-
-/***/ 29:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__("78a3850f5800635eb493");
-
-
-/***/ }),
-
-/***/ "3e4859239cf0f183ef63":
-/***/ (function(module, exports) {
-
-module.exports = function(obj) {
-obj || (obj = {});
-var __t, __p = '';
-with (obj) {
-__p += '
\n ';
- if (data.verification_type == 2){ ;
-__p += '\n
\n
音乐' +
-((__t = ( data.original_musician.music_count )) == null ? '' : __t) +
-'
\n
作品' +
-((__t = ( data.aweme_count )) == null ? '' : __t) +
-'
\n ';
- }else { ;
-__p += '\n
\n
作品' +
-((__t = ( data.aweme_count )) == null ? '' : __t) +
-'
\n ';
- } ;
-__p += '\n
喜欢' +
-((__t = ( data.favoriting_count )) == null ? '' : __t) +
-'
\n
\n
';
-
-}
-return __p
-}
-
-/***/ }),
-
-/***/ "fd19f810c56546fb697a":
-/***/ (function(module, exports) {
-
-module.exports = function(obj) {
-obj || (obj = {});
-var __t, __p = '';
-with (obj) {
-__p += '
\n
\n
链接打不开?
\n
请点击右上角
\n
选择在“浏览器”中打开
\n
\n
\n
';
-
-}
-return __p
-}
-
-/***/ })
-
-/******/ });
-//# sourceMappingURL=index.f2516941.js.map
\ No newline at end of file
diff --git "a/API/API\345\217\202\350\200\203.md" "b/API/API\345\217\202\350\200\203.md"
deleted file mode 100644
index 47300959..00000000
--- "a/API/API\345\217\202\350\200\203.md"
+++ /dev/null
@@ -1,34 +0,0 @@
-# API参考
-
-var schemas = {
- home: 'snssdk1128://feed?refer=web&gd_label={{gd_label}}',
- // 首页feed
- detail: 'snssdk1128://aweme/detail/{{id}}?refer=web&gd_label={{gd_label}}&appParam={{appParam}}&needlaunchlog=1',
- // 作品详情页
- user: 'snssdk1128://user/profile/{{uid}}?refer=web&gd_label={{gd_label}}&type={{type}}&needlaunchlog=1',
- // 用户主页
- challenge: 'snssdk1128://challenge/detail/{{id}}?refer=web&is_commerce=0',
- // 挑战详情
- music: 'snssdk1128://music/detail/{{id}}?refer=web',
- // 音乐详情
- live: 'snssdk1128://live?room_id={{room_id}}&user_id={{user_id}}&u_code={{u_code}}&from=webview&refer=web',
- // 直播间
- webview: 'snssdk1128://webview?url={{url}}&from=webview&refer=web',
- // webview
- webview_fullscreen: 'snssdk1128://webview?url={{url}}&from=webview&hide_nav_bar=1&refer=web',
- // webview 沉浸式
- poidetail: 'snssdk1128://poi/detail?id={{id}}&from=webview&refer=web',
- // poi详情页
- forward: 'snssdk1128://forward/detail/{{id}}',
- // 转发详情页
- billboard_word: 'snssdk1128://search/trending',
- // 热搜词榜
- billboard_video: 'snssdk1128://search/trending?type=1',
- // 热搜视频榜
- billboard_music: 'snssdk1128://search/trending?type=2',
- // 热搜音乐榜
- billboard_positive: 'snssdk1128://search/trending?type=3',
- // 正能量榜
- billboard_star: 'snssdk1128://search/trending?type=4' // 明星榜
-
-}; // universal link url
\ No newline at end of file
diff --git a/API/Server.txt b/API/Server.txt
deleted file mode 100644
index 8356b57c..00000000
--- a/API/Server.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(1, 4, 2, 2),
- prodvers=(1, 4, 2, 2),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'本地解析服务'),
- StringStruct(u'FileVersion', u'1.4.2.2'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'本地解析服务'),
- StringStruct(u'ProductVersion', u'1.4.2.2')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/API/TikTokAPI.py b/API/TikTokAPI.py
deleted file mode 100644
index f44b4a6b..00000000
--- a/API/TikTokAPI.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env python
-# -*- encoding: utf-8 -*-
-'''
-@Description:TikTokAPI
-@Date :2021/01/29 13:34:54
-@Author :JohnserfSeed
-@version :1.0
-@License :(C)Copyright 2017-2020, Liugroup-NLPR-CASIA
-@Mail :johnserfseed@gmail.com
-'''
-
-import requests,json,re,os
-from TikTokMulti import TikTok
-
-
-class TikTokAPI():
-
- def __init__(self) -> None:
- self.PCheader = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
- self.iPXheader = {'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
- #抖音热榜API
- self.Billboard_Share = 'https://www.iesdouyin.com/share/billboard/?id=0'
- self.Billboard_Hot = 'https://aweme-hl.snssdk.com/aweme/v1/hot/search/list/?detail_list=0&mac_address=08:00:27:29:D2:F5&os_api=23&device_type=MI%205s&device_platform=android&ssmix=a&iid=92152480453&manifest_version_code=860&dpi=320&uuid=008796750074613&version_code=860&app_name=aweme&version_name=8.6.0&ts=1577932778&openudid=c055533a0591b2dc&device_id=69918538596&resolution=810*1440&os_version=6.0.1&language=zh&device_brand=Xiaomi&app_type=normal&ac=wifi&update_version_code=8602&aid=1128&channel=tengxun_new&_rticket=1577932779592'
- self.Billboard_Video = 'https://aweme-hl.snssdk.com/aweme/v1/hot/search/list/?detail_list=1&mac_address=08:00:27:29:D2:F5&os_api=23&device_type=MI%205s&device_platform=android&ssmix=a&iid=92152480453&manifest_version_code=860&dpi=320&uuid=008796750074613&version_code=860&app_name=aweme&version_name=8.6.0&ts=1577932778&openudid=c055533a0591b2dc&device_id=69918538596&resolution=810*1440&os_version=6.0.1&language=zh&device_brand=Xiaomi&app_type=normal&ac=wifi&update_version_code=8602&aid=1128&channel=tengxun_new&_rticket=1577932779592'
- pass
-
- def Get_Tk_Billboard(self):
-
- pass
-
- def Set_Tk_Billboard(self):
-
- pass
-
-
-if __name__ == "__main__":
- pass
\ No newline at end of file
diff --git a/API/TikTokDownloadVersion.txt b/API/TikTokDownloadVersion.txt
deleted file mode 100644
index fbf70351..00000000
--- a/API/TikTokDownloadVersion.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(1, 4, 2, 2),
- prodvers=(1, 4, 2, 2),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'抖音单视频下载'),
- StringStruct(u'FileVersion', u'1.4.2.2'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'抖音单视频下载'),
- StringStruct(u'ProductVersion', u'1.4.2.2')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/API/TikTokGUIVersion.txt b/API/TikTokGUIVersion.txt
deleted file mode 100644
index 79469212..00000000
--- a/API/TikTokGUIVersion.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(2, 1, 1, 0),
- prodvers=(2, 1, 1, 0),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'抖音批量下载-图形界面'),
- StringStruct(u'FileVersion', u'2.1.1.0'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'抖音批量下载-图形界面'),
- StringStruct(u'ProductVersion', u'2.1.1.0')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/API/TikTokLive.txt b/API/TikTokLive.txt
deleted file mode 100644
index 81166a95..00000000
--- a/API/TikTokLive.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(1, 4, 2, 2),
- prodvers=(1, 4, 2, 2),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'抖音直播推流抓取'),
- StringStruct(u'FileVersion', u'1.4.2.2'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'抖音直播推流抓取'),
- StringStruct(u'ProductVersion', u'1.4.2.2')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/API/TikTokMultiVersion.txt b/API/TikTokMultiVersion.txt
deleted file mode 100644
index 4e2da532..00000000
--- a/API/TikTokMultiVersion.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(1, 2, 5, 30),
- prodvers=(1, 2, 5, 30),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'抖音批量下载'),
- StringStruct(u'FileVersion', u'1.2.5.30'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2022 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'抖音批量下载'),
- StringStruct(u'ProductVersion', u'1.2.5.30')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/API/TikTokPicVersion.txt b/API/TikTokPicVersion.txt
deleted file mode 100644
index d9cac668..00000000
--- a/API/TikTokPicVersion.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(1, 4, 2, 2),
- prodvers=(1, 4, 2, 2),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'抖音图集下载'),
- StringStruct(u'FileVersion', u'1.0.0.0'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'抖音图集下载'),
- StringStruct(u'ProductVersion', u'1.0.0.0')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/API/TikTokTool.txt b/API/TikTokTool.txt
index f325bdb3..ade4452d 100644
--- a/API/TikTokTool.txt
+++ b/API/TikTokTool.txt
@@ -31,10 +31,10 @@ VSVersionInfo(
u'080404b0',
[StringStruct(u'CompanyName', u'JohnserfSeed'),
StringStruct(u'FileDescription', u'抖音视频批量下载'),
- StringStruct(u'FileVersion', u'1.4.2.2'),
+ StringStruct(u'FileVersion', u'1.5.0.0'),
StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
StringStruct(u'ProductName', u'抖音视频批量下载'),
- StringStruct(u'ProductVersion', u'1.4.2.2')])
+ StringStruct(u'ProductVersion', u'1.5.0.0')])
]),
VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
]
diff --git a/API/TikTokUpdata.txt b/API/TikTokUpdata.txt
deleted file mode 100644
index 69eaac42..00000000
--- a/API/TikTokUpdata.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-# UTF-8
-#
-# For more details about fixed file info 'ffi' see:
-# http://msdn.microsoft.com/en-us/library/ms646997.aspx
-VSVersionInfo(
- ffi=FixedFileInfo(
- # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
- # Set not needed items to zero 0.
- filevers=(1, 0, 0, 0),
- prodvers=(1, 0, 0, 0),
- # Contains a bitmask that specifies the valid bits 'flags'r
- mask=0x3f,
- # Contains a bitmask that specifies the Boolean attributes of the file.
- flags=0x0,
- # The operating system for which this file was designed.
- # 0x4 - NT and there is no need to change it.
- OS=0x40004,
- # The general type of file.
- # 0x1 - the file is an application.
- fileType=0x1,
- # The function of the file.
- # 0x0 - the function is not defined for this fileType
- subtype=0x0,
- # Creation date and time stamp.
- date=(0, 0)
- ),
- kids=[
- StringFileInfo(
- [
- StringTable(
- u'080404b0',
- [StringStruct(u'CompanyName', u'JohnserfSeed'),
- StringStruct(u'FileDescription', u'TikTokTool更新程序'),
- StringStruct(u'FileVersion', u'1.0.0.0'),
- StringStruct(u'LegalCopyright', u'Copyright (C) 2019-2023 JohnserfSeed. All Rights Reserved'),
- StringStruct(u'ProductName', u'TikTokTool更新程序'),
- StringStruct(u'ProductVersion', u'1.0.0.0')])
- ]),
- VarFileInfo([VarStruct(u'Translation', [2052, 1200])])
- ]
-)
\ No newline at end of file
diff --git a/Collection/CopyWritingHomePage_1.json b/Collection/CopyWritingHomePage_1.json
deleted file mode 100644
index 5a9bcce5..00000000
--- a/Collection/CopyWritingHomePage_1.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "User_0":
- {
- "uid":"",
- "description":"",
- "url":
- [
- ""
- ]
- }
-}
\ No newline at end of file
diff --git a/Collection/GirlHomePage_1.json b/Collection/GirlHomePage_1.json
deleted file mode 100644
index 94f716b0..00000000
--- a/Collection/GirlHomePage_1.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "0":
- {
- "uid":"小e同学",
- "description":"好看的小姐姐",
- "url":
- [
- "https://v.douyin.com/JcjJ5Tq/"
- ]
- },
- "1":
- {
- "uid":"小橙子",
- "description":"好看的小姐姐",
- "url":
- [
- "https://v.douyin.com/evLNohM/"
- ]
- },
- "2":
- {
- "uid":"黑色闪光",
- "description":"好看的小姐姐",
- "url":
- [
- "https://v.douyin.com/evLhSNB/"
- ]
- }
-}
\ No newline at end of file
diff --git a/Collection/MusicHomePage_1.json b/Collection/MusicHomePage_1.json
deleted file mode 100644
index bb1d950d..00000000
--- a/Collection/MusicHomePage_1.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "User_0":
- {
- "uid":"楊老x",
- "description":"抖音翻唱",
- "url":
- [
- "https://v.douyin.com/Jcn71nB/"
- ]
- },
- "User_1":
- {
- "uid":"花花花菜",
- "description":"抖音翻唱",
- "url":
- [
- "https://v.douyin.com/Jcn7yaQ/"
- ]
- }
-}
\ No newline at end of file
diff --git a/DB/create.sql b/DB/create.sql
deleted file mode 100644
index df31c1af..00000000
--- a/DB/create.sql
+++ /dev/null
@@ -1,29 +0,0 @@
---
--- SQLiteStudio v3.4.3 生成的文件,周一 2月 13 23:47:22 2023
---
--- 所用的文本编码:UTF-8
---
-PRAGMA foreign_keys = off;
-BEGIN TRANSACTION;
-
--- 表:aweme
-CREATE TABLE IF NOT EXISTS aweme (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- aweme_collect_count TEXT NOT NULL,
- aweme_comment_count TEXT NOT NULL,
- aweme_creat_time TEXT (10) NOT NULL,
- aweme_desc TEXT NOT NULL,
- aweme_digg_count TEXT NOT NULL,
- aweme_nickname TEXT NOT NULL,
- aweme_music_uri TEXT (19) NOT NULL,
- aweme_play_count TEXT NOT NULL,
- aweme_sec_uid TEXT (19) NOT NULL,
- aweme_share_count TEXT NOT NULL,
- aweme_type INTEGER (3) NOT NULL,
- aweme_unique_id TEXT NOT NULL,
- aweme_user_age INTEGER (3) NOT NULL
-);
-
-
-COMMIT TRANSACTION;
-PRAGMA foreign_keys = on;
diff --git a/Logo.ico b/Logo.ico
deleted file mode 100644
index b8bdff18..00000000
Binary files a/Logo.ico and /dev/null differ
diff --git a/README-EN.md b/README-EN.md
index 9f536bb0..88b992c5 100644
--- a/README-EN.md
+++ b/README-EN.md
@@ -114,7 +114,7 @@
## 🖥 Supported Operating Systems
- List of Operating Systems supported by version 1.4.2.2
+ List of Operating Systems supported by version 1.5.0.0
- Windows 11
- Windows 10 Version 1809 (OS Build 17763) or later
diff --git a/README.md b/README.md
index 28f02884..6d9ac9bd 100644
--- a/README.md
+++ b/README.md
@@ -18,9 +18,11 @@
[![GitHub Issues](https://img.shields.io/github/issues/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
[![GitHub Closed Issues](https://img.shields.io/github/issues-closed/johnserf-seed/tiktokdownload?style=social)](https://github.com/Johnserf-Seed/TikTokDownload)
+[![F2 Downloads](https://pepy.tech/badge/f2/month)](https://pepy.tech/project/f2)
+[![PyPI version](https://badge.fury.io/py/f2.svg)](https://badge.fury.io/py/f2)
[![jsDelivr monthly hits](https://data.jsdelivr.com/v1/package/gh/Johnserf-Seed/TikTokDownload/badge)](https://www.jsdelivr.com/package/gh/Johnserf-Seed/TikTokDownload)
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2FJohnserf-Seed%2FTikTokDownload&count_bg=%235FFFFF&title_bg=%23FB1953&icon=tiktok.svg&icon_color=%23250C1F&title=view&edge_flat=false)](https://hits.seeyoufarm.com)
-[![Discord](https://img.shields.io/discord/1070512513889878067?color=5865F2&logo=discord&logoColor=white?style=for-the-badge)](https://discord.gg/q3hA8qQZbG)
+[![Discord](https://img.shields.io/discord/1146473603450282004?color=5865F2&logo=discord&logoColor=white?style=for-the-badge)](https://discord.gg/3PhtPmgHf8)
[![Patreon](https://img.shields.io/badge/Patreon-TikTokDownload-red.svg?style=flat&logo=patreon)](https://www.patreon.com/TikTokDownload713)
@@ -29,15 +31,15 @@
## 🚀 环境准备/Environment
> [![Microsoft 应用商店](https://tvax1.sinaimg.cn/large/006908GAly1hgn87jhad8j305001qa9y.jpg)](https://aka.ms/terminal)
->
+>
> 旧的控制台无法很好适配,推荐使用Windows Terminal。
->
+>
> [![Python v3.11.1](https://www.python.org/static/img/python-logo.png)](https://www.python.org/ftp/python/3.11.1/python-3.11.1-amd64.exe)
->
+>
> Python3.11.1 低于该版本可能会有意外的错误
->
+>
> [![GitHub 发行版](https://tvax2.sinaimg.cn/large/006908GAly1hh16psn51aj30a5020gly.jpg)](https://github.com/Johnserf-Seed/TikTokDownload/releases)
->
+>
> 发行版下载 每次Commits之后会重新打包