程序自动将本地图片上传到微博相册(一)
  D1vQ58e0dcoM 2023年11月13日 20 0

目的

通过程序模拟人工在浏览器上传本地图片的操作,自动将本地图片上传到新浪微博相册
为了控制 Chrome 浏览器,我们用到了 selenium,通过在 Spring Boot 中加入 selenium,然后用代码模拟人为操作即可。

知识点

selenium 控制浏览器
selenium 获取找到元素
selenium 上传文件
selenium 执行 js 脚本


人为上传本地图片的步骤

1、登录微博 

2、打开网址 https://photo.weibo.com/upload/index

3、选择页面上的普通上传

4、选择本地图片

5、点击上传按钮


程序实现

程序按上面的步骤实现即可。但登录需要我们先干预一下。

具体实现:

首先在电脑上安装 Chrome 浏览器,没有 Chrome 浏览器的话,我们控制个啥子。而 selenium 要控制 Chrome,需要 ChromeDriver。ChromeDriver 的下载地址: http://chromedriver.storage.googleapis.com/index.html 。 选择和电脑安装的 Chrome 版本接近的一个版本。

程序自动将本地图片上传到微博相册(一)_spring

我们看到 Chrome 的版本是 89.0.4389.90,选择一个相近的 ChromeDriver 的版本

程序自动将本地图片上传到微博相册(一)_spring_02

根据操作系统,选择一个合适的下载。下载后,解压压缩包,可以看到一个 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;
    }
}

至此,一个将本地文件上传到微博的小程序就有了。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
D1vQ58e0dcoM