使用instagram-private-api上传Instagram图片时遇400错误求助
问题描述
我正在开发一款可自动将生成的图片发布到Instagram的应用,使用instagram-private-api编写代码,但执行时出现400 Bad Request错误。
我的代码
const IgApiClient = require('instagram-private-api').IgApiClient; const fs = require('fs'); const config = require('./config.json'); const ig = new IgApiClient(); ig.state.generateDevice(config.instagramUsername); ig.state.proxyUrl = config.igProxy; async function uploadImage(imageBuffer) { const imageUrl = await ig.upload.photo( { file: imageBuffer } ); console.log(`URL: ${imageUrl}`); } (async () => { await ig.simulate.preLoginFlow(); const loggedInUser = await ig.account.login(config.instagramUsername, config.instagramPassword); process.nextTick(async () => await ig.simulate.postLoginFlow()); const imageBuffer = fs.readFileSync('output.png'); uploadImage(imageBuffer); })();
错误信息
C:\Users\PC\Desktop\spotted\node_modules\instagram-private-api\dist\core\request.js:126
return new errors_1.IgResponseError(response);
^IgResponseError: POST /rupload_igphoto/1672943340753_0_8268117741 - 400 Bad Request;
at Request.handleResponseError (C:\Users\PC\Desktop\spotted\node_modules\instagram-private-api\dist\core\request.js:126:16)
at Request.send (C:\Users\PC\Desktop\spotted\node_modules\instagram-private-api\dist\core\request.js:54:28)
at async UploadRepository.photo (C:\Users\PC\Desktop\spotted\node_modules\instagram-private-api\dist\repositories\upload.repository.js:18:26)
at async uploadImage (C:\Users\PC\Desktop\spotted\bomba.js:10:20)Node.js v19.2.0
解决思路
- 检查图片合规性与参数完整性:Instagram对上传图片有明确要求,比如尺寸(建议1080x1080正方形,或符合平台支持的比例)、文件大小不超过4MB、格式为PNG/JPG。另外,
ig.upload.photo可能需要必填参数,补充试试:const imageUrl = await ig.upload.photo({ file: imageBuffer, caption: '', // 补充空标题参数 uploadId: ig.state.generateUploadId(), // 手动生成合法上传ID }); - 修复异步调用顺序:主函数中调用
uploadImage时未加await,会导致上传操作在登录流程未完全完成时执行,改成await uploadImage(imageBuffer);。 - 排查代理问题:如果
config.igProxy无效或IP被Instagram封禁,会触发请求错误。先注释代理配置代码,测试是否是代理导致的问题。 - 完善登录流程:
process.nextTick中的postLoginFlow可能未正确执行,改为同步等待:await ig.simulate.preLoginFlow(); const loggedInUser = await ig.account.login(config.instagramUsername, config.instagramPassword); await ig.simulate.postLoginFlow(); // 直接等待后再执行上传 - 验证账号状态:确保Instagram账号未被风控(比如新账号、频繁操作触发限制),手动登录网页版检查是否需要验证或有异常提示。
- 更新依赖版本:旧版
instagram-private-api可能存在API兼容问题,执行npm update instagram-private-api更新到最新版后重试。
内容的提问来源于stack exchange,提问作者reed3324

