程序自动将本地图片上传到微博相册(一)
程序自动将本地图片上传到微博相册(一)
程序自动将本地图片上传到微博相册(二)
目的
通过程序模拟人工在浏览器上传本地图片的操作,自动将本地图片上传到新浪微博相册
为了控制 Chrome 浏览器,我们用到了 selenium,通过在 Spring Boot 中加入 selenium,然后用代码模拟人为操作即可。
知识点
selenium 控制浏览器
selenium 获取找到元素
selenium 上传文件
selenium 执行 js 脚本
人为上传本地图片的步骤
1、登录微博
2、打开网址 https://photo.weibo.com/upload/index
3、选择页面上的普通上传
4、选择本地图片
5、点击上传按钮
程序实现
程序按上面的步骤实现即可。但登录需要我们先干预一下。
具体实现:
下载 ChromeDriver
首先在电脑上安装 Chrome 浏览器,没有 Chrome 浏览器的话,我们控制个啥子。而 selenium 要控制 Chrome,需要 ChromeDriver。
ChromeDriver 的下载地址: http://chromedriver.storage.googleapis.com/index.html 。 选择和电脑安装的 Chrome 版本接近的一个版本。
查看 Chrome 浏览器的版本
备份图片地址: http://blog.sqber.com/upload/83B5009E040969EE7B60362AD7426573.jpeg
我们看到 Chrome 的版本是 89.0.4389.90,选择一个相近的 ChromeDriver 的版本
根据操作系统,选择一个合适的下载。下载后,解压压缩包,可以看到一个 chromedriver 的文件,记录此文件的位置,后面会用到。
Java 代码
项目技术:Spring Boot
首先看下 pom.xml 文件,主要引入此依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
完整的 pom.xml 如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sqber</groupId>
<artifactId>weibotest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>weibotest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
用到一个控制器(代码如下),其中 /start
方法初始化 ChromeDriver,并会打开微博登录页,让我们登录。
然后,我们再调用 browser/go
方法,则自动会将本地文件 /Users/adminqian/my/mzitu/9d52c073gw1elar8gic2vj20g42qp49v.jpg
上传到微博相册,并返回访问地址
package com.sqber.weibotest.controller;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HomeController {
private ChromeDriver driver;
@ResponseBody
@GetMapping("/")
public String index() {
return "启动成功了";
}
@ResponseBody
@GetMapping("/start")
public void start() {
// 这里设置 chromeDriver 文件的路径
System.setProperty("webdriver.chrome.driver", "/Users/adminqian/shen/soft/chromeDriver/chromedriver");
ChromeOptions chromeOptions = new ChromeOptions();
//chromeOptions.addArguments("--headless");
//chromeOptions.addArguments("--window-size=1280,768");
driver = new ChromeDriver(chromeOptions);
driver.get("https://photo.weibo.com/upload/index?prel=p5_1#3500590076519405");
}
@ResponseBody
@GetMapping("browser/go")
public String go(String file) {
driver.navigate().refresh();
driver.get("https://photo.weibo.com/upload/index?prel=p5_1#3500590076519405");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
WebElement element = findElement("a", "action-type", "go_common_upload");
if (element != null)
element.click();
// 选择本地文件
file = "/Users/adminqian/my/mzitu/9d52c073gw1elar8gic2vj20g42qp49v.jpg";
driver.findElementByName("pic1").sendKeys(file);
element = findElement("a", "action-type", "comm_upload");
if (element != null)
element.click();
// 触发提交之后,还需要等待一会才能得到结果
String result = "";
try {
Thread.sleep(10000);
result = getResult();
} catch (Exception e) {
try {
Thread.sleep(10000);
result = getResult();
} catch (Exception e1) {
e1.printStackTrace();
}
}
System.out.println(result);
String str = result.substring(result.indexOf("pid\":") + 6, result.indexOf("\",\"pic"));
//return str;
String pic = "https://wx4.sinaimg.cn/mw690/" + str + ".jpg";
//String pic = "https://wx4.sinaimg.cn/large/" + str + ".jpg";
return pic;
//System.out.println(pic);
}
private String getResult() {
Object returnVal = driver.executeScript("return document.getElementsByName('uploadIframe1')[0].contentDocument.head.innerText");
return returnVal.toString();
}
private WebElement findElement(String tag, String attr, String attrVal) {
for (WebElement webElement : driver.findElementsByTagName(tag)) {
String theAttr = webElement.getAttribute(attr);
if (theAttr != null && theAttr.equals(attrVal)) {
return webElement;
}
}
return null;
}
}
至此,一个将本地文件上传到微博的小程序就有了,后续会进一步完善。
完整代码
https://github.com/shenqiangbin/toutiao/tree/weiboDemo 的 0.1 标签版本
程序自动将本地图片上传到微博相册(一)
程序自动将本地图片上传到微博相册(二)
*昵称:
*邮箱:
个人站点:
*想说的话: