18. Mushroom Observer API key

Mushroom Observer Import
This tool will import your observations from Mushroom Observer to iNat. You'll need to get a Mushroom Observer API key from http://mushroomobserver.org/account/api_keys

Enter your Mushroom Observer API key
Test

Enter your Mushroom Observer API key
Import
How This Works
iNat will import all of your MO observations, doing its best to translate MO's data model to our own. The testing tool above will give you a sense for what your imported data will look like on iNat. It should not import the same record twice, so if you run this multiple times, don't expect a record that's already been imported to change. It will store the MO URL as an observation field so you can always refer back to the original.
https://www.inaturalist.org/observations/moimport
Some caveats
Names will not allways match up: iNat will do its best to match MO names with iNat taxa, but it's not always going to be perfect. If we can't find a matching taxon, we'll just add a "placeholder" and you'll need to look for taxon-less observations to correct them.
iNat will use the MO consensus name, not your name. Getting your naming from the MO API seems to be impossible.
Observations not from collection location will be skipped: iNat is for recording observations from where and when they were observed in the wild.
You are the photo copyright holder: iNat does not support uploading photos by other people. It will assume and state publicly that you are the copyright holder for all images. https://www.inaturalist.org/observations/moimport

If you check "yes" for "Based on the evidence, can the Community ID still be confirmed or improved?" in the Data Quality Assessment section, your observation will go back to "needs ID" without singling out any person as unreliable.
That's the best way to do it. You could also turn off community ID for just that one observation and click 'no' for can't be improved. That should keep it at genus I thin
Another option is to add, say a family or genus-level ID rather than your species guess initially. You could mention what species you think it is in a comment. I often do that even when I have a hunch as to what the species is, to reduce the problem you mentioned.
Another option is to add, say a family or genus-level ID rather than your species guess initially. You could mention what species you think it is in a comment. I often do that even when I have a hunch as to what the species is, to reduce the problem you mentioned.
hat you are essentially saying is you are uncomfortable with people guessing to validate your guesses. The answer is to not guess in the first place. If you are not confident in a species ID, then enter it at genus or family etc. If someone follows that up with a fin

-- MAVERICK -- FALSE
For instance: wynand_uys identified an observation as "Lithobates areolatus" and it is not withdrawn, but the community ID is now "Animal" (https://www.inaturalist.org/observations/10786321)

How can I filter for all instances where there is a current ID posted of "Lithobates areolatus" where the community ID is not "Lithobates areolatus" ?

Maybe not exactly what you are looking for, but I know you can find observations where you are considered a "maverick":

https://www.inaturalist.org/identifications?user_id=tonyrebelo&category=maverick

I see there is also a "current" parameter.

In fact, it is on that screen. Exactly what I want is:

https://www.inaturalist.org/identifications?user_id=tonyrebelo&current=false

====-====
Bij naturgucker zijn de fotos 10MP. Enig idee hoe ze dat doen ? Ik weet wel dat ze elke seconde 60 fotos op vragen om de response (cache) een beetje actief te houden ,de ng.de fotos in de cache te houden. De 1 MP fotos van wrn.nl vallen dan toch wat tegen ? (1. Ga naar https://naturgucker.de/natur.dll/$/, 2. Zoek een fotos, bijv van Madeira,

  1. Rechtermuisknop URLhttps://farm5.staticflickr.com/…/32430079898_d48b711470_b.j… 4. Pak het Photo ID uit de link en volg https://www.bram.us/…/my-priceless-flickr-tip-how-to-find-…/
  2. Plak dit weer in http://flickr.com/photo.gne?id=32430079898
  3. Je komt dan weer ophttps://www.flickr.com/photos/12639178@N07/32430079898/)
Posted on November 25, 2018 11:32 AM by ahospers ahospers

Comments

Using the URLconf defined in app.urls, Django tried these URL patterns, in this order:
[name='home']
admin/ [name='admin_home']
demo/
search/ [name='search']
djadmin/
generic/
locations/
countries/
fieldwork/
observation/int:pk/ [name='observation_detail']
projects/
protocols/
species/
tags/
attrs/
users/
news/
subsites/
taxa/
photos/
sounds/
social/
pages/
charts/
stats/
i18n/
jsi18n/ [name='javascript-catalog']
translations/
select2/
api/
api/noordzee/
api/meetnetten/observation/ [name='meetnetten-observation-upload']
api/meetnetten/observation/docs/ [name='meetnetten-observation-docs']
api/oauth2/token/ [name='oauth2-token']
api/oauth2/revoke_token/ [name='oauth2-revoke-token']
api/oauth2/authorize/ [name='oauth2-authorize']
api/userinfo/ [name='api-userinfo']
api/identify/v1/ [name='identify_proxy']
accounts/
new_site/on.php [name='switch_on']
new_site/off.php [name='switch_off']
^static2\/(?P.*)$
The current path, waarneming/view/164848920, didn't match any of these.

Posted by ahospers over 5 years ago

But you're welcome to write your own script that posts through our API
https://www.inaturalist.org/pages/developers

Here's a snippet of posting users and obs over the API written in Ruby

require 'rubygems'
require 'rest_client'
require 'json'

First, enter your app_id, app_secret, and redirect_uri from

http://gorilla.inaturalist.org/oauth/applications/206

site = "http://gorilla.inaturalist.org"
app_id = '308714d38eaf78ed57c11c0790f639d7d05e86cb7564f641629116e5b3bea024'
app_secret = '8be0ee61e1b7858a14c050b982eb3e6447b2d674075f3d8c58c8759ed2ee02a6'
redirect_uri = 'http://www.bd.dix/utils/migratelanding.cfm'

Next, visit this link on your browser while logged in as 'tegenligger'

http://gorilla.inaturalist.org/oauth/authorize?client_id=308714d38eaf78ed57c11c0790f639d7d05e86cb7564f641629116e5b3bea024&redirect_uri=http%3A%2F%2Fwww.bd.dix%2Futils%2Fmigratelanding.cfm&response_type=code

and get your auth code

auth_code = "d9c5335b17c0ec05f7444b1673c675b16a9a4d77f2d499b852778888503760a3"

Next, get a token for tegenligger

payload = {
:client_id => app_id,
:client_secret => app_secret,
:code => auth_code,
:redirect_uri => redirect_uri,
:grant_type => "authorization_code"
}
response = RestClient.post("#{site}/oauth/token", payload)
token = JSON.parse(response)["access_token"]
headers = {"Authorization" => "Bearer #{token}"}

Now make a user using tegenligger's token

username = 'testuser1'
email = 'testuser1@bar.net'
password = 'testuser1password'

results = RestClient.post("#{site}/users.json", {"user[login]" =>
username, "user[email]" => email, "user[password]" => password,
"user[password_confirmation]" => password}, headers)
puts "created http://gorilla.inaturalist.org/users/#{JSON.parse(results)["id"]}"

Now get a token for testuser1

payload = {
:client_id => app_id,
:client_secret => app_secret,
:grant_type => "password",
:username => username,
:password => password
}
puts "POST #{site}/oauth/token, payload: #{payload.inspect}"
response_for_user1 = RestClient.post("#{site}/oauth/token", payload)
token_for_user1 = JSON.parse(response)["access_token"]
headers_for_user1 = {"Authorization" => "Bearer #{token}"}

Now make a observation on behalf of testuser1

results = RestClient.post("#{site}/observations.json",{
"observation[species_guess]" => "Northern Cardinal",
"observation[taxon_id]" => 9083,
"observation[observed_on_string]" => "2013-01-03",
"observation[time_zone]" => "Eastern Time (US %26 Canada)",
"observation[description]" => "what a cardinal",
"observation[tag_list]" => "foo,bar",
"observation[place_guess]" => "clinton, ct",
"observation[latitude]" => 41.27872259999999,
"observation[longitude]" => -72.5276073,
"observation[map_scale]" => 11,
"observation[location_is_exact]" => false,
"observation[positional_accuracy]" => 7798,
"observation[geoprivacy]" => "obscured"
}, headers_for_user1)

puts "created http://gorilla.inaturalist.org/observations/#{JSON.parse(results)[0]["id"]}"

Now make a another user using tegenligger's token

username = 'testuser2'
email = 'testuser2@bar.net'
password = 'testuser2password'

results = RestClient.post("#{site}/users.json", {"user[login]" =>
username, "user[email]" => email, "user[password]" => password,
"user[password_confirmation]" => password}, headers)
puts "created http://gorilla.inaturalist.org/users/#{JSON.parse(results)["id"]}"

Now get a token for testuser2

payload = {
:client_id => app_id,
:client_secret => app_secret,
:grant_type => "password",
:username => username,
:password => password
}
puts "POST #{site}/oauth/token, payload: #{payload.inspect}"
response_for_user2 = RestClient.post("#{site}/oauth/token", payload)
token_for_user2 = JSON.parse(response)["access_token"]
headers_for_user2 = {"Authorization" => "Bearer #{token}"}

Now make a observation on behalf of testuser2

results = RestClient.post("#{site}/observations.json",{
"observation[species_guess]" => "Northern Cardinal",
"observation[taxon_id]" => 9083,
"observation[observed_on_string]" => "2013-01-03",
"observation[time_zone]" => "Eastern Time (US %26 Canada)",
"observation[description]" => "what a cardinal",
"observation[tag_list]" => "foo,bar",
"observation[place_guess]" => "clinton, ct",
"observation[latitude]" => 41.27872259999999,
"observation[longitude]" => -72.5276073,
"observation[map_scale]" => 11,
"observation[location_is_exact]" => false,
"observation[positional_accuracy]" => 7798,
"observation[geoprivacy]" => "obscured"
}, headers_for_user2)

puts "created http://gorilla.inaturalist.org/observations/#{JSON.parse(results)[0]["id"]}"

Posted by ahospers almost 5 years ago

e I’m not querying the API directly is the rate limit any higher? Here is the script I’m currently using to download 1 photo/sec for 10k/day:

import os
import pickle
import requests
import shutil
import sys
import time

def download(url, name):
print(name)
with requests.get(url, stream=True) as r:
if r.status_code != 200:
print('{} error: {}'.format(r.status_code, url), file=sys.stderr)
return
r.raw.decode_content = True
with open('./ducks/{}.jpg'.format(name), 'wb') as f:
shutil.copyfileobj(r.raw, f)

def main():
os.makedirs('ducks', exist_ok=True)
present = set([x.replace('.jpg', '') for x in os.listdir('ducks')])

with open('duck_urls', 'rb') as f:
urls = pickle.load(f)

ctr = 0
for url in urls:
if ctr > 10000:
return
name = os.path.normpath(url).split(os.path.sep)[-2]
if name in present:
continue
download(url, name)
ctr += 1
time.sleep(1)

if name == 'main':
main()

Posted by ahospers over 3 years ago

It appears as if this link does not work anymore https://www.inaturalist.org/observations/moimport

Posted by martinax over 1 year ago

@ahospers Both of those links link to https://www.inaturalist.org/observations/moimport.html

It's the same link that I posted which returns a 404.

Posted by martinax over 1 year ago

Add a Comment

Sign In or Sign Up to add comments