从 API 获取图片并下载 - Bash 和 Java 实现
从 API 获取图片并下载 - Bash 和 Java 实现
本示例展示了使用 Bash 和 Java 脚本从 API 获取图片 URL 并下载图片的步骤,涵盖了 API 请求、JSON 解析、正则表达式匹配和图片下载等操作。
Bash 脚本
response=$(curl -s 'https://app.huashijie.art/api/work/detailV2?visitorId=-1&workId=180830738&cur_user_id=-1&platform=android&os_version=28&version_code=217&device_brand=vivo&device_model=vivo%20X21&token=&channel=vivo')
json=$(echo $response | jq)
b=$(echo $json | jq '.data.multiImages[0].imgPath')
echo $b
if [[ $b =~ (http://bsyimg.pandapaint.net/v2/work_cover/user/[0-9]+/[0-9]+.jpg) ]]; then
image_url=${BASH_REMATCH[1]}
echo '下载图片:$image_url'
# 使用wget下载图片
wget $image_url
else
echo '未能提取到图片地址'
fi
Java 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
try {
String apiUrl = 'https://app.huashijie.art/api/work/detailV2?visitorId=-1&workId=180830738&cur_user_id=-1&platform=android&os_version=28&version_code=217&device_brand=vivo&device_model=vivo%20X21&token=&channel=vivo';
String response = sendGetRequest(apiUrl);
String json = response.trim();
String b = getJsonValue(json, 'data.multiImages[0].imgPath');
System.out.println(b);
Pattern pattern = Pattern.compile('http://bsyimg.pandapaint.net/v2/work_cover/user/[0-9]+/[0-9]+.jpg');
Matcher matcher = pattern.matcher(b);
if (matcher.find()) {
String imageUrl = matcher.group();
System.out.println('下载图片:' + imageUrl);
// 使用Java下载图片
downloadImage(imageUrl);
} else {
System.out.println('未能提取到图片地址');
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static String sendGetRequest(String apiUrl) throws IOException {
URL url = new URL(apiUrl);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
return response.toString();
}
private static String getJsonValue(String json, String key) {
String[] keys = key.split('\\.');
for (String k : keys) {
if (json.startsWith('{'') && json.endsWith('}')) {
json = json.substring(1, json.length() - 1);
} else {
return '';
}
String regex = '\'' + k + '\':\s*'(.*?)'';
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(json);
if (matcher.find()) {
json = matcher.group(1);
} else {
return '';
}
}
return json;
}
private static void downloadImage(String imageUrl) throws IOException {
URL url = new URL(imageUrl);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()))) {
String fileName = imageUrl.substring(imageUrl.lastIndexOf('/') + 1);
String savePath = './' + fileName;
// 创建输出流,将图片保存到本地
Files.copy(reader, Paths.get(savePath));
System.out.println('图片已保存:' + savePath);
}
}
}
代码解释
- API 请求: 脚本首先使用
curl或URL类发送 GET 请求到 API 获取数据。 - JSON 解析: 使用
jq或 Java 中的 JSON 解析库解析返回的 JSON 数据。 - 正则表达式匹配: 使用正则表达式匹配提取图片 URL。
- 图片下载: 使用
wget或 Java 中的Files类下载图片到本地。
总结
这段代码演示了如何从 API 获取图片并下载到本地。它展示了 Bash 和 Java 两种语言的实现方法,并解释了每个步骤的代码逻辑。你可以根据自己的需求修改代码,例如修改 API 地址、JSON 路径、正则表达式等。
原文地址: https://www.cveoy.top/t/topic/iI4O 著作权归作者所有。请勿转载和采集!