Take the 2-minute tour ×
Stack Apps is a question and answer site for apps, scripts, and development with the Stack Exchange API. It's 100% free, no registration required.

Now on PyPI!

You can now find Stack.PY on PyPI, Python's package index. This means that you can install the package simply by running the following command in a terminal:

pip install stackpy

enter image description here

About

Stack.PY is based heavily on Stack.PHP and Stack.JS, taking the chained-method concept and applying it to Python. The end result is an extremely easy to use module, named stackpy:

from stackpy import API, Site

# Print the names of all Stack Exchange sites
for site in API.sites:
    print site['name']

# Grab the first question on Stack Overflow
print Site('stackoverflow').questions[0].title

Here are some of the other features you can expect from Stack.PY:

  • Caching: currently Stack.PY ships with an SQLite database backend (used for caching currently). By default, if no cache is set, Stack.PY creates an in-memory SQLite database to cache requests for the current session.
  • Full documentation: using a single command (see the README file) you can generate all of the documentation for the entire module - including an explanation for each parameter of every method.

Many more features are planned:

  • A test suite.
  • A series of examples (currently there is one really primitive example).
  • Full support for rate-limiting and the backoff response.

Stack.PY should run perfectly fine in Python 3k using 2to3.

License

Stack.PY is released under the MIT License.

Contact

I can be reached at admin@quickmediasolutions.com.

Code

The code for Stack.PY is hosted here on Launchpad. You can check out the latest code using:

bzr init
bzr pull lp:stackpy

You can view the code online here.

Stack.PY uses distutils so you can install the module by running:

python setup.py install

...or... if you are using Ubuntu, you can add my PPA and install the appropriate package:

sudo apt-get install python-stackpy (for Python 2k)
sudo apt-get install python3-stackpy (for Python 3k)

share|improve this question
    
Great work George! –  Zagorulkin Dmitry Jul 25 '12 at 9:07
    
nice work! But can you tell how to make a API.begin_explicit call? I can't find an example of this. –  Thomas15v Mar 2 '13 at 20:40
    
@Thomas15v: I've added an explanation and example in an answer below. –  Nathan Osman Mar 2 '13 at 21:19
    
Can you add a better explanation of what this can do? –  Cody Guldner May 25 '13 at 15:17
    
@Cody: Do you mean more code examples? –  Nathan Osman May 25 '13 at 15:25
    
I guess I don't understand what this does –  Cody Guldner May 25 '13 at 15:26
    
How do I use the /users/me call? The example shows how to pass an ID, but after a user logs in all I've got in the access_token, which me uses to return a user. –  Andy Mar 13 at 2:10
    
@Andy: Good question. How this is supposed to work is that you call some_se_site.users.me.access_token('12345'). Unfortunately, the me attribute is mysteriously missing from the source code. I am planning to rewrite this library within the next couple of months, so I will make sure this is added to the list of things to fix. –  Nathan Osman Mar 13 at 6:30
add comment

5 Answers 5

After I installed stackpy, how can I get the docs? I installed doxygen but cannot get Stackpy documentation. Can somebody help me? In fact, I want to know how to search StackOverflow for related questions in my own QA site using your StackExchange API app.

Many thanks.

share|improve this answer
    
Quote: "Full documentation: using a single command (see the README file) you can generate all of the documentation for the entire module - including an explanation for each parameter of every method.". Is that inaccurate? –  Mat Sep 4 '13 at 11:32
    
@Mat that documentation looks nice, but doesn't actually tell anything (beyond the names of classes, and their __str__, __init__ etc. members) –  sehe Nov 20 '13 at 0:50
add comment

Question: How do you request all Tags?

Retrieving a list of tags on a given Stack Exchange site with Stack.PY is relatively straightforward:

from stackpy import Site

sa = Site('stackapps')
for t in sa.tags:
    print t

However, this will only fetch the first 30 tags. The tricky part is fetching more than one page. You can fetch any particular page by sticking .page(n) on the end of the request chain (where n is the page to fetch).

If we rewrite the loop a bit, we end up with:

from itertools import count
from stackpy import Site

sa = Site('stackapps')
for p in count(1):
    tags = sa.tags.page(p)
    for t in tags:
        print t
    if not tags['has_more']:
        break

The example above uses a generator that will yield an infinite list of consecutive page numbers to fetch all of the pages. When the has_more property is set to false in the JSON returned by the API, the loop will terminate.

share|improve this answer
1  
I've edited your answer into a question / answer combo. Please let me know if you have any further questions. –  Nathan Osman May 23 '13 at 3:42
add comment

Example of Explicit Authentication:

Explicit authentication is relatively straightforward with Stack.PY. Assuming you have already registered your application, the instructions look something like this:

  1. Visit your application's page to obtain the following information:

    • key
    • client ID
    • client secret

  2. Provide Stack.PY with the above information:

    from stackpy import API
    
    # Fill in the strings with the appropriate values:
    API.key, API.client_id, API.client_secret = "", "", ""
    
  3. The API.begin_explicit() call consists of the following parameters:

    • a string consisting of the required privileges separated by commas
    • the URI to redirect the user to when the authorization completes
    • an optional string value to be returned with the access token when authorization completes

    Example:

    redirect_uri = API.begin_explicit('read_inbox,no_expiry',
                                      'http://example.com/done')
    

    The return value of the function is the URL that you will need to redirect the user to. That page will allow the user to authorize your application.

  4. The API.complete_explicit() call consists of the following parameters:

    • the value of the GET parameter code
    • the URI you provided to begin_explicit() above

    Example:

    access_token = API.complete_explicit(request.GET['code'],
                                         'http://example.com/done')
    

    The return value is the access token for the user.

share|improve this answer
    
On this line, access_token = API.complete_explicit(request.GET['code'], 'example.com/done'), I am getting an error - Name error: name 'request' is not defined. Why? –  lifebalance Dec 30 '13 at 21:33
    
@lifebalance: That was an example using Django. You will need to use whatever web framework you are using to get the value of the 'code' GET parameter. –  Nathan Osman Dec 30 '13 at 21:49
add comment

Do you know, offhand, how complete this library is? Are there parts of the StackExchange API v2.1 that you know are not covered yet?

share|improve this answer
    
As a server-side library, Stack.PY does not cover implicit auth. Pretty much everything else is fully accessible through the library. –  Nathan Osman May 24 '13 at 2:11
    
@NathanOsman As a follow up, has this been maintained to support the ability to add content to SE (questions, answers, flags, etc) from version 2.2? –  Andy May 15 at 15:33
    
@Andy: in theory, it should. I'm using the ask question method on my own website. I haven't done a lot of testing, however. –  Nathan Osman May 15 at 15:54
1  
@NathanOsman, could you post a short snippet of how that works? I am attempting to a.) get available flag options and then b.) send a flag, but I can't seem to figure out what I need to call to get the available options. –  Andy May 16 at 14:27
add comment

Example - Downloading a question with its body

from stackpy import Site

site = Site('stackoverflow')
question = site.questions(1732348).filter('withbody')[0]

print '--- %s ---' % question.title
print question.body
share|improve this answer
    
Actually, printing a question will print the title by default. So you can do: print question instead of print question.title. –  Nathan Osman May 24 '13 at 2:10
add comment

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .