一个服务器端框架,它使管理发布到社交媒体的艺术机器人变得容易。
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.py
,bot.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.post
every
五分钟。(在本文结尾,我展示了一个如何做到这一点的示例
文档。)
如果你的机器人没有被安排讲笑话,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
选项应该是自解释的——它是
机器人。现在,让我们详细了解其他两个选项。
计划
schedule
configuration选项控制您的bot应该多久运行一次
邮政。基本上有三种策略。
- 将
schedule
设置为分钟数。(这是什么数字笑话) 你的机器人会在 每隔一段时间,两个帖子之间的间隔时间为分钟。 - 给出
时间表
a平均值
分钟数。你的机器人会在 随机确定的间隔,约为 两个帖子之间的时间间隔为分钟,但有相当数量的随机变化。 - 要微调随机性,可以指定一个
stdev
来执行 卑鄙的。这将设置计算时使用的标准偏差 下一个职位应该在什么时候。将其设置为较低的数字,则posts将 几乎平均间隔
分钟。将其设置为高数字,然后发布 日程安排将大不相同。
如果你的机器人提前安排了所有的帖子,你可以省略schedule
时间(比如法郎
每日
是吗?
状态更新计划
有一个相关的选项,状态更新计划
,您只需要它
设置你的机器人是否保持内部状态,就像web单词一样。这个
option的工作方式与schedule
相同,但不是控制
机器人应该多久发布一次,它控制你的
update_state()
方法被调用。
其他配置设置
某些类型的机器人具有其他特定的配置设置。一
retweetbot的子类,比如
RP<<
将使用名为 如果您将一个名为 几乎所有我的机器人都使用相同的乳齿象和Twitter客户端密钥(但是
不同的应用程序密钥),我所有的乳齿象机器人都托管在
太空机器人。我将这些配置设置保存在 这样,在给定的 有时你需要使用一个网站的api不仅仅是发布
去现场。每个bot都通过
它的 请参阅 有很多我几乎没碰过的僵尸朋友的特征
完全没有提及:转发其他Twitter帐户的机器人
通过抓取网页上的内容和脚本来获取他们的文章
用于重新发布第一次发布不正确的帖子。 但我介绍的功能是你需要获得的主要功能
开始并看到了僵尸朋友的力量。希望你喜欢!retweet user
的特殊配置设置。这个
控制机器人转发的Twitter帐户。你的机器人可以定义
它自己的自定义配置选项——配置对象是
解析为yaml并作为配置传递到
bot
构造函数中
争论。你可以看看里面,找出你的任何信息
要。
默认值
default.yaml
的文件放在botfriend目录中
(在botfriend.sqlite
旁边),所有bot都将继承这些值
在那个文件中。default.yaml
中
我不必在每个bot.yaml
文件中重复它们。我的
default.yaml
如下所示:
0
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
bot.yaml
文件中,我只需要填写
未在default.yaml中指定的信息:
1
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
对api的编程访问
publish
设置和相应的publisher对象可从a
bot内部获得。一旦您有了一个
publisher对象,原始api客户端将始终可用作
publisher.api`.iaMabOT < /代码>
构造函数
举个例子。这个机器人需要一个twitter api客户端来获取数据,
所以它会查看self.publishers直到找到twitter
publisher,并获取其.api
,将其存储以备以后使用。结论
推荐PyPI第三方库