如何欺骗Instagram让我认为我使用的是一款使用Puppeter的移动设备?

如何欺骗Instagram让我认为我使用的是一款使用Puppeter的移动设备?,instagram,puppeteer,instagram-api,social-media,Instagram,Puppeteer,Instagram Api,Social Media,所以基本上我想做的是一个可以同时向多个不同社交媒体发帖的应用程序。我没有时间尝试对Instagram API进行反向工程,而且我认为我没有能力做到这一点,所以我决定使用Puppeter(phantomjs等无头浏览器) 问题是,我需要手机版的Instagram才能上传照片。 我已尝试更改用户代理。当我在我的常规chrome浏览器中更改它时,一切都正常,我得到了该网站的移动版。但当我用木偶演员做同样的尝试时,我得到了PC版。 以下是更改用户代理的代码: await page.setExtraHTT

所以基本上我想做的是一个可以同时向多个不同社交媒体发帖的应用程序。我没有时间尝试对Instagram API进行反向工程,而且我认为我没有能力做到这一点,所以我决定使用Puppeter(phantomjs等无头浏览器)

问题是,我需要手机版的Instagram才能上传照片。 我已尝试更改用户代理。当我在我的常规chrome浏览器中更改它时,一切都正常,我得到了该网站的移动版。但当我用木偶演员做同样的尝试时,我得到了PC版。 以下是更改用户代理的代码:

await page.setExtraHTTPHeaders({
   'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
});
也许问题在于这段代码,但当我检查浏览器中的标题时,一切都正常。用户代理就是我需要的。 也许问题出在Instagram本身,我不知道。看起来Instagram拒绝相信这些请求来自移动设备。 我很困惑

以下是代码的完整版本:

const puppeteer = require('puppeteer');
const jsonfile = require('jsonfile');
const fs = require('fs');

const username = 'MYUSERNAME';
const password = 'MYPASSWORD';

async function main(username, password) {
    const browser = await puppeteer.launch({  // launch browser
        headless: false,
        args: [
            `--window-size=${250},${600}`, 
            `--use-fake-ui-for-media-stream`
        ],
        defaultViewport: null
    });

    const page = await browser.newPage();
    await page.setExtraHTTPHeaders({
        'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
    });

    await page.goto('https://instagram.com', { waitUntil: 'networkidle0', timeout: 0 }); // wait until page load

    console.log("Trying to log in");
    const inputs = await page.$$('.f0n8F input');    
    await inputs[0].type(username);
    await inputs[1].type(password);
    
    await Promise.all([     
        page.click('.L3NKy'),
        page.waitForNavigation({ waitUntil: 'networkidle0' }),
    ]);

    //await browser.close();
    await console.log("Done!");
}

main(username, password);

感谢每一位能帮上一点忙的人,你能最接近真实移动设备的地方就是使用。这与直接从ChromeDevTools模拟设备时获得的体验相同。您不需要再次设置用户代理,它是在DeviceDescriptors中设置的

还可以在源文件中查看可用设备的列表

例如:

const puppeter=require('puppeter');
constiphone=puppeter.devices['iphone6'];
(异步()=>{
const browser=wait puppeter.launch();
const page=wait browser.newPage();
等待页面。模拟(iPhone);
等待页面。转到('https://instagram.com“,{waitUntil:'networkidle0',超时:0});//等待页面加载
//做事
等待浏览器关闭();
})();


仅供参考:我很确定instagram不会鼓励网络抓取,因为它也不会。你会发现自己很容易被禁止进入该网站。因此,请确保您完全了解自己的选择。

如果您与一起使用,则最接近于模拟真正的移动设备。这与直接从ChromeDevTools模拟设备时获得的体验相同。您不需要再次设置用户代理,它是在DeviceDescriptors中设置的

还可以在源文件中查看可用设备的列表

例如:

const puppeter=require('puppeter');
constiphone=puppeter.devices['iphone6'];
(异步()=>{
const browser=wait puppeter.launch();
const page=wait browser.newPage();
等待页面。模拟(iPhone);
等待页面。转到('https://instagram.com“,{waitUntil:'networkidle0',超时:0});//等待页面加载
//做事
等待浏览器关闭();
})();


仅供参考:我很确定instagram不会鼓励网络抓取,因为它也不会。你会发现自己很容易被禁止进入该网站。因此,请确保您完全了解您的选择。

谢谢!它运行得非常好。我知道他们不喜欢这样,但我无法抗拒最终产品的便利性谢谢!它运行得非常好。我知道他们不喜欢这样,但我无法抗拒最终产品的便利性