在没有 API 的情况下在 Windows 上将图像上传到 Instagram
Posted
技术标签:
【中文标题】在没有 API 的情况下在 Windows 上将图像上传到 Instagram【英文标题】:Upload an image to Instagram on Windows without API 【发布时间】:2021-09-09 21:47:18 【问题描述】:这是一个知识分享,灵感来自:Posting (Uploading) an image to Instagram using Selenium not using an API
网上的大部分答案只有 Python 版本,所以我在这里发布 node.js 中的 javascript 版本
【问题讨论】:
【参考方案1】:此解决方案仅适用于 Windows 操作系统。
下面的代码从上传文件夹中读取.jpg
格式的照片,一张一张贴上标题。
-
从以下位置下载 autoit 模块:
https://github.com/xhawk18/node-autoit/issues/15
-
使用以下依赖项更新
package.json
:
"dependencies":
"selenium-webdriver": "^4.0.0-beta.4",
"autoit": "file:autoit-2.0.1.tgz"
,
运行npm install
运行实际代码:
const fs = require('fs');
const Builder, By, Key = require('selenium-webdriver');
const au = require('autoit');
const chrome = require('selenium-webdriver/chrome');
const instagramUrl = 'https://www.instagram.com/';
const account = 'YOUR_INSTAGRAM_ACCOUNT';
const password = 'YOUR_INSTAGRAM_PASSWORD';
const instagramLoginUrl = instagramUrl + 'accounts/login/';
const instagramAccountUrl = instagramUrl + account;
const waitTime = 2000;
const uploadFolder = 'uploadFolderName'
const mobileDeviceName = 'iPhone X';
const loginAlert = '//*[@id="slfErrorAlert"]';
const newPostButton = '//div[@data-testid="new-post-button"]';
const nextButton = '//button[text()="Next"]';
const captionTextArea = '//textarea[@aria-label="Write a caption…"]';
const shareButton = '//button[text()="Share"]';
let readFileNames = () =>
let filenames = [];
fs.readdirSync(uploadFolder).forEach(file =>
let filename = file.split('.');
if (filename[1] == 'jpg')
filenames.push(file);
)
return filenames;
let filenames = readFileNames();
(async function example()
let driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(new chrome.Options()
.setMobileEmulation( deviceName: mobileDeviceName ))
.build();
try
// Go to Login page
await driver.get(instagramLoginUrl);
await driver.sleep(waitTime);
// Login
await driver.findElement(By.name('username')).sendKeys(account);
await driver.findElement(By.name('password')).sendKeys(password, Key.RETURN);
await driver.sleep(waitTime);
// Redirect to Profile Home Page
await driver.get(instagramAccountUrl);
await driver.sleep(waitTime);
//Read Local Photos
for (let file of filenames)
//Create New Post
await driver.findElement(By.xpath(newPostButton)).click();
await driver.sleep(waitTime);
let imagePath = `$__dirname\\$uploadFolder\\$file`;
console.log(imagePath);
// Handle Windows Upload Photo Dialog
let handle = "[TITLE:Open]";
au.Init();
au.WinWait(handle);
au.Send(imagePath);
au.ControlClick(handle, "", "Button1");
await driver.sleep(waitTime);
// Hit Next
await driver.findElement(By.xpath(nextButton)).click();
await driver.sleep(waitTime);
// Fill The Captions
await driver.findElement(By.xpath(captionTextArea)).sendKeys("Your caption");
await driver.sleep(waitTime);
// Share New Post
await driver.findElement(By.xpath(shareButton)).click();
await driver.sleep(waitTime);
// Back To Home Page
await driver.get(instagramAccountUrl);
catch (err)
console.error(err);
finally
await driver.quit();
)();
【讨论】:
以上是关于在没有 API 的情况下在 Windows 上将图像上传到 Instagram的主要内容,如果未能解决你的问题,请参考以下文章
在没有虚拟化的情况下在 Windows 上运行 Docker
如何在没有外部库的情况下在 React 中实现 Google Maps JS API?