Last active
August 29, 2015 14:06
-
-
Save kitelife/c148ff2a9ec1bd7b091c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import requests | |
| class GithubWalker(object): | |
| token = None | |
| source_user = None | |
| api_url_base = 'https://api.github.com' | |
| user_has_walked = set() | |
| user_id_wait_walk = [] | |
| user_wait_walk = {} | |
| def __init__(self, token, file_name, source_user=None): | |
| self.token = token | |
| self.fh = open(file_name, 'w+') | |
| self.source_user = source_user | |
| self.session = requests.Session() | |
| self.session.headers.update({'Authorization': 'token ' + self.token}) | |
| def __get_user_info(self, api_url): | |
| req = self.session.get(api_url) | |
| if req.status_code != 200: | |
| print req.status_code | |
| return None | |
| json_res = req.json() | |
| if 'blog' in json_res: | |
| return json_res['blog'] | |
| def __get_following(self, api_url): | |
| req = self.session.get(api_url) | |
| if req.status_code != 200: | |
| print req.status_code | |
| return False | |
| json_res = req.json() | |
| for following in json_res: | |
| self.user_id_wait_walk.append(following['id']) | |
| self.user_wait_walk[following['id']] = following['url'] | |
| return True; | |
| def __recursive_walk(self, entry): | |
| self.__get_following(entry) | |
| while len(self.user_id_wait_walk): | |
| user_id = self.user_id_wait_walk.pop() | |
| if user_id not in self.user_has_walked: | |
| user_url = self.user_wait_walk[user_id] | |
| self.__get_following(user_url + '/following') | |
| user_blog = self.__get_user_info(user_url) | |
| if user_blog: | |
| print user_blog | |
| self.fh.write(user_blog + '\n') | |
| self.fh.flush() | |
| self.user_has_walked.add(user_id) | |
| if user_id in self.user_wait_walk: | |
| del self.user_wait_walk[user_id] | |
| def walk_now(self): | |
| entry = self.api_url_base + '/users/' + self.source_user + '/following' | |
| self.__recursive_walk(entry) | |
| def main(): | |
| token = 'xxx' | |
| file_as_db = 'blogs.txt' | |
| source_user = 'youngsterxyf' | |
| gw = GithubWalker(token, file_as_db, source_user) | |
| gw.walk_now() | |
| if __name__ == '__main__': | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment