【问题标题】:Upload an image to Instagram on Windows without API在没有 API 的情况下在 Windows 上将图像上传到 Instagram
【发布时间】:2021-09-09 21:47:18
【问题描述】:

这是一个知识分享,灵感来自:Posting (Uploading) an image to Instagram using Selenium not using an API

网上的大部分答案只有 Python 版本,所以我在这里发布 node.js 中的 JavaScript 版本

【问题讨论】:

    标签: node.js selenium selenium-webdriver automation instagram


    【解决方案1】:

    此解决方案仅适用于 Windows 操作系统。

    下面的代码从上传文件夹中读取.jpg格式的照片,一张一张贴上标题。

    1. 从以下位置下载 autoit 模块:

    https://github.com/xhawk18/node-autoit/issues/15

    1. 使用以下依赖项更新 package.json
    "dependencies": {
        "selenium-webdriver": "^4.0.0-beta.4",
        "autoit": "file:autoit-2.0.1.tgz"   
    },
    
    1. 运行npm install

    2. 运行实际代码:

    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();
     }
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2017-06-18
      • 1970-01-01
      • 2011-07-10
      • 2012-10-04
      相关资源
      最近更新 更多