用于 Twitter 的 MegaHAL 机器人
项目描述
推特哈尔
Python 中的 MegaHAL Twitter 机器人。
该项目处于 alpha 阶段,不应以任何方式被认为是稳定的。
活生生的例子(瑞典语):@bibel3000,@trendhal3000
先决条件
- 蟒蛇> = 3.6
- 我的 Chris Jones 的 Python MegaHAL 的分支
- 熊/蟒蛇推特
- carpedm20/表情符号
- 蟒蛇-Levenshtein
- 可选:检测语言
- 可选:redis-py
但是所有这些都应该由pipor自动安装setup.py。
使用pip install twitterhal[detectlanguage]安装detectlanguage,pip install twitterhal[redis]安装redis-py。
用法
命令行
$ twitterhal
usage: twitterhal [-s SETTINGS_MODULE] [-d] [-m] [-f] [-t]
[-r | --chat | --stats | --print-config | --post-random | --version]
optional arguments:
-s SETTINGS_MODULE, --settings SETTINGS_MODULE
Python path to settings module. If omitted, we try
looking for it in the 'TWITTERHAL_SETTINGS_MODULE'
environment variable.
-d, --debug More verbose logging output
-m, --include-mentions
Include all mentions in replies (rather than just the
handle we're replying to)
-f, --force Try and force stuff, even if TwitterHAL doesn't want
to
-t, --test Test mode; doesn't actually post anything
-r, --run Run the bot!
--chat Chat with the bot
--stats Display some stats
--print-config Print current parsed config
--post-random Post a new random tweet
--version Show program's version number and exit
twitterhal --run将在(见下文)发布随机推文random_post_times,并回答所有传入的提及,同时尽最大努力不超过Twitter API 速率限制。
作为图书馆
from twitterhal import TwitterHAL
with TwitterHAL(screen_name="twitterhal") as hal:
for mention in hal.get_new_mentions():
hal.generate_reply(mention)
hal.generate_random()
hal.post_from_queue()
配置
设置是从环境变量中指定的 Python 模块或您通过参数TWITTERHAL_SETTINGS_MODULE提供给命令行实用程序的任何模块中读取的。[-s | --settings]
一些示例设置:
SCREEN_NAME = "my_k3wl_twitter_user"
RANDOM_POST_TIMES = [datetime.time(8), datetime.time(16), datetime.time(22)]
INCLUDE_MENTIONS = True
DETECTLANGUAGE_API_KEY = ""
DATABASE = {
"class": "path.to.DatabaseClass",
"options": {},
"test_options": {},
}
BANNED_USERS = ["my_other_twitterhal_bot"]
RUNNER_SLEEP_SECONDS = 5
POST_STATUS_LIMIT = 300
POST_STATUS_LIMIT_RESET_FREQUENCY = 3 * 60 * 60
TWITTER_API = {
"consumer_key": "foo",
"consumer_secret": "bar",
"access_token_key": "boo",
"access_token_secret": "far",
"timeout": 40,
"tweet_mode": "extended",
}
MEGAHAL_API = {
"max_length": twitter.api.CHARACTER_LIMIT,
"brainfile": "twitterhal-brain",
"order": megahal.DEFAULT_ORDER,
"timeout": megahal.DEFAULT_TIMEOUT,
"banwords": ["MOST", "COMMON", "WORDS"],
}
BANNED_USERS: Twitter 用户名(句柄)列表,不带前导“@”。我们永远不会回应或提及这些用户。例如,如果您运行两个机器人并且不希望它们陷入相互响应的永恒循环中,这很有用。(也许有一天,我会想出一个聪明的方法来自动检测这种循环。)
DATABASE:关于数据库后端的信息字典。必须至少包含键class,它必须是继承自的类的路径database.BaseDatabase。包括database.ShelveDatabase和database.RedisDatabase。options键包含要发送到该数据库类的__init__()方法的kwargs。当使用该选项运行 TwitterHAL 时--test,选项将使用test_optionsdict 的内容进行扩展。
INCLUDE_MENTIONS:如果True,TwitterHAL 将在其回复中包含所有提及。也就是说,不仅是写给它的用户的@handle,还有他们在推文中提到的每个用户。也许你应该小心使用它。无论如何,默认是False.
MEGAHAL包含 的关键字参数megahal.Megahal。有关更多信息,请参阅该模块。
MEGAHAL_API["banwords"]:如果您的机器人不会说英语,您可能需要设置此项。专业提示:搜索您的语言中最常用的约 300 个单词的列表,然后使用这些单词。
POST_STATUS_LIMIT和POST_STATUS_LIMIT_RESET_FREQUENCY:由于某种原因,Twitter 的 API 没有提供有关发布推文(和转发)的当前比率限制的信息,所以我必须尽我最大的能力实现该检查。数字取自这里。
RANDOM_POST_TIMES:TwitterHAL 每天都会在这些(本地)时间点发布一条随机生成的推文。默认值:8:00、16:00 和 22:00(即上午 8 点、下午 4 点和晚上 10 点,适合那些停留在古代的人)。
RUNNER_SLEEP_SECONDSruntime.runner:开始循环任务的时间间隔。见下文。
TWITTER_API包含 的关键字参数twitter.Api。在此处阅读更多相关信息。
扩展
持久存储
您可以通过子类化并向其方法TwitterHAL添加database.DatabaseItem定义来扩展 TwitterHAL 的数据库。init_db()也许您想通过定期获取热门话题的热门推文来喂饱 MegaHAL 大脑,并且需要跟踪这些内容?我知道我知道。
默认情况下,数据库(它是 的子类型database.BaseDatabase)将包含:
posted_tweets(models.TweetList): 已发布推文列表mentions(models.TweetList): 提及我们的推文列表,以及是否已被回复
语言检测
推文内部存储在 中models.TweetList,其中包含方法only_in_language()。这将在语言检测 API的帮助下过滤掉所有可能使用所选语言的推文。只需为自己获取一个 API 密钥并将其提供给(或在您的设置中设置;见上文),一切就绪。pip install detectlanguagedetectlanguage.configuration.api_key
Twitter API 调用
can_do_request(url)如果您使用调用 Twitter API 的新方法扩展 TwitterHAL ,建议您还检查 TwitterHAL 的url类似内容/statuses/mentions_timeline(请参阅此页面以获取完整列表),以查看此时是否应该进行此调用。
运行
twitterhal.runtime.runner由 调用的“守护程序”(不是真正的守护程序)twitterhal --run执行以下操作:
- 启动workers,它将在不同的线程中连续运行
- 以
settings.RUNNER_SLEEP_SECONDS秒为间隔(默认值:5),运行循环任务,每个任务都在一个新线程中 - 退出时,运行循环后任务
工人由TwitterHAL.register_workers()through注册runner.register_worker(),并且应该是循环直到被信号中断的可调用对象(请参阅下面的GracefulKiller部分)。如果它们接受布尔关键字参数restart,它们将被执行restart=True以防它们过早退出并且必须由运行器重新启动。
循环任务,不像工人,应该是有限的时间。它们由TwitterHAL.register_loop_tasks()through注册runner.register_loop_task(),每个循环最多运行一次,并且可以是任何可调用的。如果runner.register_loop_task()使用整数参数sleep(秒)调用,GracefulKiller.sleep()(见下文)将在此任务的每次执行结束时被调用,并且运行者将被禁止开始新的任务执行,直到该任务完成。(如果您不希望它在最后休眠,但仍想阻止任务同时运行多次,请发送sleep=0。)
后循环任务由TwitterHAL.register_post_loop_tasks()through注册runner.register_post_loop_task(),并且可以是任何可调用的。它们在循环中断后被调用,并且不在单独的线程中运行。可用于各种清理操作。默认情况下,没有。
优雅杀手
gracefulkiller.killer是一个侦听SIGINT并SIGTERM发出信号的对象,因此其kill_now属性设置为True. 它还有一种sleep()方法,可以time.sleep()在捕捉到上述信号之一后模拟但最多 1 秒中止。如果在睡眠期间被捕获,则sleep()返回,这可用于 ping。随意在您的工人、循环任务等中使用它。TrueSIGALRM
例子:
from twitterhal.gracefulkiller import killer
def hello_world_worker():
while not killer.kill_now:
print("Hello, world!")
ping = killer.sleep(10)
if ping:
print("Pong!")
问答
为什么 TwitterHAL 看不到我的所有提及?
Twitter有一个叫做“质量过滤器”的设置,据说是“从你的通知中过滤低质量的内容”,默认开启。您可以转到机器人的通知设置并取消选中“质量过滤器”复选框(至少,您在 2020 年 4 月 24 日就是这样做的)。这应该解决它。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置分布
twitterhal -0.7.3.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | ed0400587e66b3aa3b1f649ee089f351172329a93cfd7bead5a45bb084443515 |
|
| MD5 | 3e2706cc530ab20948098c6dd7cd07e9 |
|
| 布莱克2-256 | e256a8942020d0ba7e53170a0cdd3307f794cfe200f43a2d44b0fc0d2ada2eff |
twitterhal -0.7.3-py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 427a9896818cb58d6c1c48c5cffc7772ba2a0e599e9b40c85be225a7ecfe9956 |
|
| MD5 | 03c5cff0476e1f79ba3154226e457165 |
|
| 布莱克2-256 | d4254e2500ef2aef199a8d38b0703c4c118b1298170baf8326ac07bfe941f42b |