Skip to main content

用于 Twitter 的 MegaHAL 机器人

项目描述

推特哈尔

Python 中的 MegaHAL Twitter 机器人。

该项目处于 alpha 阶段,不应以任何方式被认为是稳定的。

活生生的例子(瑞典语):@bibel3000@trendhal3000

先决条件

但是所有这些都应该由pipor自动安装setup.py

使用pip install twitterhal[detectlanguage]安装detectlanguagepip 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.ShelveDatabasedatabase.RedisDatabaseoptions键包含要发送到该数据库类的__init__()方法的kwargs。当使用该选项运行 TwitterHAL 时--test,选项将使用test_optionsdict 的内容进行扩展。

INCLUDE_MENTIONS:如果True,TwitterHAL 将在其回复中包含所有提及。也就是说,不仅是写给它的用户的@handle,还有他们在推文中提到的每个用户。也许你应该小心使用它。无论如何,默认是False.

MEGAHAL包含 的关键字参数megahal.Megahal。有关更多信息,请参阅该模块

MEGAHAL_API["banwords"]:如果您的机器人不会说英语,您可能需要设置此项。专业提示:搜索您的语言中最常用的约 300 个单词的列表,然后使用这些单词。

POST_STATUS_LIMITPOST_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执行以下操作:

  1. 启动workers,它将在不同的线程中连续运行
  2. settings.RUNNER_SLEEP_SECONDS秒为间隔(默认值:5),运行循环任务,每个任务都在一个新线程中
  3. 退出时,运行循环后任务

工人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是一个侦听SIGINTSIGTERM发出信号的对象,因此其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 (30.0 kB 查看哈希

已上传 source

内置分布

twitterhal-0.7.3-py3-none-any.whl (40.9 kB 查看哈希

已上传 py3