You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium发送Instagram消息时段落间距丢失如何修复

问题核心原因

出现这个问题基本是踩了两个必中的坑:

  • 读取txt文件时错误处理了换行标记:要么是用readlines()读取后直接拼接空字符串丢了换行,要么是没做跨平台换行符兼容,把Windows系统下的\r\n、旧Mac系统的\r给过滤掉了,原始段落间隔在读取阶段就已经丢失。
  • Instagram网页端的消息输入框不是普通的<textarea>或<input>标签,是带contenteditable="true"属性的富文本容器,直接调用send_keys()传入带\n的整段文本时,换行符会被前端逻辑过滤,不会生成分段,所有内容会被拼接成连续纯文本。
修复步骤

1. 先正确读取txt中的原始带格式内容

读取时不要手动清洗换行符,Python环境下打开文件时加newline=''参数即可自动兼容所有平台的换行标记,完整保留原始段落间隔:

# 读取消息文本,保留原始段落结构
with open("your_message_file.txt", "r", encoding="utf-8", newline='') as f:
    message_content = f.read()

# 调试时可以用print(repr(message_content))打印,确认输出里能看到对应的换行标记,证明读取环节没问题

注意:如果习惯用readlines()按行读取,拼接时必须用'\n\n'作为连接符,直接拼接空字符串会直接丢失所有换行。

2. 适配Ins输入框的分段逻辑

不要直接把整段文本一把梭传入send_keys(),选以下任意一种方案即可保留段落间隔:

方案一:模拟手动输入的快捷键分段(稳定性高,和手动发消息效果完全一致)

Ins网页端输入框的快捷键规则是:直接按Enter是发送消息,按Shift+Enter是换行,连续按两次Shift+Enter就能空出一行,形成和txt一致的段落间隔。

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time

# 定位消息输入框,CSS选择器可根据你当前Ins页面版本微调,核心是找contenteditable属性为true的文本框
msg_input = driver.find_element(By.CSS_SELECTOR, 'div[contenteditable="true"][role="textbox"]')
# 按两个连续换行拆分段落,对应txt里的段落空行
paragraph_list = [p.strip() for p in message_content.split('\n\n') if p.strip()]

for index, paragraph in enumerate(paragraph_list):
    # 输入当前段落的文本
    msg_input.send_keys(paragraph)
    # 不是最后一段的话,插入两个软换行,空出段落间隔
    if index != len(paragraph_list) - 1:
        msg_input.send_keys(Keys.SHIFT, Keys.ENTER)
        msg_input.send_keys(Keys.SHIFT, Keys.ENTER)
        time.sleep(0.15) # 加短等待避免输入太快触发前端节流,丢失内容

# 所有内容输入完成后,按Enter即可发送
# msg_input.send_keys(Keys.ENTER)

方案二:JS直接注入富文本内容(适配所有版本,不会丢格式)

如果模拟按键的方案受输入框焦点影响失效,可以直接通过JS修改输入框的DOM内容,把纯文本转成富文本识别的段落标签,同时触发输入事件让Ins前端识别到内容变更:

# 把纯文本换行转成<p>段落标签,适配富文本框格式
html_paragraphs = ""
for paragraph in paragraph_list:
    html_paragraphs += f"<p>{paragraph}</p>"

# 执行JS注入内容
driver.execute_script("""
const inputBox = arguments[0];
inputBox.innerHTML = arguments[1];
// 触发input事件,否则Ins前端会判定输入框为空,无法点击发送按钮
inputBox.dispatchEvent(new Event('input', {bubbles: true}));
""", msg_input, html_paragraphs)
常见踩坑提醒
  • 不要直接对完整文本调用send_keys(message_content),文本中携带的\n在富文本框里要么被过滤,要么会被识别为发送指令,直接把没输完的内容发出去。
  • 段落空行的大小可以自行调整Shift+Enter的按动次数:要单倍行距无空行就按1次,要和txt一致的空行分段就按2次。
  • 如果读取的文本里有多余的连续空行,可以在拆分段落时加判断过滤,不需要额外做全局的换行符替换。

内容的提问来源于stack exchange,提问作者Deniel Varava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:03:29