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

时间 2021/3/27 21:47:08 加载中...

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


目的

通过程序模拟人工在浏览器上传本地图片的操作,自动将本地图片上传到新浪微博相册
为了控制 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 浏览器的版本

2

备份图片地址: http://blog.sqber.com/upload/83B5009E040969EE7B60362AD7426573.jpeg

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

根据操作系统,选择一个合适的下载。下载后,解压压缩包,可以看到一个 chromedriver 的文件,记录此文件的位置,后面会用到。

Java 代码

项目技术:Spring Boot

首先看下 pom.xml 文件,主要引入此依赖

  1. <dependency>
  2. <groupId>org.seleniumhq.selenium</groupId>
  3. <artifactId>selenium-java</artifactId>
  4. <version>3.141.59</version>
  5. </dependency>

完整的 pom.xml 如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.3.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.sqber</groupId>
  12. <artifactId>weibotest</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>weibotest</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.seleniumhq.selenium</groupId>
  30. <artifactId>selenium-java</artifactId>
  31. <version>3.141.59</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-test</artifactId>
  36. <scope>test</scope>
  37. <exclusions>
  38. <exclusion>
  39. <groupId>org.junit.vintage</groupId>
  40. <artifactId>junit-vintage-engine</artifactId>
  41. </exclusion>
  42. </exclusions>
  43. </dependency>
  44. </dependencies>
  45. <build>
  46. <plugins>
  47. <plugin>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-maven-plugin</artifactId>
  50. </plugin>
  51. </plugins>
  52. </build>
  53. </project>

用到一个控制器(代码如下),其中 /start 方法初始化 ChromeDriver,并会打开微博登录页,让我们登录。
然后,我们再调用 browser/go 方法,则自动会将本地文件 /Users/adminqian/my/mzitu/9d52c073gw1elar8gic2vj20g42qp49v.jpg 上传到微博相册,并返回访问地址

  1. package com.sqber.weibotest.controller;
  2. import org.openqa.selenium.WebElement;
  3. import org.openqa.selenium.chrome.ChromeDriver;
  4. import org.openqa.selenium.chrome.ChromeOptions;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. @Controller
  9. public class HomeController {
  10. private ChromeDriver driver;
  11. @ResponseBody
  12. @GetMapping("/")
  13. public String index() {
  14. return "启动成功了";
  15. }
  16. @ResponseBody
  17. @GetMapping("/start")
  18. public void start() {
  19. // 这里设置 chromeDriver 文件的路径
  20. System.setProperty("webdriver.chrome.driver", "/Users/adminqian/shen/soft/chromeDriver/chromedriver");
  21. ChromeOptions chromeOptions = new ChromeOptions();
  22. //chromeOptions.addArguments("--headless");
  23. //chromeOptions.addArguments("--window-size=1280,768");
  24. driver = new ChromeDriver(chromeOptions);
  25. driver.get("https://photo.weibo.com/upload/index?prel=p5_1#3500590076519405");
  26. }
  27. @ResponseBody
  28. @GetMapping("browser/go")
  29. public String go(String file) {
  30. driver.navigate().refresh();
  31. driver.get("https://photo.weibo.com/upload/index?prel=p5_1#3500590076519405");
  32. try {
  33. Thread.sleep(3000);
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37. WebElement element = findElement("a", "action-type", "go_common_upload");
  38. if (element != null)
  39. element.click();
  40. // 选择本地文件
  41. file = "/Users/adminqian/my/mzitu/9d52c073gw1elar8gic2vj20g42qp49v.jpg";
  42. driver.findElementByName("pic1").sendKeys(file);
  43. element = findElement("a", "action-type", "comm_upload");
  44. if (element != null)
  45. element.click();
  46. // 触发提交之后,还需要等待一会才能得到结果
  47. String result = "";
  48. try {
  49. Thread.sleep(10000);
  50. result = getResult();
  51. } catch (Exception e) {
  52. try {
  53. Thread.sleep(10000);
  54. result = getResult();
  55. } catch (Exception e1) {
  56. e1.printStackTrace();
  57. }
  58. }
  59. System.out.println(result);
  60. String str = result.substring(result.indexOf("pid\":") + 6, result.indexOf("\",\"pic"));
  61. //return str;
  62. String pic = "https://wx4.sinaimg.cn/mw690/" + str + ".jpg";
  63. //String pic = "https://wx4.sinaimg.cn/large/" + str + ".jpg";
  64. return pic;
  65. //System.out.println(pic);
  66. }
  67. private String getResult() {
  68. Object returnVal = driver.executeScript("return document.getElementsByName('uploadIframe1')[0].contentDocument.head.innerText");
  69. return returnVal.toString();
  70. }
  71. private WebElement findElement(String tag, String attr, String attrVal) {
  72. for (WebElement webElement : driver.findElementsByTagName(tag)) {
  73. String theAttr = webElement.getAttribute(attr);
  74. if (theAttr != null && theAttr.equals(attrVal)) {
  75. return webElement;
  76. }
  77. }
  78. return null;
  79. }
  80. }

至此,一个将本地文件上传到微博的小程序就有了,后续会进一步完善。

完整代码

https://github.com/shenqiangbin/toutiao/tree/weiboDemo 的 0.1 标签版本


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

扫码分享
版权说明
作者:SQBER
文章来源:http://www.sqber.com/articles/auto-upload-local-file-to-weibo.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。