hellodk34
2 years ago
4 changed files with 262 additions and 1 deletions
@ -1,3 +1,22 @@ |
|||
# link-cleaner |
|||
|
|||
link cleaner for pinduoduo, taobao, jd, bilibili, and maybe more at the future. |
|||
|
|||
# Usage |
|||
|
|||
1. install [OpenJDK11](https://www.injdk.cn/) for your Windows or Mac or Linux device. |
|||
2. download the jar file to any folder you like. |
|||
3. copy the original link that came from pdd or jd or taobao or bilibili, then just type `java -jar link-cleaner-1.0.0.jar` and run |
|||
4. the output is like this |
|||
``` |
|||
java -jar link-cleaner-1.0.0.jar |
|||
your original clipboard text is: 【【定格动画】当我用20天手绘800张在纸上看《猫和老鼠》????-哔哩哔哩】 https://b23.tv/gbyeley |
|||
your new clipboard text is: 【【定格动画】当我用20天手绘800张在纸上看《猫和老鼠》????-哔哩哔哩】 https://www.bilibili.com/video/BV19t4y1G7dL |
|||
``` |
|||
ps: the last three chars of the `b23.tv` link have been mosaicked. |
|||
5. supported sites at the moment |
|||
- pinduoduo `yangkeduo.com` |
|||
- jd `jd.com` |
|||
- taobao `taobao.com`、`tb.cn` |
|||
- bilibili `bilibili.com`、`b23.tv` |
|||
6. welcome your issue or pr |
|||
|
@ -0,0 +1,66 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
|||
<modelVersion>4.0.0</modelVersion> |
|||
|
|||
<groupId>com.hellodk</groupId> |
|||
<artifactId>link-cleaner</artifactId> |
|||
<version>1.0.0</version> |
|||
|
|||
<properties> |
|||
<maven.compiler.source>11</maven.compiler.source> |
|||
<maven.compiler.target>11</maven.compiler.target> |
|||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
|||
</properties> |
|||
|
|||
<dependencies> |
|||
<dependency> |
|||
<groupId>cn.hutool</groupId> |
|||
<artifactId>hutool-http</artifactId> |
|||
<version>5.7.10</version> |
|||
</dependency> |
|||
</dependencies> |
|||
|
|||
<build> |
|||
<plugins> |
|||
<plugin> |
|||
<groupId>org.apache.maven.plugins</groupId> |
|||
<artifactId>maven-compiler-plugin</artifactId> |
|||
<version>2.3.2</version> |
|||
<configuration> |
|||
<source>11</source> |
|||
<target>11</target> |
|||
</configuration> |
|||
</plugin> |
|||
<plugin> |
|||
<groupId>org.apache.maven.plugins</groupId> |
|||
<artifactId>maven-assembly-plugin</artifactId> |
|||
<version>3.2.0</version> |
|||
<configuration> |
|||
<archive> |
|||
<manifest> |
|||
<!-- 运行 jar 包时运行的主类,要求写全类名 需要包含 package name --> |
|||
<mainClass>MainService</mainClass> |
|||
<!-- 是否指定项目 classpath 下的依赖 --> |
|||
<addClasspath>true</addClasspath> |
|||
</manifest> |
|||
</archive> |
|||
<descriptorRefs> |
|||
<descriptorRef>jar-with-dependencies</descriptorRef> |
|||
</descriptorRefs> |
|||
</configuration> |
|||
<executions> |
|||
<execution> |
|||
<id>make-assembly</id> |
|||
<phase>package</phase> |
|||
<goals> |
|||
<goal>single</goal> |
|||
</goals> |
|||
</execution> |
|||
</executions> |
|||
</plugin> |
|||
</plugins> |
|||
</build> |
|||
|
|||
</project> |
@ -0,0 +1,174 @@ |
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import cn.hutool.http.HttpRequest; |
|||
import cn.hutool.http.HttpResponse; |
|||
|
|||
import java.awt.Toolkit; |
|||
import java.awt.datatransfer.Clipboard; |
|||
import java.awt.datatransfer.DataFlavor; |
|||
import java.awt.datatransfer.StringSelection; |
|||
import java.awt.datatransfer.Transferable; |
|||
import java.awt.datatransfer.UnsupportedFlavorException; |
|||
import java.io.IOException; |
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
/** |
|||
* @author: hellodk |
|||
* @description main service |
|||
* @date: 2022/8/24 12:17 |
|||
*/ |
|||
|
|||
public class MainService { |
|||
public static void main(String[] args) { |
|||
MainService main = new MainService(); |
|||
main.mainEntry(); |
|||
} |
|||
|
|||
private String pddGoodsUri(String url) { |
|||
String[] split = url.split("&"); |
|||
String[] goods = url.split("\\?"); |
|||
String param = ""; |
|||
if (split.length == 1) { |
|||
return split[0]; |
|||
} |
|||
for (int i = 0; i < split.length; i++) { |
|||
String item = split[i]; |
|||
if (item.startsWith("goods") && item.contains("goods_id=")) { |
|||
param = item; |
|||
break; |
|||
} |
|||
} |
|||
return goods[0].concat("?").concat(param); |
|||
} |
|||
|
|||
private String biliUri(String url) { |
|||
String uri = url; |
|||
int httpsIndex = uri.indexOf("https"); |
|||
String text = uri.substring(0, httpsIndex); |
|||
uri = uri.substring(httpsIndex); |
|||
if (uri.contains("b23.tv")) { |
|||
HttpResponse resp = HttpRequest.head(uri).timeout(20000).execute(); |
|||
String location = resp.header("Location"); |
|||
uri = location; |
|||
} |
|||
return (text.length() == 0 ? "" : (text + " ")) + removeParams(uri); |
|||
} |
|||
|
|||
private String jdUri(String url) { |
|||
return removeParams(url); |
|||
} |
|||
|
|||
private String removeParams(String uri) { |
|||
String[] split = uri.split("\\?"); |
|||
return split[0]; |
|||
} |
|||
|
|||
private String taobaoUri(String url) { |
|||
String uri = url; |
|||
if (uri.contains("taobao.com")) { |
|||
return getTaobaocomUri(uri); |
|||
} |
|||
int start = uri.indexOf("https"); |
|||
int end = uri.indexOf(" "); |
|||
String realUri = uri.substring(start, end); |
|||
String result = HttpRequest.get(realUri).timeout(20000).execute().body(); |
|||
String regex = "var url = '([^\\r\\n]*)';"; |
|||
Pattern pattern = Pattern.compile(regex); |
|||
Matcher matcher = pattern.matcher(result); |
|||
if (matcher.find()) { |
|||
uri = matcher.group(1); |
|||
} |
|||
return getTaobaocomUri(uri); |
|||
} |
|||
|
|||
private String getTaobaocomUri(String url) { |
|||
String uri = url; |
|||
String[] split = uri.split("&"); |
|||
if (split.length == 1) { |
|||
return split[0]; |
|||
} |
|||
String[] id = uri.split("\\?"); |
|||
String param = ""; |
|||
for (int i = 0; i < split.length; i++) { |
|||
String item = split[i]; |
|||
if (item.startsWith("id") && item.contains("id=")) { |
|||
param = item; |
|||
break; |
|||
} |
|||
} |
|||
return id[0].concat("?").concat(param); |
|||
} |
|||
|
|||
private void mainEntry() { |
|||
String uri = getSysClipboard(); |
|||
String site = ""; |
|||
if (uri.contains("yangkeduo.com")) { |
|||
site = "pdd"; |
|||
} |
|||
else if (uri.contains("jd.com")) { |
|||
site = "jd"; |
|||
} |
|||
else if (uri.contains("taobao.com") || uri.contains("tb.cn")) { |
|||
site = "taobao"; |
|||
} |
|||
else if (uri.contains("bilibili.com") || uri.contains("b23.tv")) { |
|||
site = "bili"; |
|||
} |
|||
// TODO 支持更多网站
|
|||
|
|||
if (ObjectUtil.isEmpty(site)) { |
|||
System.out.println(uri + " not supported at the moment."); |
|||
} |
|||
String result; |
|||
switch (site) { |
|||
case "pdd": |
|||
result = pddGoodsUri(uri); |
|||
break; |
|||
case "jd": |
|||
result = jdUri(uri); |
|||
break; |
|||
case "taobao": |
|||
result = taobaoUri(uri); |
|||
break; |
|||
case "bili": |
|||
result = biliUri(uri); |
|||
break; |
|||
default: |
|||
//System.exit(0);
|
|||
return; |
|||
} |
|||
setSysClipboard(result); |
|||
System.out.println("your new clipboard text is: " + result); |
|||
} |
|||
|
|||
private void setSysClipboard(String myString) { |
|||
StringSelection stringSelection = new StringSelection(myString); |
|||
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); |
|||
clipboard.setContents(stringSelection, null); |
|||
} |
|||
|
|||
private String getSysClipboard() { |
|||
String result = ""; |
|||
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); |
|||
Transferable tr = clip.getContents(null); |
|||
if (tr != null) { |
|||
// 检查是文本类型再处理,其他类型不处理
|
|||
if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) { |
|||
try { |
|||
result = (String) tr.getTransferData(DataFlavor.stringFlavor); |
|||
} |
|||
catch (UnsupportedFlavorException | IOException ex) { |
|||
System.out.println(ex); |
|||
} |
|||
} |
|||
else { |
|||
System.out.println("only deal with text."); |
|||
} |
|||
} |
|||
else { |
|||
System.out.println("Transferable is null!"); |
|||
} |
|||
System.out.println("your original clipboard text is: " + result); |
|||
return result; |
|||
} |
|||
} |
Loading…
Reference in new issue