Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > e4be28b383be195ff28bfce2053e734a > files > 284

python-stem-doc-1.1.0-1.fc18.noarch.rpm



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>To Russia With Love &mdash; Stem 1.1.0 documentation</title>
    
    <link rel="stylesheet" href="../_static/haiku.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="../_static/print.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '1.1.0',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/theme_extras.js"></script>
    <link rel="shortcut icon" href="../_static/favicon.png"/>
    <link rel="top" title="Stem 1.1.0 documentation" href="../index.html" />
    <link rel="up" title="Contents" href="../contents.html" />
    <link rel="next" title="Tortoise and the Hare" href="tortoise_and_the_hare.html" />
    <link rel="prev" title="The Little Relay that Could" href="the_little_relay_that_could.html" /> 
  </head>
  <body>
      <div class="header"><img class="rightlogo" src="../_static/logo.png" alt="Logo"/><h1 class="heading"><a href="../index.html">
          <span>Stem Docs</span></a></h1>
        <h2 class="heading"><span>To Russia With Love</span></h2>
      </div>
      <div class="topnav">
      
        <p>

        <ul id="navbar">
          <li><a href="../index.html">Home</a></li>
          <li><a href="../tutorials.html">Tutorials</a>
            <ul>
              <li><a href="the_little_relay_that_could.html">Hello World</a></li>
              <li><a href="#">Client Usage</a></li>
              <li><a href="tortoise_and_the_hare.html">Event Listening</a></li>
              <li><a href="mirror_mirror_on_the_wall.html">Tor Descriptors</a></li>
              <li><a href="east_of_the_sun.html">Utilities</a></li>
              <li><a href="double_double_toil_and_trouble.html">Examples</a></li>
            </ul>
          </li>
          <li><a href="../api.html">API</a>
            <ul>
              <li><a href="../api/control.html">stem.control</a></li>
              <li><a href="../api/connection.html">stem.connection</a></li>
              <li><a href="../api/socket.html">stem.socket</a></li>
              <li><a href="../api/process.html">stem.process</a></li>
              <li><a href="../api/response.html">stem.response</a></li>
              <li><a href="../api/exit_policy.html">stem.exit_policy</a></li>
              <li><a href="../api/version.html">stem.version</a></li>
              <li><a href="../api.html#descriptors">Descriptors</a></li>
              <li><a href="../api.html#utilities">Utilities</a></li>
            </ul>
          </li>
          <li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem">Development</a>
            <ul>
              <li><a href="../faq.html">FAQ</a></li>
              <li><a href="../change_log.html">Change Log</a></li>
              <li><a href="https://trac.torproject.org/projects/tor/wiki/doc/stem/bugs">Bug Tracker</a></li>
              <li><a href="../download.html">Download</a></li>
            </ul>
          </li>
        </ul>
        </p>

      </div>
      <div class="content">
        
        
  <div class="section" id="to-russia-with-love">
<h1>To Russia With Love<a class="headerlink" href="#to-russia-with-love" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><a class="reference internal" href="#using-socksipy"><em>Using SocksiPy</em></a></li>
<li><a class="reference internal" href="#using-pycurl"><em>Using PycURL</em></a></li>
<li><a class="reference internal" href="#reading-twitter"><em>Reading Twitter</em></a></li>
</ul>
<div class="section" id="using-socksipy">
<span id="id1"></span><h2>Using SocksiPy<a class="headerlink" href="#using-socksipy" title="Permalink to this headline">¶</a></h2>
<p>Say it&#8217;s 1982, the height of the Cold War, and you&#8217;re a journalist doing a piece on how the Internet looks from behind the Iron Curtain. Ignoring the minor detail that the Internet doesn&#8217;t yet exist, we&#8217;ll walk you through how you could do it - no passport required!</p>
<p>The Internet isn&#8217;t uniform. Localization, censorship, and selective service based on your IP&#8217;s geographic location can make the Internet a very different place depending on where you&#8217;re coming from.</p>
<p>Tor relays are scattered all over the world and, as such, you can pretend to be from any place running an exit. This can be especially useful to evade pesky geolocational restrictions, such as news sites that refuse to work while you&#8217;re traveling abroad.</p>
<p>Tor makes <a class="reference external" href="https://www.torproject.org/docs/faq.html.en#ChooseEntryExit">configuring your exit locale</a> easy through the <strong>ExitNodes</strong> torrc option. Note that you don&#8217;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.</p>
<p>In the following example we&#8217;re using stem to <a class="reference external" href="../api/process.html">start Tor</a>, then reading a site through it with <a class="reference external" href="http://socksipy.sourceforge.net/">SocksiPy</a>. This is not always reliable (some relays are lemons) so you may need to run this more than once.</p>
<p><strong>Do not rely on the following not to leak.</strong> Though it seems to work there may be edge cases that expose your real IP. If you have a suggestion for how to improve this example then please <a class="reference external" href="https://www.atagar.com/contact/">let me know</a>!</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">StringIO</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">urllib</span>

<span class="kn">import</span> <span class="nn">socks</span>  <span class="c"># SocksiPy module</span>
<span class="kn">import</span> <span class="nn">stem.process</span>

<span class="kn">from</span> <span class="nn">stem.util</span> <span class="kn">import</span> <span class="n">term</span>

<span class="n">SOCKS_PORT</span> <span class="o">=</span> <span class="mi">7000</span>

<span class="c"># Set socks proxy and wrap the urllib module</span>

<span class="n">socks</span><span class="o">.</span><span class="n">setdefaultproxy</span><span class="p">(</span><span class="n">socks</span><span class="o">.</span><span class="n">PROXY_TYPE_SOCKS5</span><span class="p">,</span> <span class="s">&#39;127.0.0.1&#39;</span><span class="p">,</span> <span class="n">SOCKS_PORT</span><span class="p">)</span>
<span class="n">socket</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">socks</span><span class="o">.</span><span class="n">socksocket</span>

<span class="c"># Perform DNS resolution through the socket</span>

<span class="k">def</span> <span class="nf">getaddrinfo</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
  <span class="k">return</span> <span class="p">[(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">,</span> <span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]))]</span>

<span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span> <span class="o">=</span> <span class="n">getaddrinfo</span>


<span class="k">def</span> <span class="nf">query</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
  <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">  Uses urllib to fetch a site using SocksiPy for Tor over the SOCKS_PORT.</span>
<span class="sd">  &quot;&quot;&quot;</span>

  <span class="k">try</span><span class="p">:</span>
    <span class="k">return</span> <span class="n">urllib</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
  <span class="k">except</span><span class="p">:</span>
    <span class="k">return</span> <span class="s">&quot;Unable to reach </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">url</span>


<span class="c"># Start an instance of tor configured to only exit through Russia. This prints</span>
<span class="c"># tor&#39;s bootstrap information as it starts. Note that this likely will not</span>
<span class="c"># work if you have another tor instance running.</span>

<span class="k">def</span> <span class="nf">print_bootstrap_lines</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
  <span class="k">if</span> <span class="s">&quot;Bootstrapped &quot;</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">term</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">term</span><span class="o">.</span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span><span class="p">)</span>


<span class="k">print</span> <span class="n">term</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;Starting Tor:</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">term</span><span class="o">.</span><span class="n">Attr</span><span class="o">.</span><span class="n">BOLD</span><span class="p">)</span>

<span class="n">tor_process</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">launch_tor_with_config</span><span class="p">(</span>
  <span class="n">config</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">&#39;SocksPort&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">SOCKS_PORT</span><span class="p">),</span>
    <span class="s">&#39;ExitNodes&#39;</span><span class="p">:</span> <span class="s">&#39;{ru}&#39;</span><span class="p">,</span>
  <span class="p">},</span>
  <span class="n">init_msg_handler</span> <span class="o">=</span> <span class="n">print_bootstrap_lines</span><span class="p">,</span>
<span class="p">)</span>

<span class="k">print</span> <span class="n">term</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">Checking our endpoint:</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">term</span><span class="o">.</span><span class="n">Attr</span><span class="o">.</span><span class="n">BOLD</span><span class="p">)</span>
<span class="k">print</span> <span class="n">term</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">query</span><span class="p">(</span><span class="s">&quot;https://www.atagar.com/echo.php&quot;</span><span class="p">),</span> <span class="n">term</span><span class="o">.</span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span><span class="p">)</span>

<span class="n">tor_process</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>  <span class="c"># stops tor</span>
</pre></div>
</div>
<img alt="../_images/locale_selection_output.png" src="../_images/locale_selection_output.png" />
</div>
<div class="section" id="using-pycurl">
<span id="id2"></span><h2>Using PycURL<a class="headerlink" href="#using-pycurl" title="Permalink to this headline">¶</a></h2>
<p>Besides SocksiPy, you can also use <a class="reference external" href="http://pycurl.sourceforge.net/">PycURL</a> to do the same. To do so replace the query() function above with...</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">pycurl</span>

<span class="k">def</span> <span class="nf">query</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
  <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">  Uses pycurl to fetch a site using the proxy on the SOCKS_PORT.</span>
<span class="sd">  &quot;&quot;&quot;</span>

  <span class="n">output</span> <span class="o">=</span> <span class="n">StringIO</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>

  <span class="n">query</span> <span class="o">=</span> <span class="n">pycurl</span><span class="o">.</span><span class="n">Curl</span><span class="p">()</span>
  <span class="n">query</span><span class="o">.</span><span class="n">setopt</span><span class="p">(</span><span class="n">pycurl</span><span class="o">.</span><span class="n">URL</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
  <span class="n">query</span><span class="o">.</span><span class="n">setopt</span><span class="p">(</span><span class="n">pycurl</span><span class="o">.</span><span class="n">PROXY</span><span class="p">,</span> <span class="s">&#39;localhost&#39;</span><span class="p">)</span>
  <span class="n">query</span><span class="o">.</span><span class="n">setopt</span><span class="p">(</span><span class="n">pycurl</span><span class="o">.</span><span class="n">PROXYPORT</span><span class="p">,</span> <span class="n">SOCKS_PORT</span><span class="p">)</span>
  <span class="n">query</span><span class="o">.</span><span class="n">setopt</span><span class="p">(</span><span class="n">pycurl</span><span class="o">.</span><span class="n">PROXYTYPE</span><span class="p">,</span> <span class="n">pycurl</span><span class="o">.</span><span class="n">PROXYTYPE_SOCKS5</span><span class="p">)</span>
  <span class="n">query</span><span class="o">.</span><span class="n">setopt</span><span class="p">(</span><span class="n">pycurl</span><span class="o">.</span><span class="n">WRITEFUNCTION</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">write</span><span class="p">)</span>

  <span class="k">try</span><span class="p">:</span>
    <span class="n">query</span><span class="o">.</span><span class="n">perform</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">output</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
  <span class="k">except</span> <span class="n">pycurl</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
    <span class="k">return</span> <span class="s">&quot;Unable to reach </span><span class="si">%s</span><span class="s"> (</span><span class="si">%s</span><span class="s">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">exc</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="reading-twitter">
<span id="id3"></span><h2>Reading Twitter<a class="headerlink" href="#reading-twitter" title="Permalink to this headline">¶</a></h2>
<p>Now lets do somthing a little more interesting, and read a Twitter feed over Tor. This can be easily done <a class="reference external" href="https://dev.twitter.com/docs/api/1/get/statuses/user_timeline">using thier API</a> (<strong>warning: Twitter has deprecated the API that this example uses,</strong> <a class="reference external" href="https://trac.torproject.org/9003">ticket 9003</a>)...</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">json</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">urllib</span>

<span class="kn">import</span> <span class="nn">socks</span>  <span class="c"># SockiPy module</span>
<span class="kn">import</span> <span class="nn">stem.process</span>

<span class="n">SOCKS_PORT</span> <span class="o">=</span> <span class="mi">7000</span>
<span class="n">TWITTER_API_URL</span> <span class="o">=</span> <span class="s">&quot;http://api.twitter.com/1/statuses/user_timeline.json?screen_name=</span><span class="si">%s</span><span class="s">&amp;count=</span><span class="si">%i</span><span class="s">&amp;include_rts=1&quot;</span>

<span class="n">socks</span><span class="o">.</span><span class="n">setdefaultproxy</span><span class="p">(</span><span class="n">socks</span><span class="o">.</span><span class="n">PROXY_TYPE_SOCKS5</span><span class="p">,</span> <span class="s">&#39;127.0.0.1&#39;</span><span class="p">,</span> <span class="n">SOCKS_PORT</span><span class="p">)</span>
<span class="n">socket</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">socks</span><span class="o">.</span><span class="n">socksocket</span>


<span class="k">def</span> <span class="nf">poll_twitter_feed</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">tweet_count</span><span class="p">):</span>
  <span class="sd">&quot;&quot;&quot;</span>
<span class="sd">  Polls Twitter for the tweets from a given user.</span>
<span class="sd">  &quot;&quot;&quot;</span>

  <span class="n">api_url</span> <span class="o">=</span> <span class="n">TWITTER_API_URL</span> <span class="o">%</span> <span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">tweet_count</span><span class="p">)</span>

  <span class="k">try</span><span class="p">:</span>
    <span class="n">api_response</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">api_url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
  <span class="k">except</span><span class="p">:</span>
    <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s">&quot;Unable to reach </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">api_url</span><span class="p">)</span>

  <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">api_response</span><span class="p">)</span>

<span class="n">tor_process</span> <span class="o">=</span> <span class="n">stem</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">launch_tor_with_config</span><span class="p">(</span>
  <span class="n">config</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">&#39;SocksPort&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">SOCKS_PORT</span><span class="p">),</span>
    <span class="s">&#39;ExitNodes&#39;</span><span class="p">:</span> <span class="s">&#39;{ru}&#39;</span><span class="p">,</span>
  <span class="p">},</span>
<span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
  <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">tweet</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">poll_twitter_feed</span><span class="p">(</span><span class="s">&#39;ioerror&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)):</span>
    <span class="k">print</span> <span class="s">&quot;</span><span class="si">%i</span><span class="s">. </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tweet</span><span class="p">[</span><span class="s">&quot;created_at&quot;</span><span class="p">])</span>
    <span class="k">print</span> <span class="n">tweet</span><span class="p">[</span><span class="s">&quot;text&quot;</span><span class="p">]</span>
    <span class="k">print</span>
<span class="k">except</span> <span class="ne">IOError</span><span class="p">,</span> <span class="n">exc</span><span class="p">:</span>
  <span class="k">print</span> <span class="n">exc</span>
<span class="k">finally</span><span class="p">:</span>
  <span class="n">tor_process</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>  <span class="c"># stops tor</span>
</pre></div>
</div>
<img alt="../_images/twitter_output.png" src="../_images/twitter_output.png" />
</div>
</div>


      </div>
      <div class="bottomnav">
      </div>

    <div class="footer">
    </div>
  </body>
</html>