Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/kirienko/onegin_daily

Twitter bot for publishing "Eugene Onegin"
https://github.com/kirienko/onegin_daily

python python3 tweepy twitter-bot

Last synced: 4 days ago
JSON representation

Twitter bot for publishing "Eugene Onegin"

Awesome Lists containing this project

README

        

Onegin daily
============
Twitter Bot in Python
---------------------

See here: https://twitter.com/onegin_daily

Once upon a time the famous Russian poet Pushkin wrote his famous
poem ["Eugene Onegin"](https://en.wikipedia.org/wiki/Eugene_Onegin).

Much later, just for fun, I wrote a trivial twitter bot,
which the only purpose was to publish one fourteen-line stanza
of that poem a day. Continuously. Forever. When it finishes the
entire poem, it waits for three weeks and starts again.

The bot is so old that initially it used `python 2.6`.
In 2022, it was updated to `python 3.9` and `tweepy 4.8`.

How it works
------------
There are carefully prepared tweets for each day in the `/tweets`
folder. Each file contains all tweets for one day.

A source file looks like this:

Печально подносить лекарство,
Вздыхать и думать про себя:
Когда же черт возьмет тебя!"\\
Какое низкое коварство
Полуживого забавлять,
Ему подушки поправлять,\\
Его пример другим наука;
Но, боже мой, какая скука
С больным сидеть и день и ночь,
Не отходя ни шагу прочь!\\
"Мой дядя самых честных правил,
Когда не в шутку занемог,
Он уважать себя заставил
И лучше выдумать не мог.\\
Г Л А В А П Е Р В А Я
И жить торопится и чувствовать спешит.
Кн. Вяземский.
I

The bot takes a tweet file and splits it using the `\\` as a separator.
Each split is a single tweet. Therefore this will be tweeted first:

Печально подносить лекарство,
Вздыхать и думать про себя:
Когда же черт возьмет тебя!"

And the "header" is the last one:

Г Л А В А П Е Р В А Я
И жить торопится и чувствовать спешит.
Кн. Вяземский.
I

In one's twitter feed it will become a well separated stanza:

Г Л А В А П Е Р В А Я
И жить торопится и чувствовать спешит.
Кн. Вяземский.
I

"Мой дядя самых честных правил,
Когда не в шутку занемог,
Он уважать себя заставил
И лучше выдумать не мог.

Его пример другим наука;
Но, боже мой, какая скука
С больным сидеть и день и ночь,
Не отходя ни шагу прочь!

Какое низкое коварство
Полуживого забавлять,
Ему подушки поправлять,

Печально подносить лекарство,
Вздыхать и думать про себя:
Когда же черт возьмет тебя!"

There is a counter `current_pos` which stores the state of the bot.
Initially it is equal to zero. I.e. on the first day, the bot takes the
file number zero from the `/tweets` folder, and publishes it.
After a successful tweet the current position is incremented.
The next day the bot will take the next tweet. On the `n`-th day the bot
will take the `n`-th file, as it is stated in the `current_pos`.
But if one day the bot is unable to tweet
for some reason, the `current_pos` remains the same, and as soon as the
bot is back to live, it continues from where it has stopped.

Deployment
----------
Since 2013, the bot was running on a private server (under the table in some
academic institute). Unfortunately, due to the well-known events in 2022,
Twitter was banned in Russia. The server still sends the API requests though...

Now the bot uses GitHub CI, see the `.github` directory:
- the CI is triggered via `cron`
- it runs a Linux VM and tweets from it
- it saves (commits) the current position

Contents of the bot
-------------------
* the bot itself: `onegin_paste_bot.py`;
* a set of tweets, with 120 characters per tweet limit;
* the source text of `Eugene Onegin`, and a cutter which produces
all those tweets (`chopper.py`). Some tricky places (like *Girls'
song*) were processed manually;
* primitive statistics: followers count (`stat.py`)
* the script to remove all the tweets for the account
(`remove_all_tweets.py`)