一个服务器端框架,它使管理发布到社交媒体的艺术机器人变得容易。

botfriend的Python项目详细描述


好友

botfriend是一个python框架,用于管理许多创造性的bot 发到许多不同的服务上。

我认为botfriend的主要特点是:

  • 最简单的python编码——只需编写机器人的有趣部分即可。
  • 基于yaml的简单配置。
  • 轻松安排职位。
  • 每个机器人都可以发布到Twitter和/或乳齿象。(计划支持Tumblr。)
  • 内置访问艺术用品的途径olipy

botfriend是一个运行在服务器上的python库。如果你不是 我习惯于设置cron作业或编写python代码 建议您改为查看廉价机器人,完成 快速或廉价机器人 甜美!,作为一种更简单的表达方式 你的创造力。

故事

我写信给BotFriend是为了管理30个不同的Twitter 我创建的机器人程序。我发现自己 不断地复制和粘贴,编写相同的代码 结束。每个机器人都做不同的事情,但他们都有 基本需求:连接到各种服务和api,决定何时 发布一些内容,管理积压的内容,等等。没有 原因是每个机器人都需要自己版本的代码。唯一的部分 需要新代码的机器人才是最有创意的。

我的另一个大问题是,我开始讨厌推特了。真是太棒了 创造机器人的平台,但每次我创造一个机器人,我就感觉 我对提高平台价值感到内疚 世界更糟。(而且,Twitter已经开始无缘无故地暂停我的机器人程序。)

我不想放弃我做肉馅的爱好,所以我开始 调查乳齿象的世界 机器人。这就产生了另一个问题:重写30个 发送到其他服务的机器人程序。如果我要做那么多 我希望最终产品是一个可重用的库 节省所有人的时间。

所以我浏览了我的30个机器人,重写了所有内容,移动了所有 将可重用代码转换为botfriend。现在我的机器人小了很多 更容易管理。所有乏味的代码都在一个地方,我可以 专注于机器人写作的有趣部分。

考虑一个机器人,比如一个乏味的机器人 (源代码)。创建 这个机器人是相当多的工作。但所有的工作 有趣的部分:从 闪耀的。没有代码可以确保机器人在 小时,或通过twitter推送输入的文本,或 乳齿象API。两个朋友负责所有的事情。

如果要在自己的bot项目上保存代码,请从 我希望你可以在Twitter上给乳齿象留言,或者扩大你的机器人的覆盖范围 你可以考虑交个朋友。

设置

我建议您在python虚拟环境中运行botfriend。这里是 如何创建名为env的虚拟环境并安装botfriend 进入它。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend

您将通过命令行专门与botfriend交互 脚本。从现在起,我将给出许多示例命令 线。我所有的例子都假设你输入了虚拟的僵尸朋友 预先运行此命令的环境:

$ source env/bin/activate

一个简单的例子:数字笑话

默认情况下,botfriend希望您将bots的源代码 在与虚拟机位于同一目录的bots/目录中 环境。如果你的虚拟环境位于 /home/myusername/botfriend/env,botfriend会希望您的机器人 生活在下面>/home/myusername/botfriend/bots

botfriend数据库本身将作为 botfriend.sqlite

如果您想将botfriend数据存储在bots/之外的其他地方, 每个botfriend脚本都有一个指向 机器人程序目录。但大多数情况下,机器人程序/是可以的。

每个机器人都将生活在机器人目录的子目录中, 以机器人命名。让我们从一个简单的例子开始,称为 数笑话

$ mkdir bots
$ mkdir bots/number-jokes

每个bot都需要包含两个特殊文件:source的 编码并bot.yaml进行配置。

\uu init\uuu.py:搞笑

想象一下,走到一个喜剧演员跟前说"给我讲个笑话!"一 人类喜剧演员可能不会欣赏它,但这就是机器人 为生活而活。对于botfriend机器人来说,喜剧演员就在这里 提出他们的笑话。

首先,我们将制作一个简单的机器人 关于数字的幽默。

要开始,请在文本中打开 编辑并在其中写入:

import random
from botfriend.bot import TextGeneratorBot

class NumberJokes(TextGeneratorBot):

    def generate_text(self):
        """Tell a joke about numbers."""
        num = random.randint(1,10)
        arguments = dict(
            num=num,
            plus_1=num+1,
            plus_3=num+3
        )
        setup = "Why is %(num)d afraid of %(plus_1)d? "
        punchline = "Because %(plus_1)d ate %(plus_3)d!"
        return (setup + punchline) % arguments

Bot = NumberJokes

BotFriend提供了很多实用程序来帮助您编写 \uu init\uuuuu.py,但只有一条硬性规定:在 文件中,必须有一个名为bot的类。僵尸朋友脚本 将加载您的bot类,实例化它,并使用它 做…无论机器人做什么。

一些机器人做了很多工作来想出一个"笑话"。他们可能 画图,数据库查询,api调用,各种各样的 复杂的事情。作为一个例子,这里有 几乎没有工作。它只是选取一个随机数并将其放入字符串。

bot.yaml:讲笑话

和大多数喜剧演员一样,机器人也不断地编出笑话。但是如果 没人听过这个笑话,有什么意义?bot.yaml文件 解释botfriend机器人应该如何向公众讲述其笑话。

打开文件bots/number笑话/bot.yaml并在其中写入:

name: "Number Jokes"
schedule: 60
publish:
    file:
      filename: "number-jokes.txt"

\uu init\uuuu.pybot.yaml会变得非常复杂,但是 时间很简单。这个文件是说:

  • 机器人的名字是"数字笑话"。

  • 机器人应该每小时"讲一次笑话"。

  • 这个机器人通过把笑话写进文件来讲笑话 数字笑话.txt。(这是相对于bot目录的,所以 加入机器人程序/number笑话/number笑话.txt

现在你准备好让你的机器人讲一些笑话,用一些基本的 好友脚本。

基本脚本

botfriend.post

botfriend.post脚本使您的每个机器人 开玩笑说出来。立即运行:

$ botfriend.post
# Number Jokes | file | Published 2019-01-20 | Why is 4 afraid of 5… 

现在看看您在bot.yaml中配置的文件。你说的号码 将笑话发布到bots/number笑话/number笑话.txt。该文件 在运行botfriend.post之前不存在,但现在它确实存在, 里面有个笑话:

$ cat bots/number-jokes/number-jokes.txt
2019-01-20 10:23:44 | Why is 4 afraid of 5? Because 5 ate 7!

很搞笑,对吧?你会经常运行这个脚本,可能是 自动化过程的一部分。在我的网站上,我运行botfriend.postevery 五分钟。(在本文结尾,我展示了一个如何做到这一点的示例 文档。)

如果你的机器人没有被安排讲笑话,botfriend.post就可以了 没有什么。现在再运行一次--什么都不会发生。

$ botfriend.post

当你第一次运行一个笑话时,数字笑话告诉了它,并且(正如你所说的 在bot.yaml中,一小时只能讲一个笑话。所以,没有 新笑话。

如果你等一个小时再运行botfriend.post 又一个笑话。但是不要等——继续学习这个教程!

只在一个机器人上运行脚本

通过在命令行上指定目录名,可以 botfriend.post(和大多数其他botfriend脚本)仅在 一个机器人,不是你所有的机器人。现在,它不能 区别在于,因为您只有一个机器人,但以下是操作方法:

$ botfriend.post number-jokes

强制机器人发布

您可以使用--force让机器人讲笑话,即使它的时间表是 通常是不允许的。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
0

现在bots/number笑话/number笑话.txt包含两个笑话。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
1

botfriend.dashboard

这个脚本有助于了解你的机器人。它显示 他们最近在做什么,什么时候计划再发一次。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
2

botfriend.bots

如果你有很多机器人,记住他们所有的 名字。botfriend.bots脚本只列出已知的所有bot 两位朋友。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
3

到目前为止仍然只有一个机器人。

botfriend.test.stress

很难测试做随机操作的机器人。你可能有一个 使机器人千分之一崩溃的错误。或者你的机器人 可能永远不会崩溃,但有时需要很长时间才能运行。

这就是为什么我们有botfriend.test.stress脚本,它要求 不能连续出一万个笑话。笑话不是 在任何地方发布;目标是对所有 可能发生在机器人内部的情况。

因为数字笑话很简单,它能产生一万个笑话 没有问题,尽管其中一些是重复的:

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
4

如果你有一个复杂的机器人,跑步是个好主意 botfriend.test.stress在实际使用之前,请多次使用它。

如何发布

BotFriend还有一些更有趣的特性,但是让我们来看看 一分钟来谈谈这些无聊的功能。做机器人很容易 把文章写进一个文件,但没人会看到。你什么 真正需要的是获得twitter或乳齿象证书。(特定) 说明如下。)

一旦你有了一些证书,打开你的机器人的bot.yaml文件, 将凭据添加到发布配置设置中。这将 为你的机器人提供发布其文章的其他方式。

这里有一个例子。这是数字笑话的配置 如果它有twitter和乳齿象连接,在 除了将所有内容写入文件之外。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
5

(这些证书不起作用——我把它们伪装成真的 Twitter和乳齿象证书。)

发布到文件

这是最简单的出版技巧 用于测试和记录。文件发布者获取一个 配置设置:文件名,要写入的文件名。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
6

发布到Twitter

要在twitter上使用bot,您需要为 bot,作为bot登录,然后获取四个不同的值: 消费者密钥消费者密钥访问令牌访问令牌机密。当插入到 bot.yaml,使您能够发布到特定的twitter帐户 使用Twitter API。

获取这四个值可能很难,而且twitter会周期性地 改变规则和流程。botwiki链接到各种 设置这些内容的教程

一旦有了这四个值,就将它们放入bot.yaml和您的bot 将能够发布到其Twitter帐户。

发布到乳齿象实例

若要将机器人连接到乳齿象,请为 bot,作为bot登录,然后获取四个值。

首先,api_基本URL--这很简单,它只是 用于创建帐户的乳齿象实例。我喜欢用 botsin.space,创建了一个乳齿象实例 尤其是机器人。

然后,您需要获取客户机id客户机机密,以及访问令牌。 您可以通过以bot身份登录,转到 设置页面,单击"开发",然后创建新的 申请。(如果这不适合你,试试Darius Kazemi的 说明)

一旦有了这四个值,就将它们放入bot.yaml和您的bot 将可以邮寄到其乳齿象帐户。

好吧,现在回到你可以和BotFriend一起写的酷机器人。

botfriend.test.publisher:测试您的发布凭据

botfriend.test.publisher脚本将尝试您的所有机器人程序' 发布凭据以确保它们正常工作。如果机器人有 发布时出现问题,问题将显示在此处。

对于每一个有出版技术的机器人,你将得到一个 以good开头的行。对于每一种出版技术 断开后,您将得到以fail开头的行。

在本例中,写入文件工作正常,但是由于twitter 乳齿象的证书是伪造的,Twitter和乳齿象不会 实际接受它们。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
7

保持积压的机器人:船名

有些喜剧演员可以即兴编出原创笑话 再说一遍。其他人则保留一个私人笑话文件:一个汇集了笑话的列表 他们可以根据需要提前了解。

你不用在僵尸朋友机器人里写一堆生成器代码 可以生成一个backlog的帖子,不管你喜欢什么。这很容易 创建一个bot,它只需按顺序从其backlog中发布项目 一次。

如果你的风格是写得比编程还多,你可以只写 文本编辑器中的积压工作。这样你就可以创建一个botfriend机器人 完全不需要编写任何代码。

让我们制作一个简单的backlog bot,为 船只,取自网站一万艘船只 名称(我要描述的是 我真正的机器人是如何命名的 作品)

首先,为bot创建一个目录:

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
8

这个机器人非常简单,你不需要任何代码来编程 行为。只要创建一个空的 知道这是一个机器人而不是一个随机目录。

$ virtualenv env
$ source env/bin/activate
$ pip install botfriend
9

就像数字笑话一样,船名需要一个bot.yaml来告诉它在哪里 发布和多久发布一次。创建bots/boat names/bot.yaml并将此 里面有文字:

$ source env/bin/activate
0

这里的时间表与第一个例子中的有点不同 机器人程序。第一个例子的帖子间隔正好一小时。这个 机器人每八小时(480分钟)发布一次,平均,但是 一些随机变化--通常长达15或30分钟 任何方向。

现在,运行botfriend.bots将列出您的两个bot。

$ source env/bin/activate
1

运行botfriend.post将告诉这两个机器人在 想要,但是船名永远不能张贴任何东西,因为它没有 积压和没有逻辑生成新的职位。它想不出来 它自己的笑话--你必须帮助它。

botfriend.backlog.load

使用botfriend.backlog.load脚本可以向机器人添加项目 文件积压。最简单的方法是使用文本文件 每行包含一个帖子。

让我们创建一个backlog文件。这可以去任何地方,但我 建议将其与bot的其他部分保持在同一目录中,在 万一出了什么事,你需要重建就这样吧。打开文件 bots/boat names/backlog.txt并在其中添加一些船名:

$ source env/bin/activate
2

现在您可以加载待办事项:

$ source env/bin/activate
3

一旦待办事项中有项目,就可以使用botfriend.post了:

$ source env/bin/activate
4

botfriend.backlog.show

botfriend.backlog.show脚本将总结bot的当前 积压。它将向您显示积压的项目有多少,以及 下一步。

$ source env/bin/activate
5

botfriend.backlog.clear

botfriend.backlog.clear脚本将完全删除机器人的 待办事项。

$ source env/bin/activate
6

保持状态的机器人:web单词

有时机器人需要做一些需要很长时间的事情,或者 如果发生的话可能会很烦人 经常。Botfriend允许这种困难或烦人的事情 很少做。结果存储在bot的状态中 参考。

让我们再创建一个示例机器人。这个叫做"网络词汇"。它的 任务是下载随机网页并从中选择随机短语。

$ source env/bin/activate
7

我们将拆分机器人的"下载随机网页"部分 从"随便选一个短语"部分。"随便选一个短语"部分 将在每次要求机器人发布内容时运行。"下载 随机网页"部分每天只运行一次,因为它涉及 向随机域名发出一堆http请求。但一旦你 有一个网页下载,它很快和容易拉随机块 别这样。

这次让我们从bot.yaml文件开始:

$ source env/bin/activate
8

此机器人将根据其计划发布,每小时一次(60 分钟)。但还有一件事每天都会发生一次 (每1440分钟):一次"状态更新"。

这是网络单词的代码。把这个放进去 bots/web words/初始化py

$ source env/bin/activate
9

当你第一次告诉博友给这个机器人发东西的时候, botfriend将调用update_state()方法。这种方法可以尝试 好几次找到一个可以使用的网页,但它最终会 成功,

$ mkdir bots
$ mkdir bots/number-jokes
0

一旦状态就绪,再次运行botfriend.post将不会 每次下载一个全新的网页。相反,网络词汇将 从已下载的网页中选择另一个随机字符串。

$ mkdir bots
$ mkdir bots/number-jokes
1

此机器人的状态将在一天内过期(这是在 bot.yaml)。第一次调用update_state()后24小时 时间,运行botfriend.post将导致botfriend调用它 方法。将下载一个全新的网页,对于 接下来的24小时内,所有的网络文字帖子都将来自该新网页。

botfriend.state.show-显示状态

此脚本只打印机器人的当前状态。

$ mkdir bots
$ mkdir bots/number-jokes
2

botfriend.state.refresh-刷新状态

可以使用此脚本通过调用 update_state(),即使机器人已配置state_update_计划 说现在还不是调用该方法的时候。

$ mkdir bots
$ mkdir bots/number-jokes
3

botfriend.state.set-将状态设置为特定值

可以使用此脚本将bot的状态设置为特定值, 而不是通过调用update\u state()来设置状态 方法。在这里,而不是告诉web单词从 一个网页,我们告诉它从它自己的 源代码。

$ mkdir bots
$ mkdir bots/number-jokes
4

botfriend.state.clear-清除状态

这个脚本将完全删除机器人的脚本,使其看起来 update_state()从未调用过。

$ mkdir bots
$ mkdir bots/number-jokes
5

更多示例

源代码 存储库包括完整的 大约十个机器人的源代码,包括本文中所涉及的三个 文件和若干AC我运行的虚拟机器人。试试看 取出存储库并复制其bots.sample 目录到您的机器人程序目录中。

$ mkdir bots
$ mkdir bots/number-jokes
6

每个bot目录都包含一个解释 bot可以工作,它使用botfriend(如果有的话)的哪些特殊功能。

下面是示例机器人:

  • 单调 机器人-一个简单的文本生成机器人。
  • 我是 机器人程序。AMA!-为了不重复笑话而保持复杂状态的机器人。
  • 周年纪念 materials-一种文本生成机器人,使用多种不同类型的输入。
  • 最佳 rhp-一个特定于twitter的机器人,除了有选择地转发另一个帐户之外什么也不做。
  • 船名-一个简单的机器人,可以从待办事项中发布。本文档中描述的第二个示例bot。
  • 群组板 游戏-一个分析rss提要并为每个条目创建帖子的机器人。
  • 委婉语 bot-一个文本生成bot,它根据语法生成文章。
  • frances daily-一个按特定日期和时间安排帖子的机器人,而不是随机或每隔一段时间。有时,根本没有帖子。
  • 链接关系-一个定期刮取网页并发布任何新内容的机器人。
  • 数字笑话-本帮助文档中描述的第一个示例机器人,一个简单的文本生成器机器人。
  • 罗伊的 明信片-一个既可以发布图像也可以发布文本的机器人。
  • 死亡机器人 3000-一个基于backlog的bot,它以自定义格式加载backlog并动态格式化它,而不是加载字符串并发布字符串。
  • 串行 企业家-一个复杂的文本生成器机器人。
  • 网络词-本帮助文档中描述的第三个示例bot。将随机选择的网页保持为状态的机器人。

定期发布

一旦你有了一些机器人,你就需要运行botfriend.post脚本 定期更新内容。最好的办法是 设置cron作业,将botfriend.post脚本安排为每隔几分钟运行一次 分钟。不用担心贴得太频繁。需要发布的机器人 等他们准备好了就会有东西贴出来。不需要发布的机器人 当botfriend.post运行时,任何正确的操作都将保持安静并等待时间。

下面是我的cron脚本的样子:

$ mkdir bots
$ mkdir bots/number-jokes
7

下面是我如何使用cron作业每五分钟运行一次

$ mkdir bots
$ mkdir bots/number-jokes
8

运行期间发生的任何错误都会附加到文件中, <代码>otfriend_err,我可以定期检查。

差不多了。本文档的其余部分只是讨论 BotFriend的一些高级功能,您可能不需要 您的第一次外出。

复杂的配置

让我们再来看看"数字笑话"bot的bot.yaml文件:

$ mkdir bots
$ mkdir bots/number-jokes
9

name选项应该是自解释的——它是 机器人。现在,让我们详细了解其他两个选项。

计划

scheduleconfiguration选项控制您的bot应该多久运行一次 邮政。基本上有三种策略。

  1. schedule设置为分钟数。(这是什么数字笑话) 你的机器人会在 每隔一段时间,两个帖子之间的间隔时间为分钟。
  2. 给出时间表a平均值分钟数。你的机器人会在 随机确定的间隔,约为 两个帖子之间的时间间隔为分钟,但有相当数量的随机变化。
  3. 要微调随机性,可以指定一个stdev来执行 卑鄙的。这将设置计算时使用的标准偏差 下一个职位应该在什么时候。将其设置为较低的数字,则posts将 几乎平均间隔分钟。将其设置为高数字,然后发布 日程安排将大不相同。

如果你的机器人提前安排了所有的帖子,你可以省略schedule 时间(比如法郎 每日 是吗?

状态更新计划

有一个相关的选项,状态更新计划,您只需要它 设置你的机器人是否保持内部状态,就像web单词一样。这个 option的工作方式与schedule相同,但不是控制 机器人应该多久发布一次,它控制你的 update_state()方法被调用。

其他配置设置

某些类型的机器人具有其他特定的配置设置。一 retweetbot的子类,比如 RP<< 将使用名为retweet user的特殊配置设置。这个 控制机器人转发的Twitter帐户。你的机器人可以定义 它自己的自定义配置选项——配置对象是 解析为yaml并作为配置传递到bot构造函数中 争论。你可以看看里面,找出你的任何信息 要。

默认值

如果您将一个名为default.yaml的文件放在botfriend目录中 (在botfriend.sqlite旁边),所有bot都将继承这些值 在那个文件中。

几乎所有我的机器人都使用相同的乳齿象和Twitter客户端密钥(但是 不同的应用程序密钥),我所有的乳齿象机器人都托管在 太空机器人。我将这些配置设置保存在default.yaml中 我不必在每个bot.yaml文件中重复它们。我的 default.yaml如下所示:

import random
from botfriend.bot import TextGeneratorBot

class NumberJokes(TextGeneratorBot):

    def generate_text(self):
        """Tell a joke about numbers."""
        num = random.randint(1,10)
        arguments = dict(
            num=num,
            plus_1=num+1,
            plus_3=num+3
        )
        setup = "Why is %(num)d afraid of %(plus_1)d? "
        punchline = "Because %(plus_1)d ate %(plus_3)d!"
        return (setup + punchline) % arguments

Bot = NumberJokes
0

这样,在给定的bot.yaml文件中,我只需要填写 未在default.yaml中指定的信息:

import random
from botfriend.bot import TextGeneratorBot

class NumberJokes(TextGeneratorBot):

    def generate_text(self):
        """Tell a joke about numbers."""
        num = random.randint(1,10)
        arguments = dict(
            num=num,
            plus_1=num+1,
            plus_3=num+3
        )
        setup = "Why is %(num)d afraid of %(plus_1)d? "
        punchline = "Because %(plus_1)d ate %(plus_3)d!"
        return (setup + punchline) % arguments

Bot = NumberJokes
1

对api的编程访问

有时你需要使用一个网站的api不仅仅是发布 去现场。每个bot都通过 它的publish设置和相应的publisher对象可从abot内部获得。一旦您有了一个publisher对象,原始api客户端将始终可用作publisher.api`.

请参阅iaMabOT < /代码> 构造函数 举个例子。这个机器人需要一个twitter api客户端来获取数据, 所以它会查看self.publishers直到找到twitter publisher,并获取其.api,将其存储以备以后使用。

结论

有很多我几乎没碰过的僵尸朋友的特征 完全没有提及:转发其他Twitter帐户的机器人 通过抓取网页上的内容和脚本来获取他们的文章 用于重新发布第一次发布不正确的帖子。

但我介绍的功能是你需要获得的主要功能 开始并看到了僵尸朋友的力量。希望你喜欢!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用Java将JSON转换为哈希映射   java如何通过使用MapStruct从源对象复制值来填充目标对象内部的映射?   注入泛型类型为@InjectGuice的类时发生java错误   字符串如何在JavaIDE中导入基本符号   在Java中将JSON转换为List<List<String>>   java Java9 HttpClient SSLHandshakeException   java jOOQ代码生成器   java如何调整图标(图像按钮),使其不会放大?   java我可以在使用Eclipse时安装2个或更多Android SDK吗   sqlite Java实现DAO   如何解决此错误?“java.lang.NoSuchFieldError:org.apache.http.conn.ssl.SSLConnectionSocketFactory上的实例。<clinit>。”   java Maven:将基于OSP的zip文件解压缩到WEBINF/lib   java如何在每次调用函数时获取当前gps位置?