在没有 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?

在没有用户登录的情况下在 Windows 启动时运行脚本

如何在没有跳过的情况下在特定锚点处旋转图层?

如何在没有控制台窗口的情况下在 Windows 上启动最新的 Jupyter QtConsole

在没有可见命令提示符窗口的情况下在 Windows 上自动启动 websocket 服务器