forked from bpilkerton/python-crpapi
-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathcrpapi.py
119 lines (94 loc) · 3.2 KB
/
crpapi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
"""
Python library for interacting with the CRP API.
The CRP API (https://www.opensecrets.org/action/api_doc.php) provides
campaign finance and other data from the Center for Responsive Politics.
See README.md for methods and usage
"""
__author__ = "James Turk ([email protected])"
__version__ = "0.1.0"
__copyright__ = "Copyright (c) 2009 Sunlight Labs"
__license__ = "BSD"
import urllib.error
import urllib.parse
import urllib.request
import requests
class CRPApiError(Exception):
"""Exception for CRP API errors"""
# results #
class CRPApiObject(object):
def __init__(self, d):
self.__dict__ = d
# namespaces #
class CRP(object):
apikey = None
@staticmethod
def _apicall(func, params):
if CRP.apikey is None:
raise CRPApiError("Missing CRP apikey")
url = (
f"https://www.opensecrets.org/api/?method={func}&output=json"
f"&apikey={CRP.apikey}&{urllib.parse.urlencode(params)}"
)
headers = {"User-Agent": "Mozilla/5.0"}
try:
return requests.get(url=url, headers=headers).json()["response"]
except urllib.error.HTTPError as e:
raise CRPApiError(e.read())
except (ValueError, KeyError):
raise CRPApiError("Invalid Response")
class getLegislators(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("getLegislators", kwargs)["legislator"]
return results
class memPFDprofile(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("memPFDprofile", kwargs)["member_profile"]
return results
class candSummary(object):
@staticmethod
def get(**kwargs):
result = CRP._apicall("candSummary", kwargs)["summary"]
return result["@attributes"]
class candContrib(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("candContrib", kwargs)["contributors"][
"contributor"
]
return results
class candIndustry(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("candIndustry", kwargs)["industries"][
"industry"
]
return results
class candSector(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("candSector", kwargs)["sectors"]["sector"]
return results
class candIndByInd(object):
@staticmethod
def get(**kwargs):
result = CRP._apicall("CandIndByInd", kwargs)["candIndus"]
return result["@attributes"]
class getOrgs(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("getOrgs", kwargs)["organization"]
return results
class orgSummary(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("orgSummary", kwargs)["organization"]
return results
class congCmteIndus(object):
@staticmethod
def get(**kwargs):
results = CRP._apicall("congCmteIndus", kwargs)["committee"][
"member"
]
return results