Python fbchat 库

2024 年 8 月 29 日 | 阅读 12 分钟

像 Python 这样的编程语言之所以强大,是因为它为用户提供了广泛的模块和库。这一次我们将探索其中之一。我们每个人都可能在某个时候想向我们的 Facebook 朋友发送消息(或垃圾邮件)。能够自动化活动并在 Facebook Messenger 中创建支持机器人似乎很有趣。在下面的教程中,我们将了解如何使用 Python 编程语言连接到 Facebook Messenger 并执行各种令人惊叹的事情。

此声明意味着我们将执行相同的 GET/POST 请求,并欺骗 Facebook 认为它正在正常访问网站。我们将需要一个名为 fbchat 的 Python 库,它允许程序员模拟浏览器进行此操作。因此,此应用程序编程接口 (API) 不是官方的,并且不需要任何 API 密钥。但是,它需要 Facebook 帐户的凭据。

那么,让我们开始吧。

Python fbchat 库简介

Python 编程语言中的 fbchat 库利用电子邮件 ID 和密码与 Facebook 服务器进行通信。这意味着如果有人在编写代码时窥探,我们应该始终将密码存储在单独的文件中。我们还应该确保文件的访问控制具有适当的限制。

为了安装 fbchat 库,我们将使用 pip 安装程序,命令如下:

语法

为了验证库是否正确安装,我们可以创建一个新文件并添加 import 语句,查看它是否返回任何错误。

文件:verify.py

现在,保存 Python 文件并使用命令行运行执行命令

语法

如果上面的 Python 文件没有引发任何导入错误,我们就可以继续构建 Facebook Messenger 机器人了。但是,如果它确实引发了异常,建议重新安装库并查阅其官方文档。

现在,让我们了解 fbchat 库的基础知识。

登录

我们可以简单地创建 fbchat 库的 Client 类的实例。如果启用了双重身份验证,我们需要在终端提示符中键入代码(如果我们要以另一种方式提供代码,我们可以覆盖 Client.on2FACode 函数)。

现在让我们在以下语法中查看相同的内容

示例

说明

在上面的代码片段中,我们从 fbchat 库导入了 Client 类以及 fbchat.models 中的函数。我们定义了 Facebook 帐户的 usernamepassword。最后,我们创建了一个 Client 类的对象,将其 usernamepassword 作为参数,这允许我们访问 Facebook 帐户。

上面提供的 usernamepassword 仅演示了 Client 类的功能,并没有实现实际目的。但是,需要分别用实际的电子邮件 ID 和密码替换变量字符串。

不正确的用户名和密码可能会在连接到 Facebook 帐户时导致异常。

在整个代码中,如果我们想检查是否仍然登录,我们可以使用 Client 类的 isLoggedIn() 函数。

我们可以使用 Client 类的 login() 函数登录到 Facebook 帐户。

让我们考虑以下示例,如果退出,我们希望再次登录。

示例

说明

在上面的代码片段中,我们使用 if 语句通过 isLoggedIn() 函数检查是否已登录 Facebook 帐户。我们还使用了 login() 函数,指定 usernamepassword,以便在退出时再次登录。

一旦我们使用完客户端并希望安全注销,我们将使用 logout() 函数。

其语法如下所示

示例

说明

在上面的代码片段中,我们使用了 Client 类的 logout() 函数以及 Client 的对象来注销。

理解线程

线程可以被视为两件事:Messenger 群聊或单个 Facebook 用户。

ThreadType 是一个枚举器,有两个值。第一个值是 USER,另一个是 GROUP。这些将指定线程是单用户还是群聊。这对于 fbchat 库的多个函数是必需的,因为 Facebook 可以在内部区分这两者。

我们可以使用 Client 类的 searchForGroups 方法搜索群聊并找到它们的 ID。我们还可以使用 searchForUsers 方法搜索用户。我们将在本教程后面查看它。

我们可以借助 Client 类的 uid 方法检索我们的用户 ID。

我们还可以检索群聊 ID。但是,其过程非常简单。我们只需导航到 https://#/messages/,然后单击我们要查找 ID 的群组,然后从地址栏中读取 ID。URL 将显示如下:https://#/messages/t/123456789,其中 123456789 将是群聊的 ID。

我们可以将相同的方法应用于多个用户帐户,尽管如果他们设置了自定义 URL,我们只会看到该 URL。

让我们考虑以下代码片段,演示线程 ID 和线程类型的利用。

示例

说明

在上面的代码片段中,我们开始导入所需的库并提供 usernamepassword。然后我们创建了一个 Client 类的对象。之后,我们使用了 send() 函数,指定了文本消息以及线程 ID 和线程类型为 USERGROUP。最后,我们使用 logout() 函数注销。

我们可以观察到我们提供了线程 ID 和线程类型来启动函数。但是,有些函数根本不需要线程类型。一个这样的函数可以是 changeThreadColor。在这种情况下,我们必须提供线程 ID。

让我们看下面的例子来演示这一点:

示例

说明

在上面的代码片段中,我们导入了所需的模块并提供了 usernamepassword。然后我们创建了一个 Client 类的对象。然后我们使用了 Client 类的 changeThreadColor 函数来更改线程的颜色。我们在函数中指定了线程颜色和线程 ID。最后,我们使用 logout() 函数注销。

理解消息 ID

我们在 Facebook 上发送的每条消息都包含一个唯一的 ID,并且我们在线程中执行的每个活动,例如更改昵称或添加人员,都有一个唯一的 ID。

fbchat 库的一些函数需要这些 ID,例如 reactToMessage,其中一些函数提供此 ID,例如 sendMessage

让我们考虑以下示例,演示这些函数的使用。

示例

说明

在上面的代码片段中,我们导入了所需的方法并提供了 usernamepassword。然后我们创建了一个 Client 类的对象。然后我们使用 send() 函数检索了消息 ID。然后我们使用消息 ID 通过 reactToMessage() 对消息进行反应,我们在其中指定了 messageID 以及 MessageReaction 作为 LOVE 表情符号。

与线程交互

fbchat 库提供了不同的功能,以便我们与线程交互。

大多数功能适用于所有线程,尽管某些功能(例如将用户添加到群聊和从群聊中删除用户)逻辑上仅适用于群聊。

下表描述了一些用于与线程交互的函数

序号。函数描述
1send此函数用于向用户或群组发送消息。
2sendLocalImage此函数用于发送本地图像。
3sendRemoteImage此函数用于从 URL 下载图像并发送。
4addUsersToGroup此函数用于向群组添加一个或多个用户。
5removeUserFromGroup此函数用于从群组中删除用户。
6changeNickname此函数用于更改用户的昵称。
7changeThreadTitle此函数有助于更改线程的标题。
8setTypingStatus此函数有助于将打字状态设置为 TYPING 或 STOPPED。
9changeThreadColor此函数用于更改线程的颜色。
10changeThreadEmoji此函数有助于更改线程中的表情符号。
11reactToMessage此函数有助于对消息进行反应。

让我们考虑以下示例,演示在与线程交互中使用上述函数。

示例

说明

在上面的代码片段中,我们导入了所需的模块并提供了 usernamepassword。我们创建了一个 Client 类的实例并指定了线程 ID 和类型。然后我们使用了不同的函数来与线程交互,从发送文本消息和表情符号到更改线程颜色和表情符号。由于我们正在处理 GROUP 聊天,我们还使用了涉及从群组中添加和删除用户的操作。我们还使用了发送本地图像以及特定 URL 上的图像的函数。

现在,让我们了解如何使用 fbchat 库获取信息。

获取信息

我们可以利用 fbchat 库来获取有关用户的基本信息,例如他们的用户名、个人资料图片、线程名称和用户 ID。

我们可以使用 Client 类的 searchForUsers 函数检索用户 ID。让我们考虑以下示例,它演示了允许我们获取用户信息的功能。

示例

说明

在上面的代码片段中,我们导入了所需的模块并创建了一个 Client 类的实例。然后我们使用了 searchForUsers 函数来检索用户 ID。然后我们将第一个用户的值存储在一个变量中。最后,我们使用 uid, name, photo, url 函数打印了用户的信息。

由于此示例利用了 Facebook 的搜索功能,我们不必指定完整的名称;通常只需名字就足够了。

现在让我们了解会话。

理解会话

fbchat 库提供了检索和设置会话 cookie 的功能。此功能将允许我们将会话 cookie 存储在单独的文件中,这样我们就不必每次启动脚本时都登录。

我们可以使用 Client 类的 getSession 函数检索 cookie。其语法如下所示

语法

然后我们可以使用 Client 类的 setSession 函数来设置会话。其语法如下所示

语法

或者我们可以在初始登录时设置 session_cookies。(如果会话 cookie 无效,将使用电子邮件和密码登录)

语法

警告: 会话 cookie 和密码一样有价值,因此请同样小心地存储它们。

监听和事件

fbchat 库还提供了监听功能,例如 Client 类的 listen 函数,我们需要定义当某些事件发生时应该执行什么。默认情况下,(大多数)事件将只是一个 logging.info 语句,这意味着当事件发生时它只会将详细信息打印到控制台。

注意:我们可以通过事件方法的 on 前缀来识别它们。例如,onMessage。

我们可以通过子类化 Client 然后覆盖事件方法来更改事件操作,如下所示

语法

说明

在上面的语法中,我们定义了 Client 类的子类为 Custom_Client。在该类中,我们定义了一个名为 onMessage 的方法,该方法接受多个参数,例如 self, mid, author_id, message_object, thread_id, thread_type, ts, metadata, msg**kwargs。可以在此方法中编写一些功能。最后,我们实例化了 Custom_Client 类,并将其 usernamepassword 作为其参数。

即使我们更改了方法的参数,onMessage 方法也可以工作;但是,我们必须在其中包含 **kwargs

注意:因此,为了向后和向前兼容,API 要求我们包含 **kwargs 作为最后一个参数。

更多信息请参见官方文档:

https://fbchat.readthedocs.io/en/stable/intro.html