Thrillofit86
Thrillofit86

Reputation: 629

Possible to request github JSON file without token

So I have been having some issues solving how I can read my repo file, which is in JSON format, with requests. (Python)

Basically I have created something simple like:

r = requests.get('https://raw.githubusercontent.com/Test/testrepo/master/token.json?token=ADAJKFAHFAKNQ3RKVSUQ5T12333777777')

which works, however, every time I make a new commit/changes on that file, it gives me a new token and then I need to recode all over again.

So my question is, is it possible to access the JSON file without the token? (I do need to keep the repo in private as well), but the point is that I want to be able to do changes on the file without the URL being changed.

Upvotes: 1

Views: 1805

Answers (3)

Carson
Carson

Reputation: 8098

@larsks provides solution are great, and I want to supplement.


I choose a public repositoryawesome-python as an example

suppose you want to access master/docs/CNAME contents

import requests
token = "MY_SECRET_TOKEN"
owner = 'vinta'
repo = 'awesome-python'
path = 'docs/CNAME'
branch = 'master' # or sha1, for example: 6831740

url = f'https://api.github.com/repos/{owner}/{repo}/contents/{path}?ref={branch}'
print(url)
r = requests.get(url,
      headers={
        'accept': 'application/vnd.github.v3.raw',
        # 'authorization': f'token {token}', # If you are want to read "public" only, then you can ignore this line.
      }
    )
print(r.text)

"""
Type
r.text: str
r.content: bytes
"""

# If you want to save it as a file, then you can try as below.
# f=open('temp.ico','wb')
# f.write(r.content)

But I think many people may want to access a private repository.

then go to

  1. github.com/settings/tokens

  2. Generate a new token

  3. click repo (Full control of private repositories)

    enter image description here

  4. add header of authorizationcancel comment

Upvotes: 0

larsks
larsks

Reputation: 312370

The easiest solution is probably to use the GitHub API, rather than trying to use the "raw" link you see in the browser.

  1. First, acquire a personal access token
  2. Now issue an API request to /repos using that access token:

    import requests
    token = "MY_SECRET_TOKEN"
    owner = 'Test'
    repo = 'testrepo'
    path = 'token.json'
    
    r = requests.get(
          'https://api.github.com/repos/{owner}/{repo}/contents/{path}'.format(
            owner=owner, repo=repo, path=path),
          headers={
            'accept': 'application/vnd.github.v3.raw',
            'authorization': 'token {}'.format(token),
          }
        )
    print(r.text)
    

Upvotes: 2

3141bishwa
3141bishwa

Reputation: 133

You can use the Github python library to get any file in your repository. Since you mentioned keeping the repo in private, you have to login to github using one of the methods described here. Here is an example of getting the file using the github username and password

from github import Github

user_name = <YOUR_USERNAME>
password = <YOUR_PASSWORD>
g = Github(user_name, password)


file_name='test.json' #Choose your required file name location
repo_name = 'repo_name'
repo_location = '{}/{}'.format(user_name, repo_name)

repo = g.get_repo(repo_location)

file = repo.get_contents(file_name)


#if you want the download url for the file (this comes along with the token that you talked about earlier)
download_url = file.download_url

#if you simply want the content inside the file
content = file.decoded_content

Upvotes: 0

Related Questions