On m'a demandé de pouvoir obtenir la clé API redmine en utilisant ruby au travail. J'ai vu l'achèvement pour le moment, donc je vais le résumer au lieu de mon mémorandum. L'article n'a été créé que par un programmeur débutant au cours de la première année de sa vie professionnelle qui a obtenu un emploi de programmeur simplement en étudiant par lui-même, en répétant la recherche et la copie. S'il y a une personne comme moi, j'espère que cet article à lui seul sera un succès.
Je l'ai d'abord cherché, mais je n'ai pas trouvé la description correspondante. En supposant que la clé API est reçue de l'écran de configuration personnelle de redmine et entrée dans le code, je n'ai pas pu trouver un moyen d'obtenir la clé API par programme. Cependant, à la suite d'une recherche excluant l'état du rubis, l'article suivant a été trouvé.
Comment obtenir diverses données de Redmine JavaScript https://qiita.com/forenoonM/items/7f42701b2ea40353a820
Cet article décrit comment obtenir la clé API à l'aide de JavaScript. En gros, c'est une méthode utilisant le grattage.
Je vois, grattage? Eh bien, embarrassant, je ne savais même pas ce qu'était le grattage. Après tout, je suis un débutant qui vient d'étudier le rubis par moi-même. J'ai donc cherché un moyen de gratter avec du rubis et suis arrivé sur le site suivant.
[Comprendre en 5 minutes] Expliquez les bases du grattage avec Ruby! https://www.sejuku.net/blog/13230
C'est le code créé de cette manière
equire 'open-uri'
require 'nokogiri' #Utilisé pour obtenir la clé API
url = "http://192.168.33.11/my/api_key"
charset = nil
html = open(url) do |page|
 charaset = page.charset
 page.read
end
contents = Nokogiri::HTML.parse(html,nil,charset)
apikey = contents.search("div[@class='box']").search('pre')
puts apikey
Eh bien, quand je le déplace réellement, il ne bouge pas. À la suite de diverses enquêtes, j'ai remarqué qu'il s'arrêtait à l'écran de connexion.
Cela signifie que vous devez créer un processus de connexion
Donc, comme d'habitude, je suis arrivé sur cette page en cherchant.
Connectez-vous avec Mechanize et grattez https://qiita.com/katsuyuki/items/1a78360988d96eec1d54
Je le comprends parfaitement.
agent = Mechanize.new
agent.user_agent = 'Mac Safari'
agent.get("http://#{adress}/my/api_key") do |page|
  response = page.form_with(:action => '/login') do |form|
    formdata = {
       :mail => mail,
       :password => password,
    }
    form.field_with(:name => 'username').value = formdata[:mail]
    form.field_with(:name => 'password').value = formdata[:password]
  end.submit
 end
 url = "http://#{adress}/my/api_key"
 html = agent.get("#{url}").content.toutf8
 contents = Nokogiri::HTML(html, nil, 'utf-8')
 apikey = contents.search("div[@class='box']").search('pre')
 puts apikey
Seule la partie supplémentaire a été extraite.
Au fait, concernant # {adresse}, il a dit: "Je teste localement maintenant, mais après cela, je l'exécuterai sur la société redmine et le client redmine."
require 'yaml' #Utilisé pour lire la configuration
set = YAML.load_file("config.yml")
puts set
adress = set["train"]["adress"]
puts adress
Il est possible de spécifier en saisissant l'adresse dans config.yml comme ceci.
résultat
> <pre>[APIkey]</pre>
Ce n'est pas bien.
stringkey = "#{apikey}"
stringkey.slice!("</pre>")
stringkey.slice!("<pre>")
puts "APIKey = #{stringkey}"
Immédiatement après l'ajout de cela, le processus d'acquisition de la clé API est terminé pour le moment.
En fait, je travaillais dessus en premier, mais que faire si ce n'était pas l'écran de connexion? Je ne sais pas si cela se produit, mais si c'est le cas, cela entraînera une erreur lors du processus de connexion.
page = RedmineController.new
pagetitle = page.Myaccount_access(adress)
puts "pagetitle = #{pagetitle}"
if pagetitle == "Paramètres personnels- redmine" then #Vérifiez si vous êtes connecté
     apikey = page.GetAPIkey(adress)
     puts "APIKey = #{apikey}"
else
     apikey = page.Login(adress,mail,password) 
end
Le titre de l'écran des paramètres personnels après la connexion était «Paramètres personnels --redmine», ce qui était donc pris en charge.
Une classe appelée RedmineContoroller est créée ici, et cette classe sera décrite plus tard.
Après cela, je l'ai essayé avec la mine rouge de l'entreprise et j'ai remarqué. La redmine de notre société est "Paramètres personnels - [Nom de la société] redmine". Lorsque j'ai vérifié, toutes les premières pages étaient "[nom de l'entreprise] redmine". En d'autres termes, cela semble être un style de "Paramètres personnels - [Nom de la page]". Traitons-y.
   page = RedmineController.new
   toptitle = page.toptitle(adress)
   pagetitle = page.Myaccount_access(adress)
   puts "pagetitle = #{pagetitle}"
   if pagetitle == "Paramètres personnels- #{toptitle}" then #Vérifiez si vous êtes connecté
     apikey = page.GetAPIkey(adress)
     puts "APIKey = #{apikey}"
   else
     apikey = page.Login(adress,mail,password) 
   end
C'est comme ça. En d'autres termes, c'est une stratégie pour saisir le premier titre en premier. Maintenant, publions la classe "RedmineController". Oui, je dois introduire la méthode toptitle deux fois car elle est gênante.
class RedmineController
 def toptitle(adress)
	url = "http://#{adress}/"
	charset = nil
	html = open(url) do |page|
	 charaset = page.charset
	 page.read
	end
	contents = Nokogiri::HTML.parse(html,nil,charset)
 return contents.title
 end
 def Myaccount_access(adress)
	url = "http://#{adress}/my/account"
	charset = nil
	html = open(url) do |page|
	 charaset = page.charset
	 page.read
	end
	contents = Nokogiri::HTML.parse(html,nil,charset)
 return contents.title
 end
 def Login(adress,mail,password)
	agent = Mechanize.new
	agent.user_agent = 'Mac Safari'
	agent.get("http://#{adress}/my/api_key") do |page|
	  response = page.form_with(:action => '/login') do |form|
	    formdata = {
	       :mail => mail,
	       :password => password,
	    }
	    form.field_with(:name => 'username').value = formdata[:mail]
	    form.field_with(:name => 'password').value = formdata[:password]
	  end.submit
	 end
	 url = "http://#{adress}/my/api_key"
	 html = agent.get("#{url}").content.toutf8
         contents = Nokogiri::HTML(html, nil, 'utf-8')
         apikey = contents.search("div[@class='box']").search('pre')
         stringkey = "#{apikey}"
	 stringkey.slice!("</pre>")
	 stringkey.slice!("<pre>")
	 puts "APIKey = #{stringkey}"
	 return stringkey
 end
 def GetAPIkey(adress)
        url = "http://#{adress}/my/api_key"
        charset = nil
        html = open(url) do |page|
         charaset = page.charset
         page.read
        end
        contents = Nokogiri::HTML.parse(html,nil,charset)
	apikey = contents.search("div[@class='box']").search('pre')
        stringkey = "#{apikey}"
	stringkey.slice!("</pre>")
	stringkey.slice!("<pre>")
	puts "APIKey = #{stringkey}"
	return stringkey
 end
end
Après cela, il est nécessaire de créer un processus pour faire quelque chose à l'aide de l'API, alors poussons le processus pour obtenir la clé API dans la méthode.
class Getter
 def APIKey_Getter(adress,mail,password)
   page = RedmineController.new
   toptitle = page.toptitle(adress)
   pagetitle = page.Myaccount_access(adress)
   puts "pagetitle = #{pagetitle}"
   if pagetitle == "Paramètres personnels- #{toptitle}" then #Vérifiez si vous êtes connecté
     apikey = page.GetAPIkey(adress)
     puts "APIKey = #{apikey}"
   else
     apikey = page.Login(adress,mail,password) 
   end
   return apikey
 end
À propos, après cela, j'ajoute maintenant des méthodes pour appeler diverses API à cette classe getter.
Complété avec ce qui précède. L'image entière est comme ça.
require 'open-uri'
require 'nokogiri' #Utilisé pour obtenir la clé API
require 'mechanize' #Utilisé pour la connexion
require 'yaml' #Utilisé pour lire la configuration
require 'io/console' #Utilisé pour l'abréviation de Pasoward
class RedmineController
 def toptitle(adress)
	url = "http://#{adress}/"
	charset = nil
	html = open(url) do |page|
	 charaset = page.charset
	 page.read
	end
	contents = Nokogiri::HTML.parse(html,nil,charset)
 return contents.title
 end
 def Myaccount_access(adress)
	url = "http://#{adress}/my/account"
	charset = nil
	html = open(url) do |page|
	 charaset = page.charset
	 page.read
	end
	contents = Nokogiri::HTML.parse(html,nil,charset)
 return contents.title
 end
 def Login(adress,mail,password)
	agent = Mechanize.new
	agent.user_agent = 'Mac Safari'
	agent.get("http://#{adress}/my/api_key") do |page|
	  response = page.form_with(:action => '/login') do |form|
	    formdata = {
	       :mail => mail,
	       :password => password,
	    }
	    form.field_with(:name => 'username').value = formdata[:mail]
	    form.field_with(:name => 'password').value = formdata[:password]
	  end.submit
	 end
	 url = "http://#{adress}/my/api_key"
	 html = agent.get("#{url}").content.toutf8
         contents = Nokogiri::HTML(html, nil, 'utf-8')
         apikey = contents.search("div[@class='box']").search('pre')
         stringkey = "#{apikey}"
	 stringkey.slice!("</pre>")
	 stringkey.slice!("<pre>")
	 puts "APIKey = #{stringkey}"
	 return stringkey
 end
 def GetAPIkey(adress)
        url = "http://#{adress}/my/api_key"
        charset = nil
        html = open(url) do |page|
         charaset = page.charset
         page.read
        end
        contents = Nokogiri::HTML.parse(html,nil,charset)
	apikey = contents.search("div[@class='box']").search('pre')
        stringkey = "#{apikey}"
	stringkey.slice!("</pre>")
	stringkey.slice!("<pre>")
	puts "APIKey = #{stringkey}"
	return stringkey
 end
end
class Getter
 def APIKey_Getter(adress,mail,password)
   page = RedmineController.new
   toptitle = page.toptitle(adress)
   pagetitle = page.Myaccount_access(adress)
   puts "pagetitle = #{pagetitle}"
   if pagetitle == "Paramètres personnels- #{toptitle}" then #Vérifiez si vous êtes connecté
     apikey = page.GetAPIkey(adress)
     puts "APIKey = #{apikey}"
   else
     apikey = page.Login(adress,mail,password) 
   end
   return apikey
 end
end
#Le traitement commence à partir d'ici. Recevez en fait des informations par get ou par courrier avec sinatra
puts "Veuillez saisir le nom de votre compte"
mail = gets
mail.chomp!
puts "Veuillez saisir le mot de passe (non affiché mais vous pouvez le saisir)"
password = STDIN.noecho(&:gets)
password.chomp!
#En fait, il n'est pas acquis à l'aide de gets, mais il est défini pour le moment. Finalement, toute cette plage disparaît
set = YAML.load_file("config.yml")
puts set
adress = set["train"]["adress"]
puts adress
f = Getter.new
apikey = f.APIKey_Getter(adress,mail,password) 
puts "APIKey = #{apikey}"
Merci pour votre patience.
Recommended Posts