diff --git a/process.rb b/process.rb index 8a862e1..21fe4bd 100644 --- a/process.rb +++ b/process.rb @@ -1,139 +1,141 @@ require 'httparty' require 'addressable' require 'mediawiki_api' # Legge le credenziali e la wiki di destinazione -if !File.exist? "#{__dir__}/.config" - puts 'Inserisci username:' - print '> ' - username = gets.chomp - puts 'Inserisci password:' - print '> ' - password = gets.chomp - puts 'Inserisci indirizzo API della wiki di provenienza (nella forma https://it.wikipedia.org/w/api.php)' - print '> ' - fromwiki = gets.chomp - puts 'Inserisci indirizzo API della wiki di destinazione (nella forma https://it.wikipedia.org/w/api.php)' - print '> ' - importwiki = gets.chomp - puts "Inserisci il prefisso interwiki della wiki di provenienza sulla wiki di destinazione, avendo cura di verificare che l'importazione sia abilitata per quel prefisso" - print '> ' - interwikiprefix = gets.chomp - puts "Inserisci la categoria che contiene le pagine da importare (l'importazione è ricorsiva)" - print '> ' - importcat = gets.chomp - File.open("#{__dir__}/.config", "w") do |file| - file.puts username - file.puts password - file.puts fromwiki - file.puts importwiki - file.puts interwikiprefix - file.puts importcat - end +unless File.exist? "#{__dir__}/.config" + puts 'Inserisci username:' + print '> ' + username = gets.chomp + puts 'Inserisci password:' + print '> ' + password = gets.chomp + puts 'Inserisci indirizzo API della wiki di provenienza (nella forma https://it.wikipedia.org/w/api.php)' + print '> ' + fromwiki = gets.chomp + puts 'Inserisci indirizzo API della wiki di destinazione (nella forma https://it.wikipedia.org/w/api.php)' + print '> ' + importwiki = gets.chomp + puts "Inserisci il prefisso interwiki della wiki di provenienza sulla wiki di destinazione, avendo cura di verificare che l'importazione sia abilitata per quel prefisso" + print '> ' + interwikiprefix = gets.chomp + puts "Inserisci la categoria che contiene le pagine da importare (l'importazione è ricorsiva)" + print '> ' + importcat = gets.chomp + File.open("#{__dir__}/.config", 'w') do |file| + file.puts username + file.puts password + file.puts fromwiki + file.puts importwiki + file.puts interwikiprefix + file.puts importcat + end end -userdata = File.open("#{__dir__}/.config", "r").to_a -userdata.map! {|d| d.gsub!("\n", "")} +userdata = File.open("#{__dir__}/.config", 'r').to_a +userdata.map! { |d| d.gsub!("\n", '') } fromwiki = userdata[2] importwiki = userdata[3] importcat = userdata[5] # Funzione per ottenere i membri della categoria def getcatmembers(cat, fromwiki) - pagelist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(cat)}&format=json&cmlimit=max", - uri_adapter: Addressable::URI).to_a - unless pagelist.empty? - if pagelist[2].nil? - pagelist = pagelist[1][1]['categorymembers'] + pagelist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(cat)}&format=json&cmlimit=max", + uri_adapter: Addressable::URI).to_a + unless pagelist.empty? + if pagelist[2].nil? + pagelist = pagelist[1][1]['categorymembers'] + else + cmcontinue = pagelist[1][1]['cmcontinue'] + continue = pagelist[1][1]['continue'] + pagelist = pagelist[2][1]['categorymembers'] + end + + unless pagelist.nil? + while continue == '-||' + puts 'Ottengo la continuazione della categoria...' + new_pagelist = HTTParty.get(fromwiki, + query: { action: :query, + list: :categorymembers, + cmtitle: CGI.escape(cat), + cmlimit: 500, + cmdir: :newer, + cmcontinue: cmcontinue, + format: :json }, + uri_adapter: Addressable::URI).to_a + next if new_pagelist.nil? + + if new_pagelist[2].nil? + new_pagelist = new_pagelist[1][1]['categorymembers'] + continue = false + @noph = true else - cmcontinue = pagelist[1][1]['cmcontinue'] - continue = pagelist[1][1]['continue'] - pagelist = pagelist[2][1]['categorymembers'] + cmcontinue = new_pagelist[1][1]['cmcontinue'] + continue = new_pagelist[1][1]['continue'] + new_pagelist = new_pagelist[2][1]['categorymembers'] end - - unless pagelist.nil? - while continue == '-||' - puts 'Ottengo la continuazione della categoria...' - new_pagelist = HTTParty.get(fromwiki, - query: {action: :query, - list: :categorymembers, - cmtitle: CGI.escape(cat), - cmlimit: 500, - cmdir: :newer, - cmcontinue: cmcontinue, - format: :json }, - uri_adapter: Addressable::URI).to_a - unless new_pagelist.nil? - if new_pagelist[2].nil? - new_pagelist = new_pagelist[1][1]['categorymembers'] - continue = false - @noph = true - else - cmcontinue = new_pagelist[1][1]['cmcontinue'] - continue = new_pagelist[1][1]['continue'] - new_pagelist = new_pagelist[2][1]['categorymembers'] - end - unless new_pagelist.nil? - puts 'Sommo le liste di foto...' - pagelist = pagelist += new_pagelist - end - end - end + unless new_pagelist.nil? + puts 'Sommo le liste di foto...' + pagelist = pagelist += new_pagelist end - return pagelist + end end + pagelist + end end # recupera la lista delle categorie con pagine da cancellare catlist = HTTParty.get("#{fromwiki}?action=query&list=categorymembers&cmtitle=#{CGI.escape(importcat)}&format=json&cmlimit=max", uri_adapter: Addressable::URI).to_a[2][1]['categorymembers'] -catlist.reject! { |cat| cat["ns"] != 14 } +catlist.reject! { |cat| cat['ns'] != 14 } totalcontain = [] catlist.each do |cat| - getcatmembers(cat["title"], fromwiki).each do |page| - totalcontain.push(page) - end + getcatmembers(cat['title'], fromwiki).each do |page| + totalcontain.push(page) + end end # Verifica e rientra nelle sottocategorie e nelle eventuali categorie più sommerse count = 0 -totalcontain.each { |tc| count += 1 if tc["ns"] == 14} -while(count > 0) - totalcontain.each do |tc| - if tc["ns"] == 14 - getcatmembers(tc["title"], fromwiki).each do |page| - totalcontain.push(page) - end - totalcontain.delete(tc) - end +totalcontain.each { |tc| count += 1 if tc['ns'] == 14 } +while count > 0 + totalcontain.each do |tc| + next unless tc['ns'] == 14 + + getcatmembers(tc['title'], fromwiki).each do |page| + totalcontain.push(page) end - count = 0 - totalcontain.each { |tc| count += 1 if tc["ns"] == 14} + totalcontain.delete(tc) + end + count = 0 + totalcontain.each { |tc| count += 1 if tc['ns'] == 14 } end # Effettua il login nell'api mediawiki client = MediawikiApi::Client.new importwiki -client.log_in "#{userdata[0]}", "#{userdata[1]}" +client.log_in (userdata[0]).to_s, (userdata[1]).to_s # Rimuove le voci già sul wiki dall'array -totalcontain.reject! { |page| client.query(list: :search, - srsearch: '"' + page["title"] + '"', - srlimit: 1, - srwhat: :title)["query"]["searchinfo"]["totalhits"] > 0} +totalcontain.reject! do |page| + client.query(list: :search, + srsearch: '"' + page['title'] + '"', + srlimit: 1, + srwhat: :title)['query']['searchinfo']['totalhits'] > 0 +end # Importa la voce nel wiki, funziona solo se c'è un interwiki a Wikipedia in Italiano con w, modificabile secondo necessità totalcontain.each do |page| - puts "Importo pagina #{page["title"]}" - begin - client.action(:import, - summary: "Importazione della pagina #{page["title"]} #CatImporterBot", - interwikiprefix: userdata[4], - interwikisource: userdata[4], - interwikipage: page["title"], - fullhistory: true, - templates: true) - rescue => e - puts e - puts "Pagina #{page["title"]} ha riscontrato un errore" - end + puts "Importo pagina #{page['title']}" + begin + client.action(:import, + summary: "Importazione della pagina #{page['title']} #CatImporterBot", + interwikiprefix: userdata[4], + interwikisource: userdata[4], + interwikipage: page['title'], + fullhistory: true, + templates: true) + rescue StandardError => e + puts e + puts "Pagina #{page['title']} ha riscontrato un errore" + end end