commit a72e22512e86653d86ec2015bbf3416a3de52aae Author: Damian Johnson atagar@torproject.org Date: Mon May 13 08:45:51 2013 -0700
Using SocksiPy for client usage tutorial
Exemplifying using tor with both SocksiPy and PycURL. It's quite a bit simpler with SocksiPy so I'll probably use this for most other examples. Change is thanks to Ashish. --- docs/tutorials/to_russia_with_love.rst | 74 ++++++++++++++++++++++++-------- 1 files changed, 56 insertions(+), 18 deletions(-)
diff --git a/docs/tutorials/to_russia_with_love.rst b/docs/tutorials/to_russia_with_love.rst index a2e9647..da0c05f 100644 --- a/docs/tutorials/to_russia_with_love.rst +++ b/docs/tutorials/to_russia_with_love.rst @@ -1,6 +1,14 @@ To Russia With Love ===================
+* :ref:`using-socksipy` +* :ref:`using-pycurl` + +.. _using-socksipy: + +Using SocksiPy +-------------- + Say it's 1982, the height of the Cold War, and you're a journalist doing a piece on how the Internet looks from behind the Iron Curtain. Ignoring the minor detail that the Internet doesn't yet exist, we'll walk you through how you could do it - no passport required!
The Internet isn't uniform. Localization, censorship, and selective service based on your IP's geographic location can make the Internet a very different place depending on where you're coming from. @@ -9,40 +17,38 @@ Tor relays are scattered all over the world and, as such, you can pretend to be
Tor makes `configuring your exit locale https://www.torproject.org/docs/faq.html.en#ChooseEntryExit`_ easy through the **ExitNodes** torrc option. Note that you don't need a control port (or even stem) to do this, though they can be useful if you later want to do something more elaborate.
-In the following example we're using stem to `start Tor <../api/process.html>`_, then reading a site through it with `PycURL http://pycurl.sourceforge.net/`_. This is not always reliable (some relays are lemons) so you may need to run this more than once. +In the following example we're using stem to `start Tor <../api/process.html>`_, then reading a site through it with `SocksiPy http://socksipy.sourceforge.net/`_. This is not always reliable (some relays are lemons) so you may need to run this more than once.
**Do not rely on the following not to leak.** Though it seems to work, DNS resolution and other edge cases might expose your real IP. If you have a suggestion for how to improve this example then please `let me know http://www.atagar.com/contact/`_!
::
import StringIO + import urllib
- import pycurl + import socks # SocksiPy module import stem.process
from stem.util import term
SOCKS_PORT = 7000
- def curl(url): - """ - Uses pycurl to fetch a site using the proxy on the SOCKS_PORT. - """ + # Set socks proxy and wrap the urllib module
- output = StringIO.StringIO() + socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT) + socks.wrapmodule(urllib)
- query = pycurl.Curl() - query.setopt(pycurl.URL, url) - query.setopt(pycurl.PROXY, 'localhost') - query.setopt(pycurl.PROXYPORT, SOCKS_PORT) - query.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5) - query.setopt(pycurl.WRITEFUNCTION, output.write) + + def query(url): + """ + Uses urllib to fetch a site using SocksiPy for Tor over the SOCKS_PORT. + """
try: - query.perform() - return output.getvalue() - except pycurl.error as exc: - return "Unable to reach %s (%s)" % (url, exc) + return urllib.urlopen(url).read() + except: + return "Unable to reach %s" % url +
# Start an instance of tor configured to only exit through Russia. This prints # tor's bootstrap information as it starts. Note that this likely will not @@ -52,6 +58,7 @@ In the following example we're using stem to `start Tor <../api/process.html>`_, if "Bootstrapped " in line: print term.format(line, term.Color.BLUE)
+ print term.format("Starting Tor:\n", term.Attr.BOLD)
tor_process = stem.process.launch_tor_with_config( @@ -63,9 +70,40 @@ In the following example we're using stem to `start Tor <../api/process.html>`_, )
print term.format("\nChecking our endpoint:\n", term.Attr.BOLD) - print term.format(curl("http://www.atagar.com/echo.php"), term.Color.BLUE) + print term.format(query("http://www.atagar.com/echo.php"), term.Color.BLUE)
tor_process.kill() # stops tor
.. image:: /_static/locale_selection_output.png
+.. _using-pycurl: + +Using PycURL +------------ + +Besides SocksiPy, you can also use `PycURL http://pycurl.sourceforge.net/`_ to do the same. To do so replace the query() function above with... + +:: + + import pycurl + + def query(url): + """ + Uses pycurl to fetch a site using the proxy on the SOCKS_PORT. + """ + + output = StringIO.StringIO() + + query = pycurl.Curl() + query.setopt(pycurl.URL, url) + query.setopt(pycurl.PROXY, 'localhost') + query.setopt(pycurl.PROXYPORT, SOCKS_PORT) + query.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5) + query.setopt(pycurl.WRITEFUNCTION, output.write) + + try: + query.perform() + return output.getvalue() + except pycurl.error as exc: + return "Unable to reach %s (%s)" % (url, exc) +