2012-01-16 20:53:34 +01:00
|
|
|
vRFC1149
|
|
|
|
========
|
|
|
|
This is an implementation of "IP over Avian Carrier", using tweets as
|
|
|
|
virtualized avian carrier.
|
2011-12-21 03:27:59 +01:00
|
|
|
|
|
|
|
|
2012-01-16 20:53:34 +01:00
|
|
|
Installation and requirements
|
|
|
|
=============================
|
2011-12-21 03:27:59 +01:00
|
|
|
You need
|
|
|
|
* tweepy >= 1.8 (https://github.com/tweepy/tweepy.git)
|
|
|
|
* python-bytearray
|
2012-01-16 20:53:34 +01:00
|
|
|
|
|
|
|
Each client needs a twitter account to tweet network packets and one
|
|
|
|
account to follow for incoming network packets. If the tweets of each account
|
|
|
|
are public, the accounts don't need to follow each other. Currently, only point
|
|
|
|
to point connections are possible, as specified by RFC1149.
|
|
|
|
|
|
|
|
|
|
|
|
How it works
|
|
|
|
============
|
|
|
|
The script needs one Twitter account. It registers the account via oAuth, so it
|
|
|
|
becomes accessible (see Authorization) and then pull tweets from it via Twitter's
|
|
|
|
streaming-API. Tweets are en-/decoded and (de-)fragmented using packaging
|
|
|
|
helper (see Encoding). Incoming tweets are parsed as incoming traffic, outgoing
|
|
|
|
traffic is fragmented, encoded and then tweeted.
|
|
|
|
|
|
|
|
|
|
|
|
Authorization
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
The script needs to be associated with Twitter through oAuth. If it is started
|
|
|
|
without credentials, it gives you a link to twitter.com with a generated token
|
|
|
|
and then asks for a PIN. After entering the PIN the script is fully
|
|
|
|
authorized to both tweet and read tweets. The ACCESS_KEY and ACCESS_SECRET are
|
|
|
|
saved into conf_auth.py.
|
|
|
|
|
|
|
|
If the script already has an ACCESS_KEY and ACCESS_SECRET you won't be asked
|
|
|
|
for credentials again.
|
|
|
|
|
|
|
|
|
|
|
|
Encoding
|
|
|
|
~~~~~~~~
|
|
|
|
A tweet's maximum length is 140 characters. One character for twitter is one
|
|
|
|
unicode character, meaning that one character can encode 20 bits (current
|
|
|
|
uncode range is 0x0-0x110000). In vRFC1149's implementation two bytes are
|
|
|
|
encoded in each character, leaving 4 bit of each char for metadata (the
|
|
|
|
header).
|
|
|
|
|
|
|
|
Sadly twitter removes, mangles or augmentates some of
|
|
|
|
the characters. For more information about this look into the comments in the
|
|
|
|
source (phelper.UPHelper.reassembleBrokenChars()).
|
|
|
|
|
|
|
|
An alternative approach is to just tweet everything plain, reducing the payload
|
|
|
|
of a tweet to 138 bytes (2 bytes reserved for header). Nevertheless, twitter
|
|
|
|
transforms certain characters (<,> to <, >), so a workarround is needed,
|
|
|
|
too.
|
|
|
|
|
|
|
|
All available packaging helpers can be found in phelper.py.
|
|
|
|
|
|
|
|
|
|
|
|
Twitter API Limits
|
|
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
Twitter allows each client to do 1000 tweets a day. When considering a
|
|
|
|
continuous connection and a tweet size of 280 bytes, the average speed is about
|
|
|
|
3byte/s (273kb/day). Additional, twitter breaks down the 1000 tweets to an
|
|
|
|
unspecified hourly limit.
|
|
|
|
|
|
|
|
|
|
|
|
RFC1149 compability
|
|
|
|
===================
|
|
|
|
This implementation of RFC1149 does not reach 100% compability, since the
|
|
|
|
general tweet comes without a leg on which the message could be taped to.
|
|
|
|
Also, no duct tape is used (no taping whatsoever).
|
|
|
|
|
|
|
|
Regarding the encoding, one could write a packaging helper more compatible
|
|
|
|
with the RFC's frame format (hexadecimal representation with seperated octets).
|
|
|
|
As a side effect, it would reduce the payload of one tweet to 46 bytes.
|
|
|
|
|
|
|
|
|
|
|
|
What could be done
|
|
|
|
==================
|
|
|
|
* create network topologies with Twitter's "following" feature
|
|
|
|
* support multiple clients
|
|
|
|
* create a table of characters which are not "eaten" by twitter or what they
|
|
|
|
get transformed to
|
|
|
|
|
|
|
|
|
|
|
|
Licensing
|
|
|
|
=========
|
|
|
|
Written by Sebastian Lohff <seba@seba-geek.de>
|
|
|
|
Published under the GPLv3 or later
|
|
|
|
|