Unofficial Python wrapper for official Hacker News API

Overview

haxor

travis coverall version supported license

Unofficial Python wrapper for official Hacker News API.

Installation

pip install haxor

Usage

Import and initialization:

from hackernews import HackerNews
hn = HackerNews()

Items

Stories, comments, jobs, Ask HNs and even polls are just items with unique item id.

To query item information by id:

item = hn.get_item(8863)
# >>> item.title
# 'My YC app: Dropbox - Throw away your USB drive'
# >>> item.item_type
# 'story'
# >>> item.kids
# [ 8952, 9224, 8917, ...]

Since most results are returned as integer IDs (like item.kids above), these results require further iteration. Instead of doing this yourself, use the expand flag to get object-oriented, detailed item info by id:

item = hn.get_item(8863, expand=True)
# >>> item.kids
# [<hackernews.Item: 9224 - None>, <hackernews.Item: 8952 - None>, ...]
# >>> item.by
# <hackernews.User: dhouston>

To query a list of Item IDs:

items = hn.get_items_by_ids([8863, 37236, 2345])
# >>> items
# [<hackernews.Item: 8863 - My YC app: Dropbox - Throw away your USB drive>, <hackernews.Item:
# 37236 - None>, <hackernews.Item: 2345 - The Best Buy Scam.>]

Use the item_type filter to specifically select 'story', 'comment', 'job', or 'poll' items:

items = hn.get_items_by_ids([8863, 37236, 2345], item_type='story')
# >>> items
# [<hackernews.Item: 8863 - My YC app: Dropbox - Throw away your USB drive>, <hackernews.Item: # 2345 - The Best Buy Scam.>]

Stories

The HN API allows for real-time querying for New, Top, Best, Ask HN, Show HN, and Jobs stories.

As an example, to get Item objects of current top stories:

top_stories = hn.top_stories()
# >>> top_stories
# [<hackernews.Item: 16924667 - Ethereum Sharding FAQ>, ...]

Useful Item Queries

To get current largest Item id (most recent story, comment, job, or poll):

max_item = hn.get_max_item()
# >>> max_item
# 16925673

Once again, use the expand flag to get an object-oriented, detailed Item representation:

max_item = hn.get_max_item(expand=True)
# >>> max_item
# <hackernews.Item: 16925673 - None>

To get the x most recent Items:

last_ten = hn.get_last(10)
# >>> last_ten
# [<hackernews.Item: 16925688 - Show HN: Eventbot – Group calendar for Slack teams>, ...]

Users

HN users are also queryable.

To query users by user_id (i.e. username on Hacker News):

user = hn.get_user('pg')
# >>> user.user_id
# 'pg'
# >>> user.karma
# 155040

Use the expand flag to get an object-oriented, detailed Item representation for User attributes:

user = hn.get_user('dhouston', expand=True)
# >>> user.stories
# [<hackernews.Item: 1481914 - Dropbox is hiring a Web Engineer>, ...]
# >>> user.comments
# [<hackernews.Item: 16660140 - None>, <hackernews.Item: 15692914 - None>, ...]
# >>> user.jobs
# [<hackernews.Item: 3955262 - Dropbox seeking iOS and Android engineers>, ...]

To query a list of users:

users = hn.get_users_by_ids(['pg','dhouston'])
# >>> users
# [<hackernews.User: pg>, <hackernews.User: dhouston>]

Examples

Get top 10 stories:

hn.top_stories(limit=10)

# [<hackernews.Item: 16924667 - Ethereum Sharding FAQ>, <hackernews.Item: 16925499 - PipelineDB # v0.9.9 – One More Release Until PipelineDB Is a PostgreSQL Extension>, ...]

Find all the 'jobs' post from Top Stories:

stories = hn.top_stories()
for story in stories:
    if story.item_type == 'job':
        print(story)

# <hackernews.Item: 16925047 - Taplytics (YC W14) is solving hard engineering problems in
# Toronto and hiring>
# ...
# ...

Find Python jobs from monthly who is hiring thread:

# Who is hiring - April 2018
# https://news.ycombinator.com/item?id=16735011

who_is_hiring = hn.get_item(16735011, expand=True)

for comment in who_is_hiring.kids:
    if 'python' in comment.text.lower():
        print(comment)

# <hackernews.Item: 16735358 - None>
# <hackernews.Item: 16737152 - None>
# ...
# ...

API Reference

Class: HackerNews

Parameters:

Name Type Required Description Default
version string No specifies Hacker News API version v0

get_item

Description: Returns Item object

Parameters:

Name Type Required Description Default
item_id string/int Yes unique item id of Hacker News story, comment etc None
expand bool No flag to indicate whether to transform all IDs into objects False

get_items_by_ids

Description: Returns list of Item objects

Parameters:

Name Type Required Description Default
item_ids list of string/int Yes unique item ids of Hacker News stories, comments etc None
item_type string No item type to filter results with None

get_user

Description: Returns User object

Parameters:

Name Type Required Description Default
user_id string Yes unique user id of a Hacker News user None
expand bool No flag to indicate whether to transform all IDs into objects False

get_users_by_ids

Description: Returns list of User objects

Parameters:

Name Type Required Description Default
user_ids list of string/int Yes unique user ids of Hacker News users None

top_stories

Description: Returns list of Item objects of current top stories

Parameters:

Name Type Required Description Default
raw bool No indicate whether to represent all objects in raw json False
limit int No specifies the number of stories to be returned None

new_stories

Description: Returns list of Item objects of current new stories

Parameters:

Name Type Required Description Default
raw bool No indicate whether to represent all objects in raw json False
limit int No specifies the number of stories to be returned None

ask_stories

Description: Returns list of Item objects of latest Ask HN stories

Parameters:

Name Type Required Description Default
raw bool No indicate whether to represent all objects in raw json False
limit int No specifies the number of stories to be returned None

show_stories

Description: Returns list of Item objects of latest Show HN stories

Parameters:

Name Type Required Description Default
raw bool No indicate whether to represent all objects in raw json False
limit int No specifies the number of stories to be returned None

job_stories

Description: Returns list of Item objects of latest Job stories

Parameters:

Name Type Required Description Default
raw bool No indicate whether to represent all objects in raw json False
limit int No specifies the number of stories to be returned None

updates

Description: Returns list of Item and User objects that have been changed/updated recently.

Parameters: N/A

get_max_item

Description: Returns current largest item id or current largest Item object

Parameters:

Name Type Required Description Default
expand bool No flag to indicate whether to transform ID into object False

get_all

Description: Returns all Item objects from HN

Parameters: N/A

get_last

Description: Returns list of num most recent Item objects

Parameters:

Name Type Required Description Default
num int No numbr of most recent records to pull from HN 10

Class: Item

From Official HackerNews Item:

Property Description
item_id The item’s unique id.
deleted true if the item is deleted.
item_type The type of item. One of “job”, “story”, “comment”, “poll”, or “pollopt”.
by The username of the item’s author.
submission_time Creation date of the item, in Python datetime.
text The comment, Ask HN, or poll text. HTML.
dead true if the item is dead.
parent The item’s parent. For comments, either another comment or the relevant story. For pollopts, the relevant poll.
poll The ids of poll's.
kids The ids of the item’s comments, in ranked display order.
url The URL of the story.
score The story’s score, or the votes for a pollopt.
title The title of the story or poll.
parts A list of related pollopts, in display order.
descendants In the case of stories or polls, the total comment count.
raw original JSON response.

Class: User

From Official HackerNews User:

Property Description
user_id The user’s unique username. Case-sensitive.
delay Delay in minutes between a comment’s creation and its visibility to other users.
created Creation date of the user, in Python datetime.
karma The user’s karma.
about The user’s optional self-description. HTML.
submitted List of the user’s stories, polls and comments.
raw original JSON response.

Additional properties when expand is used

Property Description
stories The user’s submitted stories.
comments The user's submitted comments.
jobs The user's submitted jobs.
polls The user's submitted polls.
pollopts The user's submitted poll options.

Development

For local development do pip installation of requirements-dev.txt:

pip install -r requirements-dev.txt

Testing

Run the test suite by running:

python setup.py develop
pytest tests

LICENSE

The mighty MIT license. Please check LICENSE for more details.

Comments
  • Async Functionality & Object-Oriented Representation

    Async Functionality & Object-Oriented Representation

    1. Implements aiohttp and asyncio in a very simple manner to allow for asynchronous operations when faced with multiple Item IDs.
    2. Gives the user the ability to expand Item IDs into Item objects when using the get_item or get_user methods
    3. Gives the user the ability to see raw JSON representation of the *_stories methods instead of the Item object representation.
    4. Gives the user the ability to filter by item_type when using the get_items_by_ids method
    opened by robertjkeck2 10
  • Speeding up performance?

    Speeding up performance?

    Hi avinassh,

    I'm running into performance issues running the examples. It seems the HN API route can be considerably slower than just screen scraping.

    Is there a way for me to speed this up? I wonder if the connection to Firebase is being reused--seems like with requests this should be done automatically?

    Using timeit here are my results:

    for story_id in hn.top_stories(limit=10):
        print hn.get_item(story_id)
    

    timeit: 4.0882999897 sec

    who_is_hiring = hn.get_item(8394339)
    
    for comment_id in who_is_hiring.kids:
        comment = hn.get_item(comment_id)
        if 'python' in comment.text.lower():
            print comment.item_id
    

    timeit: 125.318946123 sec

    Thanks!

    opened by donnemartin 9
  • Loosen requests dependency

    Loosen requests dependency

    Fixes issues with Pipfile dependency resolution/locking

    venv ❯ pipenv install -r requirements/base.txt
    Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project.
    Creating a Pipfile for this project…
    Requirements file provided! Importing into Pipfile…
    Pipfile.lock not found, creating…
    Locking [dev-packages] dependencies…
    Locking [packages] dependencies…
    Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
      You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
    Could not find a version that matches requests==2.13.0,==2.18.4,>=2.0.0,>=2.4.3
    Tried: 0.2.0, 0.2.1, 0.2.2, 0.2.3, 0.2.4, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.4, 0.4.0, 0.4.1, 0.5.0, 0.5.1, 0.6.0, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.6.6, 0.7.0, 0.7.1, 0.7.2, 0.7.3, 0.7.4, 0.7.5, 0.7.6, 0.8.0, ...
    
    opened by tony 7
  • ImportError: No module named 'pypandoc'

    ImportError: No module named 'pypandoc'

    When installing haxor I get this error:

    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "/tmp/pip-install-zl_kpo7s/haxor/setup.py", line 6, in <module>
        import pypandoc
    ImportError: No module named 'pypandoc'
    

    The error won’t occur if I install pypandoc before haxor.

    The project’s requirements-dev.txt contains pypandoc but requirements.txt does not. Is this intended?

    opened by Markus00000 5
  • Missing parentheses in call to 'print' on Python 3.4.3 pip install

    Missing parentheses in call to 'print' on Python 3.4.3 pip install

    Hi, I'm getting the following error trying to install on Python 3.4.3, but it works fine on 2.7.10:

    $ pip install haxor
    
    Collecting haxor
      Using cached haxor-0.3.tar.gz
        Complete output from command python setup.py egg_info:
        Traceback (most recent call last):
          File "<string>", line 20, in <module>
          File "/private/var/folders/rp/8nf53wk57bgd12w6fr31rrwh0000gn/T/pip-build-yuswawpl/haxor/setup.py", line 12
            print long_description
                                 ^
        SyntaxError: Missing parentheses in call to 'print'
    
        ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/rp/8nf53wk57bgd12w6fr31rrwh0000gn/T/pip-build-yuswawpl/haxor
    
    opened by donnemartin 4
  • Update requests dependency

    Update requests dependency

    Is it possible to make haxor support requests>=2.4.0 to solve this dependency conflict I have?

    haxor 1.1 has requirement requests==2.0.0, but you'll have requests 2.18.4 which is incompatible.

    opened by Markus00000 3
  • Update requests dependency

    Update requests dependency

    Consider updating Requests dependency due to security issue which impacts versions <= 2.19.1. More on https://nvd.nist.gov/vuln/detail/CVE-2018-18074.

    opened by hadalin 2
  • Outdated version on pip

    Outdated version on pip

    Hi, I noticed that the version on pip is outdated as it does not support the descendants field added recently.

    You might want to update it. Temporarily I can solve it by using the github url as the dependency.

    opened by paradite 2
  • Fix broken headings in Markdown files

    Fix broken headings in Markdown files

    GitHub changed the way Markdown headings are parsed, so this change fixes it.

    See bryant1410/readmesfix for more information.

    Tackles bryant1410/readmesfix#1

    opened by bryant1410 2
  • Issue while fetching comments

    Issue while fetching comments

    hn = HackerNews()
    who_is_hiring = hn.get_item(12202865)
    for comment_id in who_is_hiring.kids:
        print('processing:- '+str(comment_id))
        comment = hn.get_item(comment_id) #this line caused the error
        if comment.text is not None:
            cleantext = BeautifulSoup(comment.text.lower(),'lxml').text.strip()
            comments.append(cleantext)
    

    Error is:

    Traceback (most recent call last):
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 331, in _make_request
        httplib_response = conn.getresponse(buffering=True)
    TypeError: getresponse() got an unexpected keyword argument 'buffering'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 516, in urlopen
        body=body, headers=headers)
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 333, in _make_request
        httplib_response = conn.getresponse()
      File "/anaconda3/anaconda/lib/python3.5/http/client.py", line 1197, in getresponse
        response.begin()
      File "/anaconda3/anaconda/lib/python3.5/http/client.py", line 297, in begin
        version, status, reason = self._read_status()
      File "/anaconda3/anaconda/lib/python3.5/http/client.py", line 266, in _read_status
        raise RemoteDisconnected("Remote end closed connection without"
    http.client.RemoteDisconnected: Remote end closed connection without response
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/adapters.py", line 362, in send
        timeout=timeout
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 559, in urlopen
        _pool=self, _stacktrace=stacktrace)
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/util/retry.py", line 245, in increment
        raise six.reraise(type(error), error, _stacktrace)
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/packages/six.py", line 309, in reraise
        raise value.with_traceback(tb)
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 516, in urlopen
        body=body, headers=headers)
      File "/anaconda3/anaconda/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 333, in _make_request
        httplib_response = conn.getresponse()
      File "/anaconda3/anaconda/lib/python3.5/http/client.py", line 1197, in getresponse
        response.begin()
      File "/anaconda3/anaconda/lib/python3.5/http/client.py", line 297, in begin
        version, status, reason = self._read_status()
      File "/anaconda3/anaconda/lib/python3.5/http/client.py", line 266, in _read_status
        raise RemoteDisconnected("Remote end closed connection without"
    requests.packages.urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))
    
    During handling of the above exception, another exception occurred:
    
    opened by kadnan 1
  • Bump py from 1.4.29 to 1.10.0

    Bump py from 1.4.29 to 1.10.0

    Bumps py from 1.4.29 to 1.10.0.

    Changelog

    Sourced from py's changelog.

    1.10.0 (2020-12-12)

    • Fix a regular expression DoS vulnerability in the py.path.svnwc SVN blame functionality (CVE-2020-29651)
    • Update vendored apipkg: 1.4 => 1.5
    • Update vendored iniconfig: 1.0.0 => 1.1.1

    1.9.0 (2020-06-24)

    • Add type annotation stubs for the following modules:

      • py.error
      • py.iniconfig
      • py.path (not including SVN paths)
      • py.io
      • py.xml

      There are no plans to type other modules at this time.

      The type annotations are provided in external .pyi files, not inline in the code, and may therefore contain small errors or omissions. If you use py in conjunction with a type checker, and encounter any type errors you believe should be accepted, please report it in an issue.

    1.8.2 (2020-06-15)

    • On Windows, py.path.locals which differ only in case now have the same Python hash value. Previously, such paths were considered equal but had different hashes, which is not allowed and breaks the assumptions made by dicts, sets and other users of hashes.

    1.8.1 (2019-12-27)

    • Handle FileNotFoundError when trying to import pathlib in path.common on Python 3.4 (#207).

    • py.path.local.samefile now works correctly in Python 3 on Windows when dealing with symlinks.

    1.8.0 (2019-02-21)

    • add "importlib" pyimport mode for python3.5+, allowing unimportable test suites to contain identically named modules.

    • fix LocalPath.as_cwd() not calling os.chdir() with None, when being invoked from a non-existing directory.

    ... (truncated)

    Commits
    • e5ff378 Update CHANGELOG for 1.10.0
    • 94cf44f Update vendored libs
    • 5e8ded5 testing: comment out an assert which fails on Python 3.9 for now
    • afdffcc Rename HOWTORELEASE.rst to RELEASING.rst
    • 2de53a6 Merge pull request #266 from nicoddemus/gh-actions
    • fa1b32e Merge pull request #264 from hugovk/patch-2
    • 887d6b8 Skip test_samefile_symlink on pypy3 on Windows
    • e94e670 Fix test_comments() in test_source
    • fef9a32 Adapt test
    • 4a694b0 Add GitHub Actions badge to README
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump aiohttp from 3.1.3 to 3.7.4

    Bump aiohttp from 3.1.3 to 3.7.4

    Bumps aiohttp from 3.1.3 to 3.7.4.

    Release notes

    Sourced from aiohttp's releases.

    aiohttp 3.7.3 release

    Features

    • Use Brotli instead of brotlipy [#3803](https://github.com/aio-libs/aiohttp/issues/3803) <https://github.com/aio-libs/aiohttp/issues/3803>_
    • Made exceptions pickleable. Also changed the repr of some exceptions. [#4077](https://github.com/aio-libs/aiohttp/issues/4077) <https://github.com/aio-libs/aiohttp/issues/4077>_

    Bugfixes

    • Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. [#3532](https://github.com/aio-libs/aiohttp/issues/3532) <https://github.com/aio-libs/aiohttp/issues/3532>_
    • Fix web_middlewares.normalize_path_middleware behavior for patch without slash. [#3669](https://github.com/aio-libs/aiohttp/issues/3669) <https://github.com/aio-libs/aiohttp/issues/3669>_
    • Fix overshadowing of overlapped sub-applications prefixes. [#3701](https://github.com/aio-libs/aiohttp/issues/3701) <https://github.com/aio-libs/aiohttp/issues/3701>_
    • Make BaseConnector.close() a coroutine and wait until the client closes all connections. Drop deprecated "with Connector():" syntax. [#3736](https://github.com/aio-libs/aiohttp/issues/3736) <https://github.com/aio-libs/aiohttp/issues/3736>_
    • Reset the sock_read timeout each time data is received for a aiohttp.client response. [#3808](https://github.com/aio-libs/aiohttp/issues/3808) <https://github.com/aio-libs/aiohttp/issues/3808>_
    • Fixed type annotation for add_view method of UrlDispatcher to accept any subclass of View [#3880](https://github.com/aio-libs/aiohttp/issues/3880) <https://github.com/aio-libs/aiohttp/issues/3880>_
    • Fixed querying the address families from DNS that the current host supports. [#5156](https://github.com/aio-libs/aiohttp/issues/5156) <https://github.com/aio-libs/aiohttp/issues/5156>_
    • Change return type of MultipartReader.aiter() and BodyPartReader.aiter() to AsyncIterator. [#5163](https://github.com/aio-libs/aiohttp/issues/5163) <https://github.com/aio-libs/aiohttp/issues/5163>_
    • Provide x86 Windows wheels. [#5230](https://github.com/aio-libs/aiohttp/issues/5230) <https://github.com/aio-libs/aiohttp/issues/5230>_

    Improved Documentation

    • Add documentation for aiohttp.web.FileResponse. [#3958](https://github.com/aio-libs/aiohttp/issues/3958) <https://github.com/aio-libs/aiohttp/issues/3958>_
    • Removed deprecation warning in tracing example docs [#3964](https://github.com/aio-libs/aiohttp/issues/3964) <https://github.com/aio-libs/aiohttp/issues/3964>_
    • Fixed wrong "Usage" docstring of aiohttp.client.request. [#4603](https://github.com/aio-libs/aiohttp/issues/4603) <https://github.com/aio-libs/aiohttp/issues/4603>_
    • Add aiohttp-pydantic to third party libraries [#5228](https://github.com/aio-libs/aiohttp/issues/5228) <https://github.com/aio-libs/aiohttp/issues/5228>_

    Misc

    ... (truncated)

    Changelog

    Sourced from aiohttp's changelog.

    3.7.4 (2021-02-25)

    Bugfixes

    • (SECURITY BUG) Started preventing open redirects in the aiohttp.web.normalize_path_middleware middleware. For more details, see https://github.com/aio-libs/aiohttp/security/advisories/GHSA-v6wp-4m6f-gcjg.

      Thanks to Beast Glatisant <https://github.com/g147>__ for finding the first instance of this issue and Jelmer Vernooij <https://jelmer.uk/>__ for reporting and tracking it down in aiohttp. [#5497](https://github.com/aio-libs/aiohttp/issues/5497) <https://github.com/aio-libs/aiohttp/issues/5497>_

    • Fix interpretation difference of the pure-Python and the Cython-based HTTP parsers construct a yarl.URL object for HTTP request-target.

      Before this fix, the Python parser would turn the URI's absolute-path for //some-path into / while the Cython code preserved it as //some-path. Now, both do the latter. [#5498](https://github.com/aio-libs/aiohttp/issues/5498) <https://github.com/aio-libs/aiohttp/issues/5498>_


    3.7.3 (2020-11-18)

    Features

    • Use Brotli instead of brotlipy [#3803](https://github.com/aio-libs/aiohttp/issues/3803) <https://github.com/aio-libs/aiohttp/issues/3803>_
    • Made exceptions pickleable. Also changed the repr of some exceptions. [#4077](https://github.com/aio-libs/aiohttp/issues/4077) <https://github.com/aio-libs/aiohttp/issues/4077>_

    Bugfixes

    • Raise a ClientResponseError instead of an AssertionError for a blank HTTP Reason Phrase. [#3532](https://github.com/aio-libs/aiohttp/issues/3532) <https://github.com/aio-libs/aiohttp/issues/3532>_
    • Fix web_middlewares.normalize_path_middleware behavior for patch without slash. [#3669](https://github.com/aio-libs/aiohttp/issues/3669) <https://github.com/aio-libs/aiohttp/issues/3669>_
    • Fix overshadowing of overlapped sub-applications prefixes. [#3701](https://github.com/aio-libs/aiohttp/issues/3701) <https://github.com/aio-libs/aiohttp/issues/3701>_

    ... (truncated)

    Commits
    • 0a26acc Bump aiohttp to v3.7.4 for a security release
    • 021c416 Merge branch 'ghsa-v6wp-4m6f-gcjg' into master
    • 4ed7c25 Bump chardet from 3.0.4 to 4.0.0 (#5333)
    • b61f0fd Fix how pure-Python HTTP parser interprets //
    • 5c1efbc Bump pre-commit from 2.9.2 to 2.9.3 (#5322)
    • 0075075 Bump pygments from 2.7.2 to 2.7.3 (#5318)
    • 5085173 Bump multidict from 5.0.2 to 5.1.0 (#5308)
    • 5d1a75e Bump pre-commit from 2.9.0 to 2.9.2 (#5290)
    • 6724d0e Bump pre-commit from 2.8.2 to 2.9.0 (#5273)
    • c688451 Removed duplicate timeout parameter in ClientSession reference docs. (#5262) ...
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • RecursionError when running tests

    RecursionError when running tests

    Running tests:

    pip install -r requirements-dev.txt
    python setup.py develop
    pytest tests
    

    produces the following error

    RecursionError: maximum recursion depth exceeded while calling a Python object
    

    Python version: 3.6.5

    opened by hadalin 2
  • TimeoutError Top Stories

    TimeoutError Top Stories

    Calling https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty from within the browser works fine, however if I try to leverage your wrapper

    hn = HackerNews()
    top_stories = hn.top_stories()
    top_stories
    

    I´ll run into ProtocolError: ('Connection aborted.', TimeoutError(10060,...) for most of the time.

    Any hints? Thanks.

    opened by eotp 0
Releases(v1.2.3)
Owner
I git stuff done
Download archived malware from ActiveState's source code mirror

malware-archivist (ma) Tool to aid security researchers in dissecting malware. Often, repository maintainers will remove malicious packages entirely f

ActiveState Software 28 Dec 12, 2022
Anti-corruption-bot - Anti corruption bot with python

anti-corruption-bot Test API (running via Flask) is currently hosted at https://

Richard Bankole 2 Feb 16, 2022
yobot插件,Steam雷达,可自动播报玩家的Steam游戏状态和DOTA2图文战报

Steam_watcher 这是 prcbot/yobot 的自定义插件,可自动播报玩家的Steam游戏状态和DOTA2图文战报 都有些什么功能? 本插件可以在用户绑定后自动推送Steam游戏状态的更新和 Dota2 图文战报,以及提供一些手动查询功能 指令列表 atbot 表示需要@BOT ats

羽波 21 Jun 21, 2022
Simple Webhook Spammer with Optional Proxy Support

😎 �Simple Webhook Spammer with Optional Proxy Support:- [+] git clone https://g

Terminal1337 12 Sep 29, 2022
A Python script that wraps the gitleaks tool to enable scanning of multiple repositories in parallel

mpgitleaks A Python script that wraps the gitleaks tool to enable scanning of multiple repositories in parallel. The motivation behind writing this sc

Emilio Reyes 7 Dec 29, 2022
CryptoApp - Python code to pull wallet balances from a variety of different chains through nothing other than your public key.

CryptoApp - Python code to pull wallet balances from a variety of different chains through nothing other than your public key.

Zach Frank 4 Dec 13, 2022
A Discord bot that generates inspirational quotes & motivating messages whenever a user is sad

Encourage bot is a discord bot that allows users to randomly get Inspirational quotes messages and gives motivational encouragements whenever someone says that he's sad/depressed.

1 Nov 25, 2021
Riverside Rocks Python API

APIv2 Riverside Rocks Python API Routes GET / Get status of the API GET /api/v1/tor Get Tor metrics of RR family GET /api/v1/metrics Get bandwidth

3 Dec 20, 2021
Powerful spammer bots for telegram made with python and telethon.

Powerful spammer bots for telegram made with python and telethon. We can deploy upto 70 bots at a time.

32 Dec 15, 2022
The official command-line client for spyse.com

Spyse CLI The official command-line client for spyse.com. NOTE: This tool is currently in the early stage beta and shouldn't be used in production. Yo

Spyse 43 Dec 08, 2022
Compares and analyzes GCP IAM roles.

gcp-iam-analyzer I wrote this to help in my day to day working in GCP. A lot of the time I am doing role comparisons to see which role has more permis

Jason Dyke 37 Dec 28, 2022
Console BeautifulDiscord theme manager

BeautifulDiscord theme manager Console script for downloading & managing Discord .css themes via BeautifulDiscord. Setup Simply run # Linux/MacOS pip3

1 Dec 15, 2022
Discord bot that generates boba drinks. Submission for sunhacks 2021

boba-bot Team Poggies' submission for Sunhacks 2021. Find our project page on Devpost, and a video demonstration can be found on YouTube. Commands $he

Joshua Tenorio 3 Nov 02, 2022
Low-level, feature rich and easy to use discord python wrapper

PWRCord Low-level, feature rich and easy to use discord python wrapper Important Note: At this point, this library API is considered unstable and can

MIguel Lopes 1 Dec 26, 2021
A simple script that can be used to track real time that user was online in telegram

TG_OnlineTracker A simple script that can be used to track real time that user was online in telegram Join @DaisySupport_Official 🎵 for help 🏃‍♂️ Ea

Inuka Asith 15 Oct 23, 2022
Scripts to help you win the Pizza Express

Slice of the Prizes Slice of the Prizes is a Python Script designed to enter the "Slice of the Action" competition hosted by Pizza Express the competi

Luke Bendall 1 Nov 04, 2021
A Python implementation of a Youtube Subscription manager & feed viewer, also does thumbnails

BUILDING Building requires python3.10, and the build package, which can be installed via pip: python3.10 -m pip install build To install, run python3.

2 Feb 28, 2022
Deleting someone else's Instagram account, repeat until the target account is blocked.

Program Features 📌 Instagram report V4. 📌 Coded with the latest version of Python. 📌 Has automatic scheduling. 📌 Full account report. 📌 Report a

hack4lx 16 Oct 25, 2022
ARKHAM X GOD MULTISPAM BOT

ARKHAM-X-GOD-MULTISPAM-BOT 𝗗𝗘𝗣𝗟𝗢𝗬 𝗨𝗣𝗧𝗢 30 𝗕𝗢𝗧𝗦 𝗜𝗡 𝗔 𝗦𝗜𝗡𝗚𝗟?

ArkhamXGod 2 Jan 08, 2022
A python script to download twitter space, only works on running spaces (for now).

A python script to download twitter space, only works on running spaces (for now).

279 Jan 02, 2023