Skip to content

Instantly share code, notes, and snippets.

@mdixon4
Created January 4, 2023 09:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdixon4/3701a38b0ba9b0c5f1087de2f20afe2d to your computer and use it in GitHub Desktop.
Save mdixon4/3701a38b0ba9b0c5f1087de2f20afe2d to your computer and use it in GitHub Desktop.
Upload image to geohashing.site
import { wrapFetch } from 'https://deno.land/x/another_cookiejar@v4.1.6/mod.ts'
const API_URL = 'https://geohashing.site/api.php'
const USERNAME = ''
const PASSWORD = ''
// Wrap fetch with a cookie jar.
const fetch = wrapFetch()
await login(USERNAME, PASSWORD)
// await getEditToken()
await uploadImage(
'2022-12-30_-38_146_mdixon4.jpg',
`[[Category: Meetup on 2022-12-30]]
[[Category: Meetup in -38 146]]
Uploaded by mdixon4's bot.`
)
//////////////////////////////
async function uploadImage(pathToImage, comment) {
console.log('Uploading', pathToImage)
const filename = pathToImage.split('/').pop()
const imageFileData = Deno.readFileSync(pathToImage)
const csrfToken = await getCsrfToken()
const params = new URLSearchParams()
params.append('action', 'upload')
params.append('format', 'json')
// params.append('token', csrfToken)
const formData = new FormData()
formData.append('token', csrfToken)
formData.append('filename', filename)
formData.append('comment', comment)
formData.append('file', imageFileData, {
filename,
type: 'image/jpg',
name: 'file',
})
// Make the request.
const response = await fetch(API_URL + '?' + params.toString(), {
method: 'POST',
body: formData,
headers: {
'Content-Type': 'multipart/form-data',
},
})
console.log(await response.json())
}
async function getLoginToken() {
console.log('Retrieving login token...')
const params = new URLSearchParams()
params.append('action', 'query')
params.append('meta', 'tokens')
params.append('type', 'login')
params.append('format', 'json')
const resp = await fetch(API_URL + '?' + params.toString())
const loginToken = (await resp.json()).query.tokens.logintoken
console.log('Login token:', loginToken)
return loginToken
}
async function getCsrfToken() {
console.log('Retrieving CSRF token...')
const params = new URLSearchParams()
params.append('action', 'query')
params.append('meta', 'tokens')
params.append('format', 'json')
const resp = await fetch(API_URL + '?' + params.toString())
const csrfToken = (await resp.json()).query.tokens.csrftoken
console.log('CSRF token:', csrfToken)
return csrfToken
}
async function login(username, password) {
console.log('Logging in...')
const params = new URLSearchParams()
params.append('action', 'login')
params.append('lgname', username)
params.append('lgpassword', password)
params.append('lgtoken', await getLoginToken())
params.append('format', 'json')
const resp = await fetch(API_URL, {
method: 'POST',
body: params,
})
const data = await resp.json()
if (data.login.result === 'Success') {
console.log('Login successful!')
} else {
console.log(data.login)
throw new Error('Login failed!')
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment