[tor-commits] [stem/master] Using SocksiPy for client usage tutorial

atagar at torproject.org atagar at torproject.org
Mon May 13 17:01:05 UTC 2013


commit a72e22512e86653d86ec2015bbf3416a3de52aae
Author: Damian Johnson <atagar at 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)
+





More information about the tor-commits mailing list