B站动态发布功能开发记录
在对应位置添加平台
在 src/sync/dynamic.ts
文件中注册 Bilibili
平台的动态发布。
动态发布函数
动态发布函数是动态发布功能的核心,该函数会根据 injectUrl
打开的页面然后将其注入到页面中。
我们在 src/sync/dynamic/bilibili.ts
文件中实现 DynamicBilibili
函数。具体代码可以点击 这里 查看。
下面的记录是我们从 DynamicBilibili
函数中抽离出来的,主要记录了动态发布的一些关键步骤。
1. 打开动态发布页面
Bilibili 的动态发布页面是 https://t.bilibili.com
,我们首先需要打开该页面;这一步在注入脚本的时候已经定义完成。
2. 找到标题和内容输入框并输入键入内容
进入到动态发布页面后,我们需要找到标题和内容输入框。
手动打开 Bilibili 的动态发布页面,然后打开 F12 的开发者工具,对着标题和内容输入框点击右键,选择 检查
,然后找到对应的元素。
通过审查元素,我们可以找到标题和内容输入框的元素如下:
从上面的代码中,我们可以看到标题和内容输入框的关键元素分别是:
- 标题输入框:
<input maxlength="20" placeholder="好的标题更容易获得支持,选填20字" class="bili-dyn-publishing__title__input">
- 内容输入框:
<div placeholder="有什么想和大家分享的?" contenteditable="true" class="bili-rich-textarea__inner empty" style="font-size: 15px; line-height: 24px; min-height: 24px;"></div>
为了向标题和内容输入框中输入内容,我们需要先找到这两个元素,然后向其输入内容。在代码中呈现如下
3. 上传图片
在完成上述步骤后,我们需要上传图片。
对于一般的平台来说,上传图片是通过 type="file"
的 input 标签来上传图片的。
但是 Bilibili 的动态发布页面中无法直接找到 type="file"
的 input 标签。
为此我们认为这个 Input 可能被隐藏起来,并没有直接挂载到页面上。
为此我们通过创建内容脚本,监听 Input 的创建。 具体代码在 src/contents/helper.ts
文件中。
通过重写 document.createElement
方法,我们监听到了 input
标签的创建,然后通过 createdInputs
数组来存储创建的 input
标签。
在开发时,可以通过 console.log(createdInputs)
打印出创建的 input
标签。
在注入脚本后我们找到了被隐藏的 input
标签。接下来我们需要在发布的时候利用 window.postMessage
将文件传递给内容脚本。这也是为什么 helper.ts
文件中需要通过 window.addEventListener('message', handleMessage);
来监听 message
事件。
我们回到 src/sync/dynamic/bilibili.ts
文件中,在发布的时候利用 window.postMessage
将文件传递给内容脚本。
首先,因为 Bilibili 的动态发布页面会缓存上次未提交的图片,所以我们需要先清理已上传的图片。
4. 发布动态
在完成上述步骤后,我们需要对自动发布进行额外处理。具体为找到发布按钮,然后点击发布按钮。
具体代码在 src/sync/dynamic/bilibili.ts
文件中。
大功告成
至此,我们已经完成了 Bilibili 的动态发布功能。
Bilibili 的动态发布难点主要是在于图片上传的处理,因为缺少明显的 type="file"
的 input 标签。
为此我们通过重写 document.createElement
方法,监听到了 input
标签的创建,然后通过 createdInputs
数组来存储创建的 input
标签。
在发布的时候利用 window.postMessage
将文件传递给内容脚本。